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;
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.
49f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert     */
50f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert    public QueryTask(String query, int queryLimit, SuggestionCursorProvider<C> provider,
51ecf356c15143ab0583c64682de16d94a57f7dd1cMathew Inwood            Handler handler, Consumer<C> consumer) {
52f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert        mQuery = query;
53f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert        mQueryLimit = queryLimit;
54f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert        mProvider = provider;
55f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert        mHandler = handler;
56f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert        mConsumer = consumer;
57f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert    }
58f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert
59ecf356c15143ab0583c64682de16d94a57f7dd1cMathew Inwood    @Override
60f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert    public String getName() {
61f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert        return mProvider.getName();
62f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert    }
63f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert
64ecf356c15143ab0583c64682de16d94a57f7dd1cMathew Inwood    @Override
65f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert    public void run() {
66ecf356c15143ab0583c64682de16d94a57f7dd1cMathew Inwood        final C cursor = mProvider.getSuggestions(mQuery, mQueryLimit);
67848fa7a19abedc372452073abaf52780c7b6d78dAmith Yamasani        if (DBG) Log.d(TAG, "Suggestions from " + mProvider + " = " + cursor);
68b42184f1e6a1b7bb22797ff92cae696753aca770Bjorn Bringert        Consumers.consumeCloseableAsync(mHandler, mConsumer, cursor);
69f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert    }
70f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert
71f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert    @Override
72f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert    public String toString() {
73f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert        return mProvider + "[" + mQuery + "]";
74f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert    }
75f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert
764572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood    public static <C extends SuggestionCursor> void startQuery(String query,
77ecf356c15143ab0583c64682de16d94a57f7dd1cMathew Inwood            int maxResults,
784572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood            SuggestionCursorProvider<C> provider,
794572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood            NamedTaskExecutor executor, Handler handler,
80ecf356c15143ab0583c64682de16d94a57f7dd1cMathew Inwood            Consumer<C> consumer) {
814572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood
82ecf356c15143ab0583c64682de16d94a57f7dd1cMathew Inwood        QueryTask<C> task = new QueryTask<C>(query, maxResults, provider, handler,
83ecf356c15143ab0583c64682de16d94a57f7dd1cMathew Inwood                consumer);
844572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood        executor.execute(task);
854572856ac85bb53ea06e65d00beebdf336af9b27Mathew Inwood    }
86f252dc7a25ba08b973ecc1cfbbce58eb78d42167Bjorn Bringert}
87