Search in sources :

Example 1 with Capabilities

use of io.druid.segment.Capabilities in project druid by druid-io.

the class TopNQueryEngine method getMapFn.

private Function<Cursor, Result<TopNResultValue>> getMapFn(TopNQuery query, final StorageAdapter adapter) {
    final Capabilities capabilities = adapter.getCapabilities();
    final String dimension = query.getDimensionSpec().getDimension();
    final int cardinality = adapter.getDimensionCardinality(dimension);
    int numBytesPerRecord = 0;
    for (AggregatorFactory aggregatorFactory : query.getAggregatorSpecs()) {
        numBytesPerRecord += aggregatorFactory.getMaxIntermediateSize();
    }
    final TopNAlgorithmSelector selector = new TopNAlgorithmSelector(cardinality, numBytesPerRecord);
    query.initTopNAlgorithmSelector(selector);
    final ColumnCapabilities columnCapabilities = query.getVirtualColumns().getColumnCapabilitiesWithFallback(adapter, dimension);
    final TopNAlgorithm topNAlgorithm;
    if (selector.isHasExtractionFn() && // that the column is of type long and single-value.
    dimension.equals(Column.TIME_COLUMN_NAME)) {
        // A special TimeExtractionTopNAlgorithm is required, since DimExtractionTopNAlgorithm
        // currently relies on the dimension cardinality to support lexicographic sorting
        topNAlgorithm = new TimeExtractionTopNAlgorithm(capabilities, query);
    } else if (selector.isHasExtractionFn()) {
        topNAlgorithm = new DimExtractionTopNAlgorithm(capabilities, query);
    } else if (columnCapabilities != null && columnCapabilities.getType() != ValueType.STRING) {
        // force non-Strings to use DimExtraction for now, do a typed PooledTopN later
        topNAlgorithm = new DimExtractionTopNAlgorithm(capabilities, query);
    } else if (selector.isAggregateAllMetrics()) {
        topNAlgorithm = new PooledTopNAlgorithm(capabilities, query, bufferPool);
    } else if (selector.isAggregateTopNMetricFirst() || query.getContextBoolean("doAggregateTopNMetricFirst", false)) {
        topNAlgorithm = new AggregateTopNMetricFirstAlgorithm(capabilities, query, bufferPool);
    } else {
        topNAlgorithm = new PooledTopNAlgorithm(capabilities, query, bufferPool);
    }
    return new TopNMapFn(query, topNAlgorithm);
}
Also used : ColumnCapabilities(io.druid.segment.column.ColumnCapabilities) Capabilities(io.druid.segment.Capabilities) AggregatorFactory(io.druid.query.aggregation.AggregatorFactory) ColumnCapabilities(io.druid.segment.column.ColumnCapabilities)

Aggregations

AggregatorFactory (io.druid.query.aggregation.AggregatorFactory)1 Capabilities (io.druid.segment.Capabilities)1 ColumnCapabilities (io.druid.segment.column.ColumnCapabilities)1