@Override public Sequence<T> apply(Query query) { return runner.run( queryPlus.withQuery(query), responseContext ); } }
final Sequence<Result<BySegmentResultValueClass<T>>> resultsBySegments = serverRunner.run( queryPlus .withQuery((Query<Result<BySegmentResultValueClass<T>>>) downstreamQuery) .withQuerySegmentSpec(segmentsOfServerSpec) .withMaxQueuedBytes(maxQueuedBytesPerServer),
@Override public Sequence<T> apply(DataSource singleSource) { return baseRunner.run( queryPlus.withQuery(query.withDataSource(singleSource)), responseContext ); } }
@Override public Sequence run(QueryPlus queryPlus, Map responseContext) { Query realQuery = getRealQuery(queryPlus.getQuery()); return warehouse.getToolChest(realQuery).mergeResults(runner).run(queryPlus.withQuery(realQuery), responseContext); } };
@Override public Sequence<Result<TimeseriesResultValue>> doRun( QueryRunner<Result<TimeseriesResultValue>> baseRunner, QueryPlus<Result<TimeseriesResultValue>> queryPlus, Map<String, Object> context ) { int limit = ((TimeseriesQuery) queryPlus.getQuery()).getLimit(); Sequence<Result<TimeseriesResultValue>> result = super.doRun( baseRunner, // Don't do post aggs until makePostComputeManipulatorFn() is called queryPlus.withQuery(((TimeseriesQuery) queryPlus.getQuery()).withPostAggregatorSpecs(ImmutableList.of())), context ); if (limit < Integer.MAX_VALUE) { return result.limit(limit); } return result; }
@Override public Sequence<T> run(final QueryPlus<T> queryPlus, Map<String, Object> responseContext) { DataSource dataSource = queryPlus.getQuery().getDataSource(); boolean forcePushDownNestedQuery = queryPlus.getQuery() .getContextBoolean( GroupByQueryConfig.CTX_KEY_FORCE_PUSH_DOWN_NESTED_QUERY, false ); if (dataSource instanceof QueryDataSource && !forcePushDownNestedQuery) { return run(queryPlus.withQuery((Query<T>) ((QueryDataSource) dataSource).getQuery()), responseContext); } else { QueryPlus newQuery = queryPlus; if (forcePushDownNestedQuery) { // Disable any more push downs before firing off the query. But do let the historical know // that it is executing the complete nested query and not just the inner most part of it newQuery = queryPlus.withQuery( queryPlus.getQuery() .withOverriddenContext( ImmutableMap.of( GroupByQueryConfig.CTX_KEY_FORCE_PUSH_DOWN_NESTED_QUERY, false, GroupByQueryConfig.CTX_KEY_EXECUTING_NESTED_QUERY, true ) ) ); } return baseRunner.run(newQuery, responseContext); } } }
@Override public Sequence run(QueryPlus queryPlus, Map responseContext) { Query realQuery = getRealQuery(queryPlus.getQuery()); QueryToolChest realQueryToolChest = warehouse.getToolChest(realQuery); QueryRunner realQueryRunner = realQueryToolChest.preMergeQueryDecoration( new MaterializedViewQueryRunner(runner, optimizer) ); return realQueryRunner.run(queryPlus.withQuery(realQuery), responseContext); } };
@Override public Sequence<ScanResultValue> run(QueryPlus<ScanResultValue> queryPlus, Map<String, Object> responseContext) { ScanQuery scanQuery = (ScanQuery) queryPlus.getQuery(); if (scanQuery.getFilter() != null) { scanQuery = scanQuery.withDimFilter(scanQuery.getFilter().optimize()); queryPlus = queryPlus.withQuery(scanQuery); } return runner.run(queryPlus, responseContext); } };
@Override public Sequence<Result<SearchResultValue>> run( QueryPlus<Result<SearchResultValue>> queryPlus, Map<String, Object> responseContext ) { SearchQuery searchQuery = (SearchQuery) queryPlus.getQuery(); if (searchQuery.getDimensionsFilter() != null) { searchQuery = searchQuery.withDimFilter(searchQuery.getDimensionsFilter().optimize()); queryPlus = queryPlus.withQuery(searchQuery); } return runner.run(queryPlus, responseContext); } },
@Override public Sequence<Result<SelectResultValue>> run( QueryPlus<Result<SelectResultValue>> queryPlus, Map<String, Object> responseContext ) { SelectQuery selectQuery = (SelectQuery) queryPlus.getQuery(); if (selectQuery.getDimensionsFilter() != null) { selectQuery = selectQuery.withDimFilter(selectQuery.getDimensionsFilter().optimize()); queryPlus = queryPlus.withQuery(selectQuery); } return runner.run(queryPlus, responseContext); } }, this);
@Override public QueryRunner<Result<TimeseriesResultValue>> preMergeQueryDecoration(final QueryRunner<Result<TimeseriesResultValue>> runner) { return intervalChunkingQueryRunnerDecorator.decorate( (queryPlus, responseContext) -> { TimeseriesQuery timeseriesQuery = (TimeseriesQuery) queryPlus.getQuery(); if (timeseriesQuery.getDimensionsFilter() != null) { timeseriesQuery = timeseriesQuery.withDimFilter(timeseriesQuery.getDimensionsFilter().optimize()); queryPlus = queryPlus.withQuery(timeseriesQuery); } return runner.run(queryPlus, responseContext); }, this); }
@Override public Sequence<ScanResultValue> run( final QueryPlus<ScanResultValue> queryPlus, final Map<String, Object> responseContext ) { // Ensure "legacy" is a non-null value, such that all other nodes this query is forwarded to will treat it // the same way, even if they have different default legacy values. final ScanQuery scanQuery = ((ScanQuery) queryPlus.getQuery()).withNonNullLegacy(scanQueryConfig); final QueryPlus<ScanResultValue> queryPlusWithNonNullLegacy = queryPlus.withQuery(scanQuery); if (scanQuery.getLimit() == Long.MAX_VALUE) { return runner.run(queryPlusWithNonNullLegacy, responseContext); } return new BaseSequence<>( new BaseSequence.IteratorMaker<ScanResultValue, ScanQueryLimitRowIterator>() { @Override public ScanQueryLimitRowIterator make() { return new ScanQueryLimitRowIterator(runner, queryPlusWithNonNullLegacy, responseContext); } @Override public void cleanup(ScanQueryLimitRowIterator iterFromMake) { CloseQuietly.close(iterFromMake); } } ); } };
queryPlus.withQuery(delegateGroupByQuery.withDimensionSpecs(dimensionSpecs)), responseContext );
@Override public Sequence<SegmentAnalysis> doRun( QueryRunner<SegmentAnalysis> baseRunner, QueryPlus<SegmentAnalysis> queryPlus, Map<String, Object> context ) { SegmentMetadataQuery updatedQuery = ((SegmentMetadataQuery) queryPlus.getQuery()).withFinalizedAnalysisTypes(config); QueryPlus<SegmentAnalysis> updatedQueryPlus = queryPlus.withQuery(updatedQuery); return new MappedSequence<>( CombiningSequence.create( baseRunner.run(updatedQueryPlus, context), makeOrdering(updatedQuery), createMergeFn(updatedQuery) ), MERGE_TRANSFORM_FN::apply ); }
@Override public Sequence<Result<TopNResultValue>> run( QueryPlus<Result<TopNResultValue>> queryPlus, Map<String, Object> responseContext ) { TopNQuery topNQuery = (TopNQuery) queryPlus.getQuery(); if (topNQuery.getDimensionsFilter() != null) { topNQuery = topNQuery.withDimFilter(topNQuery.getDimensionsFilter().optimize()); } final TopNQuery delegateTopNQuery = topNQuery; if (TopNQueryEngine.canApplyExtractionInPost(delegateTopNQuery)) { final DimensionSpec dimensionSpec = delegateTopNQuery.getDimensionSpec(); QueryPlus<Result<TopNResultValue>> delegateQueryPlus = queryPlus.withQuery( delegateTopNQuery.withDimensionSpec( new DefaultDimensionSpec( dimensionSpec.getDimension(), dimensionSpec.getOutputName() ) ) ); return runner.run(delegateQueryPlus, responseContext); } else { return runner.run(queryPlus.withQuery(delegateTopNQuery), responseContext); } } },
final TimeseriesQuery query = (TimeseriesQuery) queryPlus.getQuery(); final Sequence<Result<TimeseriesResultValue>> baseResults = resultMergeQueryRunner.run( queryPlus.withQuery( queryPlus.getQuery() .withOverriddenContext(
baseRunner.run(queryPlus.withQuery(queryToRun), responseContext), finalizerFn );
); final QueryPlus<Row> queryPlusForRunners = queryPlus .withQuery( query.withOverriddenContext(ImmutableMap.of(CTX_KEY_MERGE_RUNNERS_USING_CHAINED_EXECUTION, true))
runner.run(queryPlus.withQuery(query.withThreshold(minTopNThreshold)), responseContext), new Function<Result<TopNResultValue>, Result<TopNResultValue>>()
runner.run(queryPlus.withQuery(query.withLimit(config.getMaxSearchLimit())), responseContext), new Function<Result<SearchResultValue>, Result<SearchResultValue>>()