@Test public void cleanup() { PooledTopNAlgorithm pooledTopNAlgorithm = new PooledTopNAlgorithm(EasyMock.mock(StorageAdapter.class), null, null); PooledTopNAlgorithm.PooledTopNParams params = EasyMock.createMock(PooledTopNAlgorithm.PooledTopNParams.class); ResourceHolder<ByteBuffer> resourceHolder = EasyMock.createMock(ResourceHolder.class); EasyMock.expect(params.getResultsBufHolder()).andReturn(resourceHolder).times(1); EasyMock.expect(resourceHolder.get()).andReturn(ByteBuffer.allocate(1)).times(1); resourceHolder.close(); EasyMock.expectLastCall().once(); EasyMock.replay(params); EasyMock.replay(resourceHolder); pooledTopNAlgorithm.cleanup(params); EasyMock.verify(params); EasyMock.verify(resourceHolder); } }
return PooledTopNParams.builder() .withSelectorPlus(selectorPlus) .withCursor(cursor)
private static long scanAndAggregateHistorical1SimpleDoubleAgg( PooledTopNParams params, int[] positions, SimpleDoubleBufferAggregator aggregator, HistoricalCursor cursor, Historical1AggPooledTopNScanner prototypeScanner ) { String runtimeShape = StringRuntimeShape.of(aggregator); SpecializationState<Historical1AggPooledTopNScanner> specializationState = SpecializationService.getSpecializationState( prototypeScanner.getClass(), runtimeShape, ImmutableMap.of(Offset.class, cursor.getOffset().getClass()) ); Historical1AggPooledTopNScanner scanner = specializationState.getSpecializedOrDefault(prototypeScanner); long processedRows = scanner.scanAndAggregate( (HistoricalDimensionSelector) params.getDimSelector(), aggregator.getSelector(), aggregator, params.getAggregatorSizes()[0], cursor, positions, params.getResultsBuf() ); specializationState.accountLoopIterations(processedRows); return processedRows; }
if (params.getCardinality() < 0) { throw new UnsupportedOperationException("Cannot operate on a dimension with unknown cardinality"); final ByteBuffer resultsBuf = params.getResultsBuf(); final int numBytesPerRecord = params.getNumBytesPerRecord(); final int[] aggregatorSizes = params.getAggregatorSizes(); final Cursor cursor = params.getCursor(); final DimensionSelector dimSelector = params.getDimSelector();
if (theAggregators.length == 1) { BufferAggregator aggregator = theAggregators[0]; final Cursor cursor = params.getCursor(); if (cursor instanceof HistoricalCursor && params.getDimSelector() instanceof SingleValueHistoricalDimensionSelector && ((SimpleDoubleBufferAggregator) aggregator).getSelector() instanceof HistoricalColumnSelector) { return scanAndAggregateHistorical1SimpleDoubleAgg( if (theAggregators.length == 1) { BufferAggregator aggregator = theAggregators[0]; final Cursor cursor = params.getCursor(); if (cursor instanceof HistoricalCursor && params.getDimSelector() instanceof HistoricalDimensionSelector && ((SimpleDoubleBufferAggregator) aggregator).getSelector() instanceof HistoricalColumnSelector) { return scanAndAggregateHistorical1SimpleDoubleAgg( specializedScanAndAggregateImplementations.add((params, positions, theAggregators) -> { if (theAggregators.length == 1) { return scanAndAggregateGeneric1Agg(params, positions, theAggregators[0], params.getCursor()); specializedScanAndAggregateImplementations.add((params, positions, theAggregators) -> { if (theAggregators.length == 2) { return scanAndAggregateGeneric2Agg(params, positions, theAggregators, params.getCursor());
return PooledTopNParams.builder() .withSelectorPlus(selectorPlus) .withCursor(cursor)
private static long scanAndAggregateHistorical1SimpleDoubleAgg( PooledTopNParams params, int[] positions, SimpleDoubleBufferAggregator aggregator, HistoricalCursor cursor, Historical1AggPooledTopNScanner prototypeScanner ) { String runtimeShape = StringRuntimeShape.of(aggregator); SpecializationState<Historical1AggPooledTopNScanner> specializationState = SpecializationService.getSpecializationState( prototypeScanner.getClass(), runtimeShape, ImmutableMap.of(Offset.class, cursor.getOffset().getClass()) ); Historical1AggPooledTopNScanner scanner = specializationState.getSpecializedOrDefault(prototypeScanner); long processedRows = scanner.scanAndAggregate( (HistoricalDimensionSelector) params.getDimSelector(), aggregator.getSelector(), aggregator, params.getAggregatorSizes()[0], cursor, positions, params.getResultsBuf() ); specializationState.accountLoopIterations(processedRows); return processedRows; }
@Override protected void updateResults( PooledTopNParams params, int[] positions, BufferAggregator[] theAggregators, TopNResultBuilder resultBuilder ) { if (params.getCardinality() < 0) { throw new UnsupportedOperationException("Cannot operate on a dimension with unknown cardinality"); } final ByteBuffer resultsBuf = params.getResultsBuf(); final int[] aggregatorSizes = params.getAggregatorSizes(); final DimensionSelector dimSelector = params.getDimSelector(); for (int i = 0; i < positions.length; i++) { int position = positions[i]; if (position >= 0) { Object[] vals = new Object[theAggregators.length]; for (int j = 0; j < theAggregators.length; j++) { vals[j] = theAggregators[j].get(resultsBuf, position); position += aggregatorSizes[j]; } // Output type must be STRING in order for PooledTopNAlgorithm to make sense; so no need to convert value. resultBuilder.addEntry(dimSelector.lookupName(i), i, vals); } } }
private static long scanAndAggregateGeneric2Agg( PooledTopNParams params, int[] positions, BufferAggregator[] theAggregators, Cursor cursor ) { String runtimeShape = StringRuntimeShape.of(theAggregators); Class<? extends Generic2AggPooledTopNScanner> prototypeClass = Generic2AggPooledTopNScannerPrototype.class; SpecializationState<Generic2AggPooledTopNScanner> specializationState = SpecializationService .getSpecializationState(prototypeClass, runtimeShape); Generic2AggPooledTopNScanner scanner = specializationState.getSpecializedOrDefault(defaultGeneric2AggScanner); int[] aggregatorSizes = params.getAggregatorSizes(); long processedRows = scanner.scanAndAggregate( params.getDimSelector(), theAggregators[0], aggregatorSizes[0], theAggregators[1], aggregatorSizes[1], cursor, positions, params.getResultsBuf() ); specializationState.accountLoopIterations(processedRows); return processedRows; }
private static long scanAndAggregateGeneric1Agg( PooledTopNParams params, int[] positions, BufferAggregator aggregator, Cursor cursor ) { String runtimeShape = StringRuntimeShape.of(aggregator); Class<? extends Generic1AggPooledTopNScanner> prototypeClass = Generic1AggPooledTopNScannerPrototype.class; SpecializationState<Generic1AggPooledTopNScanner> specializationState = SpecializationService .getSpecializationState(prototypeClass, runtimeShape); Generic1AggPooledTopNScanner scanner = specializationState.getSpecializedOrDefault(defaultGeneric1AggScanner); long processedRows = scanner.scanAndAggregate( params.getDimSelector(), aggregator, params.getAggregatorSizes()[0], cursor, positions, params.getResultsBuf() ); specializationState.accountLoopIterations(processedRows); return processedRows; }
public PooledTopNParams build() { return new PooledTopNParams( selectorPlus, cursor, resultsBufHolder, resultsBuf, aggregatorSizes, numBytesPerRecord, numValuesPerPass, arrayProvider ); } }
@Override protected BufferAggregator[] makeDimValAggregateStore(PooledTopNParams params) { return makeBufferAggregators(params.getCursor(), query.getAggregatorSpecs()); }
@Override public void cleanup(PooledTopNParams params) { if (params != null) { ResourceHolder<ByteBuffer> resultsBufHolder = params.getResultsBufHolder(); if (resultsBufHolder != null) { resultsBufHolder.get().clear(); } CloseQuietly.close(resultsBufHolder); } }
@Override protected int[] makeDimValSelector(PooledTopNParams params, int numProcessed, int numToProcess) { final TopNMetricSpecBuilder<int[]> arrayProvider = params.getArrayProvider(); if (!query.getDimensionSpec().preservesOrdering()) { return arrayProvider.build(); } arrayProvider.ignoreFirstN(numProcessed); arrayProvider.keepOnlyN(numToProcess); return query.getTopNMetricSpec().configureOptimizer(arrayProvider).build(); }
if (params.getCardinality() < 0) { throw new UnsupportedOperationException("Cannot operate on a dimension with unknown cardinality"); final ByteBuffer resultsBuf = params.getResultsBuf(); final int numBytesPerRecord = params.getNumBytesPerRecord(); final int[] aggregatorSizes = params.getAggregatorSizes(); final Cursor cursor = params.getCursor(); final DimensionSelector dimSelector = params.getDimSelector();
if (theAggregators.length == 1) { BufferAggregator aggregator = theAggregators[0]; final Cursor cursor = params.getCursor(); if (cursor instanceof HistoricalCursor && params.getDimSelector() instanceof SingleValueHistoricalDimensionSelector && ((SimpleDoubleBufferAggregator) aggregator).getSelector() instanceof HistoricalColumnSelector) { return scanAndAggregateHistorical1SimpleDoubleAgg( if (theAggregators.length == 1) { BufferAggregator aggregator = theAggregators[0]; final Cursor cursor = params.getCursor(); if (cursor instanceof HistoricalCursor && params.getDimSelector() instanceof HistoricalDimensionSelector && ((SimpleDoubleBufferAggregator) aggregator).getSelector() instanceof HistoricalColumnSelector) { return scanAndAggregateHistorical1SimpleDoubleAgg( specializedScanAndAggregateImplementations.add((params, positions, theAggregators) -> { if (theAggregators.length == 1) { return scanAndAggregateGeneric1Agg(params, positions, theAggregators[0], params.getCursor()); specializedScanAndAggregateImplementations.add((params, positions, theAggregators) -> { if (theAggregators.length == 2) { return scanAndAggregateGeneric2Agg(params, positions, theAggregators, params.getCursor());
@Override protected void updateResults( PooledTopNParams params, int[] positions, BufferAggregator[] theAggregators, TopNResultBuilder resultBuilder ) { if (params.getCardinality() < 0) { throw new UnsupportedOperationException("Cannot operate on a dimension with unknown cardinality"); } final ByteBuffer resultsBuf = params.getResultsBuf(); final int[] aggregatorSizes = params.getAggregatorSizes(); final DimensionSelector dimSelector = params.getDimSelector(); for (int i = 0; i < positions.length; i++) { int position = positions[i]; if (position >= 0) { Object[] vals = new Object[theAggregators.length]; for (int j = 0; j < theAggregators.length; j++) { vals[j] = theAggregators[j].get(resultsBuf, position); position += aggregatorSizes[j]; } // Output type must be STRING in order for PooledTopNAlgorithm to make sense; so no need to convert value. resultBuilder.addEntry(dimSelector.lookupName(i), i, vals); } } }
private static long scanAndAggregateGeneric2Agg( PooledTopNParams params, int[] positions, BufferAggregator[] theAggregators, Cursor cursor ) { String runtimeShape = StringRuntimeShape.of(theAggregators); Class<? extends Generic2AggPooledTopNScanner> prototypeClass = Generic2AggPooledTopNScannerPrototype.class; SpecializationState<Generic2AggPooledTopNScanner> specializationState = SpecializationService .getSpecializationState(prototypeClass, runtimeShape); Generic2AggPooledTopNScanner scanner = specializationState.getSpecializedOrDefault(defaultGeneric2AggScanner); int[] aggregatorSizes = params.getAggregatorSizes(); long processedRows = scanner.scanAndAggregate( params.getDimSelector(), theAggregators[0], aggregatorSizes[0], theAggregators[1], aggregatorSizes[1], cursor, positions, params.getResultsBuf() ); specializationState.accountLoopIterations(processedRows); return processedRows; }
private static long scanAndAggregateGeneric1Agg( PooledTopNParams params, int[] positions, BufferAggregator aggregator, Cursor cursor ) { String runtimeShape = StringRuntimeShape.of(aggregator); Class<? extends Generic1AggPooledTopNScanner> prototypeClass = Generic1AggPooledTopNScannerPrototype.class; SpecializationState<Generic1AggPooledTopNScanner> specializationState = SpecializationService .getSpecializationState(prototypeClass, runtimeShape); Generic1AggPooledTopNScanner scanner = specializationState.getSpecializedOrDefault(defaultGeneric1AggScanner); long processedRows = scanner.scanAndAggregate( params.getDimSelector(), aggregator, params.getAggregatorSizes()[0], cursor, positions, params.getResultsBuf() ); specializationState.accountLoopIterations(processedRows); return processedRows; }
public PooledTopNParams build() { return new PooledTopNParams( selectorPlus, cursor, resultsBufHolder, resultsBuf, aggregatorSizes, numBytesPerRecord, numValuesPerPass, arrayProvider ); } }