@Override public void initColumnValues(ColumnValueSelector selector, int columnIndex, Object[] valuess) { DimensionSelector dimSelector = (DimensionSelector) selector; IndexedInts row = dimSelector.getRow(); valuess[columnIndex] = row; }
@Override public boolean matches() { final IndexedInts row = selector.getRow(); final int size = row.size(); return size == 0; }
private static IndexedInts getRow(ColumnValueSelector s) { if (s instanceof DimensionSelector) { return ((DimensionSelector) s).getRow(); } else if (s instanceof NilColumnValueSelector) { return IndexedInts.empty(); } else { throw new ISE( "ColumnValueSelector[%s], only DimensionSelector or NilColumnValueSelector is supported", s.getClass() ); } }
@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 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; }
@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 boolean matches() { final IndexedInts row = selector.getRow(); final int size = row.size(); if (size == 0) { // null should match empty rows in multi-value columns return matchNull; } else { for (int i = 0; i < size; ++i) { if (row.get(i) == valueId) { return true; } } return false; } }
@Override public boolean matches() { final IndexedInts row = selector.getRow(); final int size = row.size(); if (size == 0) { // null should match empty rows in multi-value columns return matchNull; } else { for (int i = 0; i < size; ++i) { if (predicate.apply(selector.lookupName(row.get(i)))) { return true; } } return false; } }
@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); } }
@Nullable @Override public Object getObject() { final int valueIndex = findValueIndicesIndexForSubColumn(); if (valueIndex < 0) { return null; } else { final DimensionSelector valueSelector = getValueSelector(); final IndexedInts valueIndices = valueSelector.getRow(); return valueSelector.lookupName(valueIndices.get(valueIndex)); } }
@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()); }
@Override public IndexedInts getRow() { IndexedInts baseRow = selector.getRow(); int baseRowSize = baseRow.size(); row.ensureSize(baseRowSize); int resultSize = 0; for (int i = 0; i < baseRowSize; i++) { if (predicate.apply(selector.lookupName(baseRow.get(i)))) { row.setValue(resultSize, i); resultSize++; } } row.setSize(resultSize); return row; }
@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()); } } }
@Override public IndexedInts getRow() { IndexedInts baseRow = selector.getRow(); int baseRowSize = baseRow.size(); row.ensureSize(baseRowSize); int resultSize = 0; for (int i = 0; i < baseRowSize; i++) { int forwardedValue = forwardMapping.get(baseRow.get(i)); if (forwardedValue >= 0) { row.setValue(resultSize, forwardedValue); resultSize++; } } row.setSize(resultSize); return row; }
@Override public List<String> apply(Cursor input) { final DimensionSelector selector = input .getColumnSelectorFactory() .makeDimensionSelector(new DefaultDimensionSpec(selectColumn, selectColumn)); final List<String> values = new ArrayList<>(); while (!input.isDone()) { IndexedInts row = selector.getRow(); Preconditions.checkState(row.size() == 1); values.add(selector.lookupName(row.get(0))); input.advance(); } return values; } }
@Test public void testGetRow() { IndexedInts row = NULL_SELECTOR.getRow(); Assert.assertEquals(1, row.size()); Assert.assertEquals(0, row.get(0)); }
@Test public void testDecorator() { PrefixFilteredDimensionSpec spec = new PrefixFilteredDimensionSpec( new DefaultDimensionSpec("foo", "far"), "c" ); DimensionSelector selector = spec.decorate(TestDimensionSelector.instance); Assert.assertEquals(1, selector.getValueCardinality()); IndexedInts row = selector.getRow(); Assert.assertEquals(1, row.size()); Assert.assertEquals(0, row.get(0)); Assert.assertEquals("c", selector.lookupName(0)); Assert.assertEquals(0, selector.idLookup().lookupId("c")); } }
@Test public void testMakeSelectorsWithDotSupportBaseNameOnly() { final VirtualColumns virtualColumns = makeVirtualColumns(); final BaseObjectColumnValueSelector objectSelector = virtualColumns.makeColumnValueSelector("foo", null); final DimensionSelector dimensionSelector = virtualColumns.makeDimensionSelector( new DefaultDimensionSpec("foo", "x"), null ); final BaseFloatColumnValueSelector floatSelector = virtualColumns.makeColumnValueSelector("foo", null); final BaseLongColumnValueSelector longSelector = virtualColumns.makeColumnValueSelector("foo", null); Assert.assertEquals(-1L, objectSelector.getObject()); Assert.assertEquals("-1", dimensionSelector.lookupName(dimensionSelector.getRow().get(0))); Assert.assertEquals(-1.0f, floatSelector.getFloat(), 0.0f); Assert.assertEquals(-1L, longSelector.getLong()); }