public BlurResultIterable query(final String table, final BlurQuery blurQuery, AtomicLongArray facetedCounts)
throws Exception {
boolean runSlow = DEBUG_RUN_SLOW.get();
final AtomicBoolean running = new AtomicBoolean(true);
final QueryStatus status = _statusManager.newQueryStatus(table, blurQuery, _threadCount, running);
_queriesExternalMeter.mark();
try {
Map<String, BlurIndex> blurIndexes;
try {
blurIndexes = _indexServer.getIndexes(table);
} catch (IOException e) {
LOG.error("Unknown error while trying to fetch index readers.", e);
throw new BException(e.getMessage(), e);
}
ShardServerContext shardServerContext = ShardServerContext.getShardServerContext();
ParallelCall<Entry<String, BlurIndex>, BlurResultIterable> call;
TableContext context = getTableContext(table);
FieldManager fieldManager = context.getFieldManager();
org.apache.blur.thrift.generated.Query simpleQuery = blurQuery.query;
Filter preFilter = QueryParserUtil.parseFilter(table, simpleQuery.recordFilter, false, fieldManager,
_filterCache, context);
Filter postFilter = QueryParserUtil.parseFilter(table, simpleQuery.rowFilter, true, fieldManager, _filterCache,
context);
Query userQuery = QueryParserUtil.parseQuery(simpleQuery.query, simpleQuery.rowQuery, fieldManager, postFilter,
preFilter, getScoreType(simpleQuery.scoreType), context);
Query facetedQuery = getFacetedQuery(blurQuery, userQuery, facetedCounts, fieldManager, context, postFilter,
preFilter);
call = new SimpleQueryParallelCall(running, table, status, _indexServer, facetedQuery, blurQuery.selector,
_queriesInternalMeter, shardServerContext, runSlow, _fetchCount, _maxHeapPerRowFetch);
MergerBlurResultIterable merger = new MergerBlurResultIterable(blurQuery);
return ForkJoin.execute(_executor, blurIndexes.entrySet(), call, new Cancel() {
@Override
public void cancel() {
running.set(false);
}
}).merge(merger);
} catch (StopExecutionCollectorException e) {
BlurQueryStatus queryStatus = status.getQueryStatus();
QueryState state = queryStatus.getState();
if (state == QueryState.BACK_PRESSURE_INTERRUPTED) {
throw new BlurException("Cannot execute query right now.", null, ErrorType.BACK_PRESSURE);
} else if (state == QueryState.INTERRUPTED) {
throw new BlurException("Cannot execute query right now.", null, ErrorType.QUERY_CANCEL);
}
throw e;
} catch (ExitingReaderException e) {
BlurQueryStatus queryStatus = status.getQueryStatus();
QueryState state = queryStatus.getState();
if (state == QueryState.BACK_PRESSURE_INTERRUPTED) {
throw new BlurException("Cannot execute query right now.", null, ErrorType.BACK_PRESSURE);
} else if (state == QueryState.INTERRUPTED) {
throw new BlurException("Cannot execute query right now.", null, ErrorType.QUERY_CANCEL);