/** * Take two Api filters which differ only by value sets and union their value sets. * * @param one The first ApiFilter * @param two The second ApiFilter * * @return an ApiFilter with the union of values */ public ApiFilter union(ApiFilter one, ApiFilter two) { if (Objects.equals(one.getDimension(), two.getDimension()) && Objects.equals(one.getDimensionField(), two.getDimensionField()) && Objects.equals(one.getOperation(), two.getOperation()) ) { Set<String> values = Stream.concat( one.getValues().stream(), two.getValues().stream() ) .collect(Collectors.toSet()); return one.withValues(values); } throw new IllegalArgumentException(String.format("Unmergable ApiFilters '%s' and '%s'", one, two)); } }
if (!requestedDimensions.contains(filter.getDimension())) { Dimension filterDimension = filter.getDimension(); String msg; if (requestedDimensions.size() == 1) {
/** * Validity rules for non-aggregatable dimensions that are only referenced in filters. * A query that references a non-aggregatable dimension in a filter without grouping by this dimension, is valid * only if the requested dimension field is a key for this dimension and only a single value is requested * with an inclusive operator ('in' or 'eq'). * * @return A predicate that determines a given dimension is non aggregatable and also not constrained to one row * per result */ protected static Predicate<ApiFilter> isNonAggregatableInFilter() { return apiFilter -> !apiFilter.getDimensionField().equals(apiFilter.getDimension().getKey()) || apiFilter.getValues().size() != 1 || !( apiFilter.getOperation().equals(DefaultFilterOperation.in) || apiFilter.getOperation().equals(DefaultFilterOperation.eq) ); }
Dimension dimension = filter.getDimension(); DefaultFilterOperation filterOperation = (DefaultFilterOperation) filter.getOperation(); switch (filterOperation) {
/** * Constructor. * * Parses the URL filter Query and generates the ApiFilter object. * * @param filterQuery Expects a URL filter query String in the format: * <code>(dimension name)|(field name)-(operation)[?(value or comma separated values)]?</code> * @param dimensionDictionary cache containing all the valid dimension objects. * * @throws BadFilterException Exception when filter pattern is not matched or when any of its properties are not * @deprecated use {@link ApiFilterGenerator} build method instead */ @Deprecated public ApiFilter( @NotNull String filterQuery, DimensionDictionary dimensionDictionary ) throws BadFilterException { ApiFilter filter = ApiFilterGenerator.build(filterQuery, dimensionDictionary); this.dimension = filter.getDimension(); this.dimensionField = filter.getDimensionField(); this.operation = filter.getOperation(); this.values = filter.getValuesList(); }
if (!table.getDimensions().contains(newFilter.getDimension())) { String filterDimensionName = newFilter.getDimension().getApiName(); LOG.debug(FILTER_DIMENSION_NOT_IN_TABLE.logFormat(filterDimensionName, table)); String errorMessage = FILTER_DIMENSION_NOT_IN_TABLE.format( Dimension dim = newFilter.getDimension(); if (!generated.containsKey(dim)) { generated.put(dim, new LinkedHashSet<>());
/** * Constructor. * * @param filter The filter being recorded */ public Filter(ApiFilter filter) { this.dimension = filter.getDimension().getApiName(); this.field = filter.getDimensionField().getName(); this.operator = filter.getOperation().getName(); this.numberOfValues = filter.getValues().size(); }
new ImmutableTriple<>(filter.getDimension(), filter.getDimensionField(), filter.getOperation());