/** * Get a new instance of this filter with the given value. * * @param value Value of the new filter. * * @return a new instance of this filter with the given value */ public SelectorFilter withValue(String value) { return new SelectorFilter(getDimension(), value, getExtractionFunction()); }
@Override public String toString() { return "Filter{ type=" + getType() + ", dimension=" + getDimension() + ", value=" + getValue() + "}"; } }
@Override public SelectorFilter withDimension(Dimension dimension) { return new SelectorFilter(dimension, value, getExtractionFunction()); }
/** * Get a new instance of this filter with the given value. * * @param extractionFn Extraction function to be applied on dimension * * @return a new instance of this filter with the given value */ public SelectorFilter withExtractionFn(ExtractionFunction extractionFn) { return new SelectorFilter(getDimension(), value, extractionFn); }
/** * Evaluates a Selector filter. * * @param selectorFilter A selectorFilter to be evaluated. * @param builder The RelBuilder used to build queries with Calcite. * @param apiToFieldMapper A function to get the aliased aggregation's name from the metric name. * * @return a RexNode containing an equivalent filter to the one given. */ public RexNode evaluate(SelectorFilter selectorFilter, RelBuilder builder, ApiToFieldMapper apiToFieldMapper) { String apiName = selectorFilter.getDimension().getApiName(); return builder.call( SqlStdOperatorTable.EQUALS, builder.field(apiToFieldMapper.apply(apiName)), builder.literal(selectorFilter.getValue()) ); }
/** * Evaluates an Infilter filter. * * @param inFilter An inFilter to be evaluated. * @param builder The RelBuilder used to build queries with Calcite. * @param apiToFieldMapper A function to get the aliased aggregation's name from the metric name. * * @return a RexNode containing an equivalent filter to the one given. */ public RexNode evaluate(InFilter inFilter, RelBuilder builder, ApiToFieldMapper apiToFieldMapper) { Dimension dimension = inFilter.getDimension(); OrFilter orFilterOfSelectors = new OrFilter( inFilter.getValues() .stream() .map(value -> new SelectorFilter(dimension, value)) .collect(Collectors.toList()) ); return dispatcher.invoke(orFilterOfSelectors); }
@Override public Set<Dimension> gatherFilterDimensions(Filter filter, Set<Dimension> dimensions) { if (filter instanceof SelectorFilter) { dimensions.add(((SelectorFilter) filter).getDimension()); } else if (filter instanceof InFilter) { dimensions.add(((InFilter) filter).getDimension()); } else if (filter instanceof MultiClauseFilter) { for (Filter multiclauseFilter : ((MultiClauseFilter) filter).getFields()) { gatherFilterDimensions(multiclauseFilter, dimensions); } } else if (filter instanceof NotFilter) { gatherFilterDimensions(((NotFilter) filter).getField(), dimensions); } return dimensions; } }
Function<DimensionRow, Filter> filterBuilder = row -> new SelectorFilter( dimension, row.get(dimension.getKey())