/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.quicksearchbox; import com.android.quicksearchbox.util.Consumer; import com.android.quicksearchbox.util.Consumers; import com.android.quicksearchbox.util.NamedTask; import com.android.quicksearchbox.util.NamedTaskExecutor; import android.os.Handler; import android.util.Log; /** * A task that gets suggestions from a corpus. */ public class QueryTask<C extends SuggestionCursor> implements NamedTask { private static final String TAG = "QSB.QueryTask"; private static final boolean DBG = false; private final String mQuery; private final int mQueryLimit; private final SuggestionCursorProvider<C> mProvider; private final Handler mHandler; private final Consumer<C> mConsumer; private final boolean mTheOnlyOne; /** * Creates a new query task. * * @param query Query to run. * @param queryLimit The number of suggestions to ask each provider for. * @param provider The provider to ask for suggestions. * @param handler Handler that {@link Consumer#consume} will * get called on. If null, the method is called on the query thread. * @param consumer Consumer to notify when the suggestions have been returned. * @param onlyTask Indicates if this is the only task within a batch. */ public QueryTask(String query, int queryLimit, SuggestionCursorProvider<C> provider, Handler handler, Consumer<C> consumer, boolean onlyTask) { mQuery = query; mQueryLimit = queryLimit; mProvider = provider; mHandler = handler; mConsumer = consumer; mTheOnlyOne = onlyTask; } public String getName() { return mProvider.getName(); } public void run() { final C cursor = mProvider.getSuggestions(mQuery, mQueryLimit, mTheOnlyOne); if (DBG) Log.d(TAG, "Suggestions from " + mProvider + " = " + cursor); Consumers.consumeCloseableAsync(mHandler, mConsumer, cursor); } @Override public String toString() { return mProvider + "[" + mQuery + "]"; } public static <C extends SuggestionCursor> void startQueries(String query, int maxResultsPerProvider, Iterable<? extends SuggestionCursorProvider<C>> providers, NamedTaskExecutor executor, Handler handler, Consumer<C> consumer, boolean onlyOneProvider) { for (SuggestionCursorProvider<C> provider : providers) { QueryTask.startQuery(query, maxResultsPerProvider, provider, executor, handler, consumer, onlyOneProvider); } } public static <C extends SuggestionCursor> void startQuery(String query, int maxResultsPerProvider, SuggestionCursorProvider<C> provider, NamedTaskExecutor executor, Handler handler, Consumer<C> consumer, boolean onlyOneProvider) { QueryTask<C> task = new QueryTask<C>(query, maxResultsPerProvider, provider, handler, consumer, onlyOneProvider); executor.execute(task); } }