QueryTask.java revision 4572856ac85bb53ea06e65d00beebdf336af9b27
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; 20f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringertimport com.android.quicksearchbox.util.NamedTask; 21f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringertimport com.android.quicksearchbox.util.NamedTaskExecutor; 22f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert 23f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringertimport android.os.Handler; 24848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasaniimport android.util.Log; 25f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert 26f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert/** 27f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * A task that gets suggestions from a corpus. 28f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert */ 29f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringertpublic class QueryTask<C extends SuggestionCursor> implements NamedTask { 30848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani private static final String TAG = "QSB.QueryTask"; 31848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani private static final boolean DBG = false; 32848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani 33f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert private final String mQuery; 34f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert private final int mQueryLimit; 35f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert private final SuggestionCursorProvider<C> mProvider; 36f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert private final Handler mHandler; 37f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert private final Consumer<C> mConsumer; 38cd1e3ba5f7c3f5242345ff6f674281e3d6366e24Mathew Inwood private final boolean mTheOnlyOne; 39f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert 40f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert /** 41f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * Creates a new query task. 42f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * 43f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * @param query Query to run. 44f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * @param queryLimit The number of suggestions to ask each provider for. 45f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * @param provider The provider to ask for suggestions. 46f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * @param handler Handler that {@link Consumer#consume} will 47f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * get called on. If null, the method is called on the query thread. 48f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert * @param consumer Consumer to notify when the suggestions have been returned. 49cd1e3ba5f7c3f5242345ff6f674281e3d6366e24Mathew Inwood * @param onlyTask Indicates if this is the only task within a batch. 50f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert */ 51f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert public QueryTask(String query, int queryLimit, SuggestionCursorProvider<C> provider, 52cd1e3ba5f7c3f5242345ff6f674281e3d6366e24Mathew Inwood Handler handler, Consumer<C> consumer, boolean onlyTask) { 53f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert mQuery = query; 54f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert mQueryLimit = queryLimit; 55f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert mProvider = provider; 56f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert mHandler = handler; 57f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert mConsumer = consumer; 58cd1e3ba5f7c3f5242345ff6f674281e3d6366e24Mathew Inwood mTheOnlyOne = onlyTask; 59f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert } 60f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert 61f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert public String getName() { 62f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert return mProvider.getName(); 63f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert } 64f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert 65f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert public void run() { 66cd1e3ba5f7c3f5242345ff6f674281e3d6366e24Mathew Inwood final C cursor = mProvider.getSuggestions(mQuery, mQueryLimit, mTheOnlyOne); 67848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani if (DBG) Log.d(TAG, "Suggestions from " + mProvider + " = " + cursor); 68f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert if (mHandler == null) { 69f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert mConsumer.consume(cursor); 70f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert } else { 71f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert mHandler.post(new Runnable() { 72f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert public void run() { 73f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert boolean accepted = mConsumer.consume(cursor); 74f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert if (!accepted) { 75f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert cursor.close(); 76f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert } 77f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert } 78f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert }); 79f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert } 80f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert } 81f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert 82f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert @Override 83f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert public String toString() { 84f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert return mProvider + "[" + mQuery + "]"; 85f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert } 86f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert 87f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert public static <C extends SuggestionCursor> void startQueries(String query, 88f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert int maxResultsPerProvider, 89f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert Iterable<? extends SuggestionCursorProvider<C>> providers, 90f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert NamedTaskExecutor executor, Handler handler, 91cd1e3ba5f7c3f5242345ff6f674281e3d6366e24Mathew Inwood Consumer<C> consumer, boolean onlyOneProvider) { 92cd1e3ba5f7c3f5242345ff6f674281e3d6366e24Mathew Inwood 93f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert for (SuggestionCursorProvider<C> provider : providers) { 944572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood QueryTask.startQuery(query, maxResultsPerProvider, provider, 954572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood executor, handler, consumer, onlyOneProvider); 96f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert } 97f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert } 98f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert 994572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood public static <C extends SuggestionCursor> void startQuery(String query, 1004572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood int maxResultsPerProvider, 1014572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood SuggestionCursorProvider<C> provider, 1024572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood NamedTaskExecutor executor, Handler handler, 1034572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood Consumer<C> consumer, boolean onlyOneProvider) { 1044572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood 1054572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood QueryTask<C> task = new QueryTask<C>(query, maxResultsPerProvider, provider, handler, 1064572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood consumer, onlyOneProvider); 1074572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood executor.execute(task); 1084572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood } 109f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert} 110