@Override public OrFilter withFields(List<Filter> fields) { return new OrFilter(fields); } }
@Override protected Filter buildDimensionFilter(Dimension dimension, Set<ApiFilter> filters) throws DimensionRowNotFoundException { LOG.trace("Building dimension filter using dimension: {} \n\n and set of filter: {}", dimension, filters); List<Filter> orFilters = new ArrayList<>(); for (ApiFilter filter : filters) { ApiFilter normalizedFilter = filter; if (normalizedFilter.getOperation().equals(DefaultFilterOperation.notin)) { normalizedFilter = filter.withOperation(DefaultFilterOperation.in); } Filter disjunction = new OrFilter(buildSelectorFilters( dimension, getFilteredDimensionRows(dimension, Collections.singleton(normalizedFilter)) )); orFilters.add(normalizedFilter == filter ? disjunction : new NotFilter(disjunction)); } Filter newFilter = orFilters.size() == 1 ? orFilters.get(0) : new AndFilter(orFilters); LOG.trace("Filter: {}", newFilter); return newFilter; } }
/** * 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); }