@Override public int getCardinality(DimensionSelector selector) { return selector.getValueCardinality(); }
@Override public int getValueCardinality() { return selector.getValueCardinality() + nullAdjustment; }
@Override public int getValueCardinality() { return selector.getValueCardinality(); }
/** * Checks if the given selector constantly returns null. This method could be used in the beginning of execution of * some queries and making some aggregations for heuristic shortcuts. */ static boolean isNilSelector(final DimensionSelector selector) { return selector.nameLookupPossibleInAdvance() && selector.getValueCardinality() == 1 && selector.lookupName(0) == null; }
@Override public ValueMatcher makeValueMatcher(final DimensionSelector selector, String value) { if (selector.getValueCardinality() == 0) { return BooleanValueMatcher.of(value == null); } else { return selector.makeValueMatcher(value); } }
public static BitSet makePredicateMatchingSet(DimensionSelector selector, Predicate<String> predicate) { if (!selector.nameLookupPossibleInAdvance()) { throw new IAE("selector.nameLookupPossibleInAdvance() should return true"); } int cardinality = selector.getValueCardinality(); BitSet valueIds = new BitSet(cardinality); for (int i = 0; i < cardinality; i++) { if (predicate.apply(selector.lookupName(i))) { valueIds.set(i); } } return valueIds; } }
public SingleStringInputCachingExpressionColumnValueSelector( final DimensionSelector selector, final Expr expression ) { // Verify expression has just one binding. if (Parser.findRequiredBindings(expression).size() != 1) { throw new ISE("WTF?! Expected expression with just one binding"); } this.selector = Preconditions.checkNotNull(selector, "selector"); this.expression = Preconditions.checkNotNull(expression, "expression"); final Supplier<Object> inputSupplier = ExpressionSelectors.supplierFromDimensionSelector(selector); this.bindings = name -> inputSupplier.get(); if (selector.getValueCardinality() == DimensionSelector.CARDINALITY_UNKNOWN) { throw new ISE("Selector must have a dictionary"); } else if (selector.getValueCardinality() <= CACHE_SIZE) { arrayEvalCache = new ExprEval[selector.getValueCardinality()]; lruEvalCache = null; } else { arrayEvalCache = null; lruEvalCache = new LruEvalCache(expression, bindings); } }
public SingleStringInputDimensionSelector( final DimensionSelector selector, final Expr expression ) { // Verify expression has just one binding. if (Parser.findRequiredBindings(expression).size() != 1) { throw new ISE("WTF?! Expected expression with just one binding"); } // Verify selector has a working dictionary. if (selector.getValueCardinality() == DimensionSelector.CARDINALITY_UNKNOWN || !selector.nameLookupPossibleInAdvance()) { throw new ISE("Selector of class[%s] does not have a dictionary, cannot use it.", selector.getClass().getName()); } this.selector = Preconditions.checkNotNull(selector, "selector"); this.expression = Preconditions.checkNotNull(expression, "expression"); this.nullAdjustment = selector.getValueCardinality() == 0 || selector.lookupName(0) != null ? 1 : 0; }
@Override public long dimExtractionScanAndAggregate( TopNQuery query, DimensionSelector selector, Cursor cursor, Aggregator[][] rowSelector, Map<Comparable<?>, Aggregator[]> aggregatesStore ) { if (selector.getValueCardinality() != DimensionSelector.CARDINALITY_UNKNOWN) { return dimExtractionScanAndAggregateWithCardinalityKnown(query, cursor, selector, rowSelector, aggregatesStore); } else { return dimExtractionScanAndAggregateWithCardinalityUnknown(query, cursor, selector, aggregatesStore); } }
@Override public ValueMatcher makeValueMatcher( final DimensionSelector selector, final DruidPredicateFactory predicateFactory ) { final Predicate<String> predicate = predicateFactory.makeStringPredicate(); if (selector.getValueCardinality() == 0) { return BooleanValueMatcher.of(predicate.apply(null)); } else { return selector.makeValueMatcher(predicate); } }
public BaseArrayProvider( DimensionSelector dimSelector, TopNQuery query, StorageAdapter storageAdapter ) { this.idLookup = dimSelector.idLookup(); this.query = query; this.storageAdapter = storageAdapter; previousStop = null; ignoreAfterThreshold = false; ignoreFirstN = 0; keepOnlyN = dimSelector.getValueCardinality(); if (keepOnlyN < 0) { throw new IAE("Cannot operate on a dimension with no dictionary"); } }
/** * Generic implementation of {@link DimensionSelector#makeValueMatcher(Predicate)}, uses {@link * DimensionSelector#getRow()} of the given {@link DimensionSelector}. "Lazy" DimensionSelectors could delegate * {@code makeValueMatcher()} to this method, but encouraged to implement {@code makeValueMatcher()} themselves, * bypassing the {@link IndexedInts} abstraction. */ public static ValueMatcher makeValueMatcherGeneric(DimensionSelector selector, Predicate<String> predicate) { int cardinality = selector.getValueCardinality(); if (cardinality >= 0 && selector.nameLookupPossibleInAdvance()) { return makeDictionaryEncodedValueMatcherGeneric(selector, predicate); } else { return makeNonDictionaryEncodedValueMatcherGeneric(selector, predicate); } }
@Test public void testGetValueCardinality() { Assert.assertEquals(1, NULL_SELECTOR.getValueCardinality()); Assert.assertEquals(1, CONST_SELECTOR.getValueCardinality()); Assert.assertEquals(1, NULL_EXTRACTION_SELECTOR.getValueCardinality()); Assert.assertEquals(1, CONST_EXTRACTION_SELECTOR.getValueCardinality()); }
/** * Generic implementation of {@link DimensionSelector#makeValueMatcher(String)}, uses {@link * DimensionSelector#getRow()} of the given {@link DimensionSelector}. "Lazy" DimensionSelectors could delegate * {@code makeValueMatcher()} to this method, but encouraged to implement {@code makeValueMatcher()} themselves, * bypassing the {@link IndexedInts} abstraction. */ public static ValueMatcher makeValueMatcherGeneric(DimensionSelector selector, @Nullable String value) { IdLookup idLookup = selector.idLookup(); if (idLookup != null) { return makeDictionaryEncodedValueMatcherGeneric(selector, idLookup.lookupId(value), value == null); } else if (selector.getValueCardinality() >= 0 && selector.nameLookupPossibleInAdvance()) { // Employ caching BitSet optimization return makeDictionaryEncodedValueMatcherGeneric(selector, Predicates.equalTo(value)); } else { return makeNonDictionaryEncodedValueMatcherGeneric(selector, value); } }
@Override public ValueGetter makeValueGetter(final DimensionSelector selector) { if (selector.getValueCardinality() == 0) { return NULL_VALUE_GETTER; } else { return () -> { final IndexedInts row = selector.getRow(); final int size = row.size(); if (size == 0) { return NULL_VALUE; } else { String[] values = new String[size]; for (int i = 0; i < size; ++i) { values[i] = selector.lookupName(row.get(i)); } return values; } }; } } }
@Test public void testDecoratorWithBlacklist() { ListFilteredDimensionSpec spec = new ListFilteredDimensionSpec( new DefaultDimensionSpec("foo", "bar"), ImmutableSet.of("c", "g"), false ); DimensionSelector selector = spec.decorate(TestDimensionSelector.instance); Assert.assertEquals(24, selector.getValueCardinality()); IndexedInts row = selector.getRow(); Assert.assertEquals(1, row.size()); Assert.assertEquals(3, row.get(0)); Assert.assertEquals("a", selector.lookupName(0)); Assert.assertEquals("z", selector.lookupName(23)); Assert.assertEquals(0, selector.idLookup().lookupId("a")); Assert.assertEquals(23, selector.idLookup().lookupId("z")); }
@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 testDecoratorWithWhitelist() { ListFilteredDimensionSpec spec = new ListFilteredDimensionSpec( new DefaultDimensionSpec("foo", "bar"), ImmutableSet.of("c", "g"), true ); DimensionSelector selector = spec.decorate(TestDimensionSelector.instance); Assert.assertEquals(2, selector.getValueCardinality()); IndexedInts row = selector.getRow(); Assert.assertEquals(2, row.size()); Assert.assertEquals(0, row.get(0)); Assert.assertEquals(1, row.get(1)); Assert.assertEquals("c", selector.lookupName(0)); Assert.assertEquals("g", selector.lookupName(1)); Assert.assertEquals(0, selector.idLookup().lookupId("c")); Assert.assertEquals(1, selector.idLookup().lookupId("g")); }
@Test public void testDecoratorWithBlacklistUsingNonPresentValues() { ListFilteredDimensionSpec spec = new ListFilteredDimensionSpec( new DefaultDimensionSpec("foo", "bar"), ImmutableSet.of("c", "gx"), false ); DimensionSelector selector = spec.decorate(TestDimensionSelector.instance); Assert.assertEquals(25, selector.getValueCardinality()); IndexedInts row = selector.getRow(); Assert.assertEquals(2, row.size()); Assert.assertEquals(3, row.get(0)); Assert.assertEquals(5, row.get(1)); Assert.assertEquals("e", selector.lookupName(row.get(0))); Assert.assertEquals("g", selector.lookupName(row.get(1))); Assert.assertEquals("a", selector.lookupName(0)); Assert.assertEquals("z", selector.lookupName(24)); Assert.assertEquals(0, selector.idLookup().lookupId("a")); Assert.assertEquals(24, selector.idLookup().lookupId("z")); } }
@Test public void testDecorator() { RegexFilteredDimensionSpec spec = new RegexFilteredDimensionSpec( new DefaultDimensionSpec("foo", "bar"), "[c,g]" ); DimensionSelector selector = spec.decorate(TestDimensionSelector.instance); Assert.assertEquals(2, selector.getValueCardinality()); IndexedInts row = selector.getRow(); Assert.assertEquals(2, row.size()); Assert.assertEquals(0, row.get(0)); Assert.assertEquals(1, row.get(1)); Assert.assertEquals("c", selector.lookupName(0)); Assert.assertEquals("g", selector.lookupName(1)); Assert.assertEquals(0, selector.idLookup().lookupId("c")); Assert.assertEquals(1, selector.idLookup().lookupId("g")); } }