@Override public boolean nameLookupPossibleInAdvance() { return selector.nameLookupPossibleInAdvance(); }
@Override public boolean nameLookupPossibleInAdvance() { return Objects.requireNonNull(keptSelector).nameLookupPossibleInAdvance(); }
/** * 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; }
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 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; }
/** * @param selector must return true from {@link DimensionSelector#nameLookupPossibleInAdvance()} * @param forwardMapping must have {@link Int2IntOpenHashMap#defaultReturnValue(int)} configured to -1. */ ForwardingFilteredDimensionSelector( DimensionSelector selector, Int2IntOpenHashMap forwardMapping, int[] reverseMapping ) { this.selector = Preconditions.checkNotNull(selector); if (!selector.nameLookupPossibleInAdvance()) { throw new IAE("selector.nameLookupPossibleInAdvance() should return true"); } this.baseIdLookup = selector.idLookup(); this.forwardMapping = Preconditions.checkNotNull(forwardMapping); if (forwardMapping.defaultReturnValue() != -1) { throw new IAE("forwardMapping.defaultReturnValue() should be -1"); } this.reverseMapping = Preconditions.checkNotNull(reverseMapping); }
/** * 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); } }
/** * 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); } }
private DimensionSelector filterWhiteList(DimensionSelector selector) { final int selectorCardinality = selector.getValueCardinality(); if (selectorCardinality < 0 || (selector.idLookup() == null && !selector.nameLookupPossibleInAdvance())) { return new PredicateFilteredDimensionSelector(selector, Predicates.in(values)); } final int maxPossibleFilteredCardinality = values.size(); int count = 0; final Int2IntOpenHashMap forwardMapping = new Int2IntOpenHashMap(maxPossibleFilteredCardinality); forwardMapping.defaultReturnValue(-1); final int[] reverseMapping = new int[maxPossibleFilteredCardinality]; IdLookup idLookup = selector.idLookup(); if (idLookup != null) { for (String value : values) { int i = idLookup.lookupId(value); if (i >= 0) { forwardMapping.put(i, count); reverseMapping[count++] = i; } } } else { for (int i = 0; i < selectorCardinality; i++) { if (values.contains(NullHandling.nullToEmptyIfNeeded(selector.lookupName(i)))) { forwardMapping.put(i, count); reverseMapping[count++] = i; } } } return new ForwardingFilteredDimensionSelector(selector, forwardMapping, reverseMapping); }
private DimensionSelector filterBlackList(DimensionSelector selector) { final int selectorCardinality = selector.getValueCardinality(); if (selectorCardinality < 0 || !selector.nameLookupPossibleInAdvance()) { return new PredicateFilteredDimensionSelector( selector, new Predicate<String>() { @Override public boolean apply(@Nullable String input) { return !values.contains(input); } } ); } final int maxPossibleFilteredCardinality = selectorCardinality; int count = 0; final Int2IntOpenHashMap forwardMapping = new Int2IntOpenHashMap(maxPossibleFilteredCardinality); forwardMapping.defaultReturnValue(-1); final int[] reverseMapping = new int[maxPossibleFilteredCardinality]; for (int i = 0; i < selectorCardinality; i++) { if (!values.contains(NullHandling.nullToEmptyIfNeeded(selector.lookupName(i)))) { forwardMapping.put(i, count); reverseMapping[count++] = i; } } return new ForwardingFilteredDimensionSelector(selector, forwardMapping, reverseMapping); }
if (selectorCardinality < 0 || !selector.nameLookupPossibleInAdvance()) { return new PredicateFilteredDimensionSelector( selector,
if (selectorCardinality < 0 || !selector.nameLookupPossibleInAdvance()) { return new PredicateFilteredDimensionSelector( selector,
@Override public boolean nameLookupPossibleInAdvance() { return selector.nameLookupPossibleInAdvance(); }
@Override public boolean nameLookupPossibleInAdvance() { return Objects.requireNonNull(keptSelector).nameLookupPossibleInAdvance(); }
public static boolean isNilSelector(final DimensionSelector selector) { return selector.nameLookupPossibleInAdvance() && selector.getValueCardinality() == 1 && selector.lookupName(0) == null; } }
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; }
/** * @param selector must return true from {@link DimensionSelector#nameLookupPossibleInAdvance()} * @param forwardMapping must have {@link Int2IntOpenHashMap#defaultReturnValue(int)} configured to -1. */ ForwardingFilteredDimensionSelector( DimensionSelector selector, Int2IntOpenHashMap forwardMapping, int[] reverseMapping ) { this.selector = Preconditions.checkNotNull(selector); if (!selector.nameLookupPossibleInAdvance()) { throw new IAE("selector.nameLookupPossibleInAdvance() should return true"); } this.baseIdLookup = selector.idLookup(); this.forwardMapping = Preconditions.checkNotNull(forwardMapping); if (forwardMapping.defaultReturnValue() != -1) { throw new IAE("forwardMapping.defaultReturnValue() should be -1"); } this.reverseMapping = Preconditions.checkNotNull(reverseMapping); }
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; }
/** * 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); } }
/** * 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); } }