public static OrDimFilter or(List<DimFilter> filters) { return new OrDimFilter(filters); }
final List<DimFilter> children = Lists.newArrayList(((OrDimFilter) filter).getFields()); if (!children.equals(((OrDimFilter) filter).getFields())) { return children.size() == 1 ? children.get(0) : new OrDimFilter(children); } else { return filter;
/** * There are some special cases involving null that require special casing for And and Or instead of simply taking * the complement * * Example 1 : "NOT ( [0,INF) OR null)" The inside of NOT would evaluate to null, and the complement would also * be null. However, by breaking the NOT, this statement is "NOT([0,INF)) AND NOT(null)", which means it should * actually evaluate to (-INF, 0). * * Example 2 : "NOT ( [0,INF) AND null )" The inside of NOT would evaluate to [0,INF), and the complement would be * (-INF, 0). However the statement is actually "NOT([0,INF)) OR NOT(null)", and it should be evaluated to null. */ @Override public RangeSet<String> getDimensionRangeSet(String dimension) { if (field instanceof AndDimFilter) { List<DimFilter> fields = ((AndDimFilter) field).getFields(); return new OrDimFilter(Lists.transform(fields, NotDimFilter::new)).getDimensionRangeSet(dimension); } if (field instanceof OrDimFilter) { List<DimFilter> fields = ((OrDimFilter) field).getFields(); return new AndDimFilter(Lists.transform(fields, NotDimFilter::new)).getDimensionRangeSet(dimension); } if (field instanceof NotDimFilter) { return ((NotDimFilter) field).getField().getDimensionRangeSet(dimension); } RangeSet<String> rangeSet = field.getDimensionRangeSet(dimension); return rangeSet == null ? null : rangeSet.complement(); }
private List<DimFilter> getOrFilterChildren(final OrDimFilter filter) { final List<DimFilter> children = new ArrayList<>(); for (final DimFilter field : filter.getFields()) { if (field instanceof OrDimFilter) { children.addAll(getOrFilterChildren((OrDimFilter) field)); } else { children.add(field); } } return children; }
@Override public Filter toFilter() { return convertedFilter.toFilter(); }
@Override public RangeSet<String> getDimensionRangeSet(String dimension) { return convertedFilter.getDimensionRangeSet(dimension); }
private static int computeCost(final DimFilter filter) { if (filter instanceof NotDimFilter) { return computeCost(((NotDimFilter) filter).getField()); } else if (filter instanceof AndDimFilter) { int cost = 0; for (DimFilter field : ((AndDimFilter) filter).getFields()) { cost += computeCost(field); } return cost; } else if (filter instanceof OrDimFilter) { int cost = 0; for (DimFilter field : ((OrDimFilter) filter).getFields()) { cost += computeCost(field); } return cost; } else { return 1; } } }
@Override public Filter toFilter() { return convertedFilter.toFilter(); }
@Override public RangeSet<String> getDimensionRangeSet(String dimension) { return convertedFilter.getDimensionRangeSet(dimension); }
@Override public DimFilter optimize() { List<DimFilter> elements = DimFilters.optimize(fields); return elements.size() == 1 ? elements.get(0) : new OrDimFilter(elements); }
final List<DimFilter> oldFilters = ((OrDimFilter) filter).getFields(); final List<DimFilter> newFilters = new ArrayList<>(); for (DimFilter oldFilter : oldFilters) { return checkedProcess(new OrDimFilter(newFilters)); } else { return checkedProcess(filter);
/** * There are some special cases involving null that require special casing for And and Or instead of simply taking * the complement * * Example 1 : "NOT ( [0,INF) OR null)" The inside of NOT would evaluate to null, and the complement would also * be null. However, by breaking the NOT, this statement is "NOT([0,INF)) AND NOT(null)", which means it should * actually evaluate to (-INF, 0). * * Example 2 : "NOT ( [0,INF) AND null )" The inside of NOT would evaluate to [0,INF), and the complement would be * (-INF, 0). However the statement is actually "NOT([0,INF)) OR NOT(null)", and it should be evaluated to null. */ @Override public RangeSet<String> getDimensionRangeSet(String dimension) { if (field instanceof AndDimFilter) { List<DimFilter> fields = ((AndDimFilter) field).getFields(); return new OrDimFilter(Lists.transform(fields, NotDimFilter::new)).getDimensionRangeSet(dimension); } if (field instanceof OrDimFilter) { List<DimFilter> fields = ((OrDimFilter) field).getFields(); return new AndDimFilter(Lists.transform(fields, NotDimFilter::new)).getDimensionRangeSet(dimension); } if (field instanceof NotDimFilter) { return ((NotDimFilter) field).getField().getDimensionRangeSet(dimension); } RangeSet<String> rangeSet = field.getDimensionRangeSet(dimension); return rangeSet == null ? null : rangeSet.complement(); }
); } else if (filter instanceof OrDimFilter) { final List<DimFilter> children = ((OrDimFilter) filter).getFields(); final List<RangeSet<Long>> rangeSets = new ArrayList<>();
public static OrDimFilter OR(DimFilter... filters) { return new OrDimFilter(Arrays.asList(filters)); }
final List<DimFilter> children = Lists.newArrayList(((OrDimFilter) filter).getFields()); if (!children.equals(((OrDimFilter) filter).getFields())) { return children.size() == 1 ? children.get(0) : new OrDimFilter(children); } else { return filter;
private List<DimFilter> getOrFilterChildren(final OrDimFilter filter) { final List<DimFilter> children = new ArrayList<>(); for (final DimFilter field : filter.getFields()) { if (field instanceof OrDimFilter) { children.addAll(getOrFilterChildren((OrDimFilter) field)); } else { children.add(field); } } return children; }
@JsonCreator public IntervalDimFilter( @JsonProperty("dimension") String dimension, @JsonProperty("intervals") List<Interval> intervals, @JsonProperty("extractionFn") ExtractionFn extractionFn ) { Preconditions.checkNotNull(dimension, "dimension can not be null"); Preconditions.checkNotNull(intervals, "intervals can not be null"); Preconditions.checkArgument(intervals.size() > 0, "must specify at least one interval"); this.dimension = dimension; this.intervals = Collections.unmodifiableList(JodaUtils.condenseIntervals(intervals)); this.extractionFn = extractionFn; this.intervalLongs = makeIntervalLongs(); this.convertedFilter = new OrDimFilter(makeBoundDimFilters()); }
final List<DimFilter> oldFilters = ((OrDimFilter) filter).getFields(); final List<DimFilter> newFilters = Lists.newArrayList(); for (DimFilter oldFilter : oldFilters) { return checkedProcess(new OrDimFilter(newFilters)); } else { return checkedProcess(filter);
private static int computeCost(final DimFilter filter) { if (filter instanceof NotDimFilter) { return computeCost(((NotDimFilter) filter).getField()); } else if (filter instanceof AndDimFilter) { int cost = 0; for (DimFilter field : ((AndDimFilter) filter).getFields()) { cost += computeCost(field); } return cost; } else if (filter instanceof OrDimFilter) { int cost = 0; for (DimFilter field : ((OrDimFilter) filter).getFields()) { cost += computeCost(field); } return cost; } else { return 1; } } }
return newChildren.get(0); } else { return disjunction ? new OrDimFilter(newChildren) : new AndDimFilter(newChildren);