@Override public TopNParams makeInitParams(ColumnSelectorPlus selectorPlus, Cursor cursor) { return new TopNParams(selectorPlus, cursor, Integer.MAX_VALUE); }
@Override protected long scanAndAggregate(TopNParams params, int[] dimValSelector, Map<String, Aggregator[]> aggregatesStore) { if (params.getCardinality() < 0) { throw new UnsupportedOperationException("Cannot operate on a dimension with unknown cardinality"); } final Cursor cursor = params.getCursor(); final DimensionSelector dimSelector = params.getDimSelector(); long processedRows = 0; while (!cursor.isDone()) { final String key = dimSelector.lookupName(dimSelector.getRow().get(0)); Aggregator[] theAggregators = aggregatesStore.get(key); if (theAggregators == null) { theAggregators = makeAggregators(cursor, query.getAggregatorSpecs()); aggregatesStore.put(key, theAggregators); } for (Aggregator aggregator : theAggregators) { aggregator.aggregate(); } cursor.advance(); processedRows++; } return processedRows; }
@Override protected Aggregator[][] makeDimValSelector(TopNParams params, int numProcessed, int numToProcess) { if (params.getCardinality() < 0) { throw new UnsupportedOperationException("Cannot operate on a dimension with unknown cardinality"); } ColumnSelectorPlus<TopNColumnSelectorStrategy> selectorPlus = params.getSelectorPlus(); return selectorPlus.getColumnSelectorStrategy().getDimExtractionRowSelector(query, params, storageAdapter); }
@Override public long scanAndAggregate( TopNParams params, Aggregator[][] rowSelector, Map<Comparable, Aggregator[]> aggregatesStore ) { final Cursor cursor = params.getCursor(); final ColumnSelectorPlus<TopNColumnSelectorStrategy> selectorPlus = params.getSelectorPlus(); return selectorPlus.getColumnSelectorStrategy().dimExtractionScanAndAggregate( query, selectorPlus.getSelector(), cursor, rowSelector, aggregatesStore ); }
int cardinality = params.getCardinality(); int numProcessed = 0; long processedRows = 0; while (numProcessed < cardinality) { final int numToProcess; int maxNumToProcess = Math.min(params.getNumValuesPerPass(), cardinality - numProcessed); params.getCursor().reset();
@Override protected Map<Comparable, Aggregator[]> makeDimValAggregateStore(TopNParams params) { final ColumnSelectorPlus<TopNColumnSelectorStrategy> selectorPlus = params.getSelectorPlus(); return selectorPlus.getColumnSelectorStrategy().makeDimExtractionAggregateStore(); }
private int[] getDimValSelectorForTopNMetric(TopNParams params, TopNResultBuilder resultBuilder) { if (params.getCardinality() < 0) { throw new UnsupportedOperationException("Cannot operate on a dimension with unknown cardinality"); } int[] dimValSelector = new int[params.getCardinality()]; Arrays.fill(dimValSelector, SKIP_POSITION_VALUE); Iterator<DimValHolder> dimValIter = resultBuilder.getTopNIterator(); while (dimValIter.hasNext()) { int dimValIndex = (Integer) dimValIter.next().getDimValIndex(); dimValSelector[dimValIndex] = INIT_POSITION_VALUE; } return dimValSelector; } }
/** * This function currently handles TopNs on long and float columns, which do not provide cardinality or an ID lookup. * When cardinality is unknown, process everything in one pass. * Existing implementations of makeDimValSelector() require cardinality as well, so the DimValSelector is not used. * * @param params TopN parameters from run() * @param resultBuilder Result builder from run() */ private void runWithCardinalityUnknown( Parameters params, TopNResultBuilder resultBuilder, @Nullable TopNQueryMetrics queryMetrics ) { DimValAggregateStore aggregatesStore = makeDimValAggregateStore(params); if (queryMetrics != null) { queryMetrics.startRecordingScanTime(); } long processedRows = scanAndAggregate(params, null, aggregatesStore); updateResults(params, null, aggregatesStore, resultBuilder); closeAggregators(aggregatesStore); params.getCursor().reset(); if (queryMetrics != null) { queryMetrics.addProcessedRows(processedRows); queryMetrics.stopRecordingScanTime(); } }
int cardinality = params.getCardinality(); int numProcessed = 0; long processedRows = 0; while (numProcessed < cardinality) { final int numToProcess; int maxNumToProcess = Math.min(params.getNumValuesPerPass(), cardinality - numProcessed); params.getCursor().reset();
int[] dimValSelector; try { singleMetricParam = singleMetricAlgo.makeInitParams(params.getSelectorPlus(), params.getCursor()); singleMetricAlgo.run( singleMetricParam, try { allMetricsParam = allMetricAlgo.makeInitParams(params.getSelectorPlus(), params.getCursor()); allMetricAlgo.run( allMetricsParam,
@Override protected void updateResults( TopNParams params, Aggregator[][] rowSelector, Map<Comparable, Aggregator[]> aggregatesStore, TopNResultBuilder resultBuilder ) { final ColumnSelectorPlus<TopNColumnSelectorStrategy> selectorPlus = params.getSelectorPlus(); selectorPlus.getColumnSelectorStrategy().updateDimExtractionResults( aggregatesStore, resultBuilder ); }
@Override public void run( Parameters params, TopNResultBuilder resultBuilder, DimValSelector dimValSelector, @Nullable TopNQueryMetrics queryMetrics ) { if (params.getCardinality() != TopNColumnSelectorStrategy.CARDINALITY_UNKNOWN) { runWithCardinalityKnown(params, resultBuilder, dimValSelector, queryMetrics); } else { runWithCardinalityUnknown(params, resultBuilder, queryMetrics); } }
public static TopNResultBuilder makeResultBuilder(TopNParams params, TopNQuery query) { final Comparator comparator = query.getTopNMetricSpec() .getComparator(query.getAggregatorSpecs(), query.getPostAggregatorSpecs()); return query.getTopNMetricSpec().getResultBuilder( params.getCursor().getTime(), query.getDimensionSpec(), query.getThreshold(), comparator, query.getAggregatorSpecs(), query.getPostAggregatorSpecs() ); } }
@Override protected long scanAndAggregate( TopNParams params, int[] dimValSelector, Map<String, Aggregator[]> aggregatesStore ) { if (params.getCardinality() < 0) { throw new UnsupportedOperationException("Cannot operate on a dimension with unknown cardinality"); } final Cursor cursor = params.getCursor(); final DimensionSelector dimSelector = params.getDimSelector(); long processedRows = 0; while (!cursor.isDone()) { final String key = dimSelector.lookupName(dimSelector.getRow().get(0)); Aggregator[] theAggregators = aggregatesStore.get(key); if (theAggregators == null) { theAggregators = makeAggregators(cursor, query.getAggregatorSpecs()); aggregatesStore.put(key, theAggregators); } for (Aggregator aggregator : theAggregators) { aggregator.aggregate(); } cursor.advance(); processedRows++; } return processedRows; }
@Override public Aggregator[][] getDimExtractionRowSelector(TopNQuery query, TopNParams params, StorageAdapter storageAdapter) { if (params.getCardinality() < 0) { throw new UnsupportedOperationException("Cannot operate on a dimension with unknown cardinality"); } // This method is used for the DimExtractionTopNAlgorithm only. // Unlike regular topN we cannot rely on ordering to optimize. // Optimization possibly requires a reverse lookup from value to ID, which is // not possible when applying an extraction function final BaseTopNAlgorithm.AggregatorArrayProvider provider = new BaseTopNAlgorithm.AggregatorArrayProvider( (DimensionSelector) params.getSelectorPlus().getSelector(), query, params.getCardinality(), storageAdapter ); return provider.build(); }
@Override public long scanAndAggregate( TopNParams params, Aggregator[][] rowSelector, Map<Comparable, Aggregator[]> aggregatesStore ) { final Cursor cursor = params.getCursor(); final ColumnSelectorPlus<TopNColumnSelectorStrategy> selectorPlus = params.getSelectorPlus(); return selectorPlus.getColumnSelectorStrategy().dimExtractionScanAndAggregate( query, selectorPlus.getSelector(), cursor, rowSelector, aggregatesStore ); }
@Override public TopNParams makeInitParams(ColumnSelectorPlus selectorPlus, Cursor cursor) { return new TopNParams( selectorPlus, cursor, Integer.MAX_VALUE ); }
@Override protected Map<Comparable, Aggregator[]> makeDimValAggregateStore(TopNParams params) { final ColumnSelectorPlus<TopNColumnSelectorStrategy> selectorPlus = params.getSelectorPlus(); return selectorPlus.getColumnSelectorStrategy().makeDimExtractionAggregateStore(); }
private int[] getDimValSelectorForTopNMetric(TopNParams params, TopNResultBuilder resultBuilder) { if (params.getCardinality() < 0) { throw new UnsupportedOperationException("Cannot operate on a dimension with unknown cardinality"); } int[] dimValSelector = new int[params.getCardinality()]; Arrays.fill(dimValSelector, SKIP_POSITION_VALUE); Iterator<DimValHolder> dimValIter = resultBuilder.getTopNIterator(); while (dimValIter.hasNext()) { int dimValIndex = (Integer) dimValIter.next().getDimValIndex(); dimValSelector[dimValIndex] = INIT_POSITION_VALUE; } return dimValSelector; } }
/** * This function currently handles TopNs on long and float columns, which do not provide cardinality or an ID lookup. * When cardinality is unknown, process everything in one pass. * Existing implementations of makeDimValSelector() require cardinality as well, so the DimValSelector is not used. * * @param params TopN parameters from run() * @param resultBuilder Result builder from run() */ private void runWithCardinalityUnknown( Parameters params, TopNResultBuilder resultBuilder, @Nullable TopNQueryMetrics queryMetrics ) { DimValAggregateStore aggregatesStore = makeDimValAggregateStore(params); if (queryMetrics != null) { queryMetrics.startRecordingScanTime(); } long processedRows = scanAndAggregate(params, null, aggregatesStore); updateResults(params, null, aggregatesStore, resultBuilder); closeAggregators(aggregatesStore); params.getCursor().reset(); if (queryMetrics != null) { queryMetrics.addProcessedRows(processedRows); queryMetrics.stopRecordingScanTime(); } }