1f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert/* 2f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * Copyright (C) 2009 The Android Open Source Project 3f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * 4f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 5f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * you may not use this file except in compliance with the License. 6f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * You may obtain a copy of the License at 7f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * 8f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 9f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * 10f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * Unless required by applicable law or agreed to in writing, software 11f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 12f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * See the License for the specific language governing permissions and 14f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * limitations under the License. 15f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert */ 16f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert 17f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringertpackage com.android.quicksearchbox; 18f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert 19f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringertimport com.android.quicksearchbox.util.Consumer; 20b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringertimport com.android.quicksearchbox.util.Consumers; 21f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringertimport com.android.quicksearchbox.util.NamedTask; 22f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringertimport com.android.quicksearchbox.util.NamedTaskExecutor; 23f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert 24f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringertimport android.os.Handler; 25848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasaniimport android.util.Log; 26f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert 27f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert/** 28f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * A task that gets suggestions from a corpus. 29f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert */ 30f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringertpublic class QueryTask<C extends SuggestionCursor> implements NamedTask { 31848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani private static final String TAG = "QSB.QueryTask"; 32848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani private static final boolean DBG = false; 33848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 34f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert private final String mQuery; 35f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert private final int mQueryLimit; 36f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert private final SuggestionCursorProvider<C> mProvider; 37f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert private final Handler mHandler; 38f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert private final Consumer<C> mConsumer; 39cd1e3ba5f7c3f5242345ff6f674281e3d6366e24Mathew Inwood private final boolean mTheOnlyOne; 40f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert 41f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert /** 42f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * Creates a new query task. 43f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * 44f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * @param query Query to run. 45f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * @param queryLimit The number of suggestions to ask each provider for. 46f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * @param provider The provider to ask for suggestions. 47f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * @param handler Handler that {@link Consumer#consume} will 48f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * get called on. If null, the method is called on the query thread. 49f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * @param consumer Consumer to notify when the suggestions have been returned. 50cd1e3ba5f7c3f5242345ff6f674281e3d6366e24Mathew Inwood * @param onlyTask Indicates if this is the only task within a batch. 51f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert */ 52f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert public QueryTask(String query, int queryLimit, SuggestionCursorProvider<C> provider, 53cd1e3ba5f7c3f5242345ff6f674281e3d6366e24Mathew Inwood Handler handler, Consumer<C> consumer, boolean onlyTask) { 54f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert mQuery = query; 55f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert mQueryLimit = queryLimit; 56f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert mProvider = provider; 57f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert mHandler = handler; 58f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert mConsumer = consumer; 59cd1e3ba5f7c3f5242345ff6f674281e3d6366e24Mathew Inwood mTheOnlyOne = onlyTask; 60f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert } 61f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert 62f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert public String getName() { 63f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert return mProvider.getName(); 64f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert } 65f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert 66f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert public void run() { 67cd1e3ba5f7c3f5242345ff6f674281e3d6366e24Mathew Inwood final C cursor = mProvider.getSuggestions(mQuery, mQueryLimit, mTheOnlyOne); 68848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani if (DBG) Log.d(TAG, "Suggestions from " + mProvider + " = " + cursor); 69b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert Consumers.consumeCloseableAsync(mHandler, mConsumer, cursor); 70f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert } 71f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert 72f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert @Override 73f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert public String toString() { 74f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert return mProvider + "[" + mQuery + "]"; 75f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert } 76f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert 77f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert public static <C extends SuggestionCursor> void startQueries(String query, 78f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert int maxResultsPerProvider, 79f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert Iterable<? extends SuggestionCursorProvider<C>> providers, 80f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert NamedTaskExecutor executor, Handler handler, 81cd1e3ba5f7c3f5242345ff6f674281e3d6366e24Mathew Inwood Consumer<C> consumer, boolean onlyOneProvider) { 82cd1e3ba5f7c3f5242345ff6f674281e3d6366e24Mathew Inwood 83f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert for (SuggestionCursorProvider<C> provider : providers) { 844572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood QueryTask.startQuery(query, maxResultsPerProvider, provider, 854572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood executor, handler, consumer, onlyOneProvider); 86f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert } 87f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert } 88f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert 894572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood public static <C extends SuggestionCursor> void startQuery(String query, 904572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood int maxResultsPerProvider, 914572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood SuggestionCursorProvider<C> provider, 924572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood NamedTaskExecutor executor, Handler handler, 934572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood Consumer<C> consumer, boolean onlyOneProvider) { 944572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood 954572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood QueryTask<C> task = new QueryTask<C>(query, maxResultsPerProvider, provider, handler, 964572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood consumer, onlyOneProvider); 974572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood executor.execute(task); 984572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood } 99f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert} 100