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