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