@Override public void initGroupingKeyColumnValue(int keyBufferPosition, int columnIndex, Object rowObj, ByteBuffer keyBuffer, int[] stack) { IndexedInts row = (IndexedInts) rowObj; int rowSize = row.size(); initializeGroupingKeyV2Dimension(row, rowSize, keyBuffer, keyBufferPosition); stack[columnIndex] = rowSize == 0 ? 0 : 1; }
@Override public boolean matches() { final IndexedInts row = selector.getRow(); final int size = row.size(); return size == 0; }
@Override public Object getOnlyValue(ColumnValueSelector selector) { final DimensionSelector dimSelector = (DimensionSelector) selector; final IndexedInts row = dimSelector.getRow(); Preconditions.checkState(row.size() < 2, "Not supported for multi-value dimensions"); return row.size() == 1 ? row.get(0) : GROUP_BY_MISSING_VALUE; }
public static VSizeColumnarInts fromIndexedInts(IndexedInts ints, int maxValue) { int numBytes = getNumBytesForMax(maxValue); final ByteBuffer buffer = ByteBuffer.allocate((ints.size() * numBytes) + (4 - numBytes)); writeToBuffer(buffer, ints, numBytes, maxValue); return new VSizeColumnarInts(buffer.asReadOnlyBuffer(), numBytes); }
default void forEach(IntConsumer action) { int size = size(); for (int i = 0; i < size; i++) { action.accept(get(i)); } }
@Nullable @Override public String getObject() { final IndexedInts keyIndices = keySelector.getRow(); final IndexedInts valueIndices = valueSelector.getRow(); final int limit = Math.min(keyIndices.size(), valueIndices.size()); for (int i = 0; i < limit; i++) { if (keyIndices.get(i) == keyId) { return valueSelector.lookupName(valueIndices.get(i)); } } return null; } };
@Override public void addValues(IndexedInts ints) throws IOException { if (numBytesForMaxWritten) { throw new IllegalStateException("written out already"); } for (int i = 0, size = ints.size(); i < size; i++) { int value = ints.get(i); Preconditions.checkState(value >= 0 && value <= maxId); writeInt.write(valuesOut, value); } headerOut.writeInt(Ints.checkedCast(valuesOut.size())); ++numWritten; }
@Nullable @Override public String getObject() { final IndexedInts keyIndices = keySelector.getRow(); final IndexedInts valueIndices = valueSelector.getRow(); final int limit = Math.min(keyIndices.size(), valueIndices.size()); for (int i = 0; i < limit; i++) { if (Objects.equals(keySelector.lookupName(keyIndices.get(i)), subColumnName)) { return valueSelector.lookupName(valueIndices.get(i)); } } return null; } };
@Override public void addValues(IndexedInts ints) throws IOException { if (lastOffsetWritten) { throw new IllegalStateException("written out already"); } offsetWriter.addValue(offset); int numValues = ints.size(); for (int i = 0; i < numValues; i++) { valueWriter.addValue(ints.get(i)); } offset += numValues; }
@Override public Supplier<Comparable> makeInputRawSupplier(DimensionSelector selector) { return () -> { IndexedInts index = selector.getRow(); return index.size() == 0 ? null : selector.lookupName(index.get(0)); }; } }
@Override public void aggregate() { IndexedInts row = selector.getRow(); for (int i = 0, rowSize = row.size(); i < rowSize; i++) { int index = row.get(i); mutableBitmap.add(index); } }
@Benchmark @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MICROSECONDS) public void uncompressed(Blackhole blackhole) { for (int i = filter.nextSetBit(0); i >= 0; i = filter.nextSetBit(i + 1)) { IndexedInts row = uncompressed.get(i); for (int j = 0, rowSize = row.size(); j < rowSize; j++) { blackhole.consume(row.get(j)); } } }
@Override public void aggregate(ByteBuffer buf, int position) { MutableBitmap mutableBitmap = getMutableBitmap(position); IndexedInts row = selector.getRow(); for (int i = 0, rowSize = row.size(); i < rowSize; i++) { int index = row.get(i); mutableBitmap.add(index); } buf.putLong(position, mutableBitmap.size()); }
@Benchmark @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MICROSECONDS) public void compressed(Blackhole blackhole) { for (int i = filter.nextSetBit(0); i >= 0; i = filter.nextSetBit(i + 1)) { IndexedInts row = compressed.get(i); for (int j = 0, rowSize = row.size(); j < rowSize; j++) { blackhole.consume(row.get(j)); } } } }
@Override public void setValueFrom(ColumnValueSelector<?> selector) { DimensionSelector dimensionSelector = (DimensionSelector) selector; keptSelector = dimensionSelector; IndexedInts row = dimensionSelector.getRow(); int rowSize = row.size(); keptRow.ensureSize(rowSize); for (int i = 0; i < rowSize; i++) { keptRow.setValue(i, row.get(i)); } keptRow.setSize(rowSize); }
@Override public void hashValues(DimensionSelector dimSelector, HyperLogLogCollector collector) { IndexedInts row = dimSelector.getRow(); for (int i = 0, rowSize = row.size(); i < rowSize; i++) { int index = row.get(i); final String value = dimSelector.lookupName(index); // SQL standard spec does not count null values, // Skip counting null values when we are not replacing null with default value. // A special value for null in case null handling is configured to use empty string for null. if (NullHandling.replaceWithDefault() || value != null) { collector.add(CardinalityAggregator.hashFn.hashUnencodedChars(nullToSpecial(value)).asBytes()); } } }
private void assertSame(List<int[]> someInts, ColumnarMultiInts columnarMultiInts) { Assert.assertEquals(someInts.size(), columnarMultiInts.size()); for (int i = 0; i < columnarMultiInts.size(); ++i) { final int[] ints = someInts.get(i); final IndexedInts vSizeIndexedInts = columnarMultiInts.get(i); Assert.assertEquals(ints.length, vSizeIndexedInts.size()); for (int j = 0; j < ints.length; j++) { Assert.assertEquals(ints[j], vSizeIndexedInts.get(j)); } } }
@Test public void testSanity() { Assert.assertEquals(array.length, indexed.size()); for (int i = 0; i < array.length; i++) { Assert.assertEquals(array[i], indexed.get(i)); } } }
@Test public void testGetRow() { IndexedInts row = NULL_SELECTOR.getRow(); Assert.assertEquals(1, row.size()); Assert.assertEquals(0, row.get(0)); }