public static AndDimFilter and(List<DimFilter> filters) { return new AndDimFilter(filters); }
private DimFilter apply0(final DimFilter filter) final List<DimFilter> oldFilters = ((AndDimFilter) filter).getFields(); final List<DimFilter> newFilters = new ArrayList<>(); for (DimFilter oldFilter : oldFilters) { return checkedProcess(new AndDimFilter(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(); }
@Test public void testGetRequiredColumns() { AndDimFilter andDimFilter = new AndDimFilter( Lists.newArrayList( new SelectorDimFilter("a", "d", null), new SelectorDimFilter("b", "d", null), new SelectorDimFilter("c", "d", null) ) ); Assert.assertEquals(andDimFilter.getRequiredColumns(), Sets.newHashSet("a", "b", "c")); } }
private List<DimFilter> getAndFilterChildren(final AndDimFilter filter) { final List<DimFilter> children = new ArrayList<>(); for (final DimFilter field : filter.getFields()) { if (field instanceof AndDimFilter) { children.addAll(getAndFilterChildren((AndDimFilter) field)); } else { children.add(field); } } return children; }
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 DimFilter optimize() { List<DimFilter> elements = DimFilters.optimize(fields); return elements.size() == 1 ? elements.get(0) : new AndDimFilter(elements); }
final List<DimFilter> children = ((AndDimFilter) filter).getFields(); final List<DimFilter> newChildren = new ArrayList<>(); final List<RangeSet<Long>> rangeSets = new ArrayList<>(); newFilter = newChildren.get(0); } else { newFilter = new AndDimFilter(newChildren);
/** * 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> getAndFilterChildren(final AndDimFilter filter) { final List<DimFilter> children = new ArrayList<>(); for (final DimFilter field : filter.getFields()) { if (field instanceof AndDimFilter) { children.addAll(getAndFilterChildren((AndDimFilter) field)); } else { children.add(field); } } return children; }
public static AndDimFilter AND(DimFilter... filters) { return new AndDimFilter(Arrays.asList(filters)); }
private DimFilter apply0(final DimFilter filter) final List<DimFilter> oldFilters = ((AndDimFilter) filter).getFields(); final List<DimFilter> newFilters = Lists.newArrayList(); for (DimFilter oldFilter : oldFilters) { return checkedProcess(new AndDimFilter(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; } } }
private static SearchQueryBuilder basicB(final BenchmarkSchemaInfo basicSchema) { final QuerySegmentSpec intervalSpec = new MultipleIntervalSegmentSpec(Collections.singletonList(basicSchema.getDataInterval())); final List<String> dimUniformFilterVals = new ArrayList<>(); int resultNum = (int) (100000 * 0.1); int step = 100000 / resultNum; for (int i = 1; i < 100001 && dimUniformFilterVals.size() < resultNum; i += step) { dimUniformFilterVals.add(String.valueOf(i)); } List<String> dimHyperUniqueFilterVals = new ArrayList<>(); resultNum = (int) (100000 * 0.1); step = 100000 / resultNum; for (int i = 0; i < 100001 && dimHyperUniqueFilterVals.size() < resultNum; i += step) { dimHyperUniqueFilterVals.add(String.valueOf(i)); } final List<DimFilter> dimFilters = new ArrayList<>(); dimFilters.add(new InDimFilter("dimUniform", dimUniformFilterVals, null)); dimFilters.add(new InDimFilter("dimHyperUnique", dimHyperUniqueFilterVals, null)); return Druids.newSearchQueryBuilder() .dataSource("blah") .granularity(Granularities.ALL) .intervals(intervalSpec) .query("") .dimensions(Lists.newArrayList("dimUniform", "dimHyperUnique")) .filters(new AndDimFilter(dimFilters)); }
final List<DimFilter> children = ((AndDimFilter) filter).getFields(); final List<DimFilter> newChildren = Lists.newArrayList(); final List<RangeSet<Long>> rangeSets = Lists.newArrayList(); newFilter = newChildren.get(0); } else { newFilter = new AndDimFilter(newChildren);
private static SearchQueryBuilder basicD(final BenchmarkSchemaInfo basicSchema) { final QuerySegmentSpec intervalSpec = new MultipleIntervalSegmentSpec( Collections.singletonList(basicSchema.getDataInterval()) ); final List<String> dimUniformFilterVals = new ArrayList<>(); final int resultNum = (int) (100000 * 0.1); final int step = 100000 / resultNum; for (int i = 1; i < 100001 && dimUniformFilterVals.size() < resultNum; i += step) { dimUniformFilterVals.add(String.valueOf(i)); } final String dimName = "dimUniform"; final List<DimFilter> dimFilters = new ArrayList<>(); dimFilters.add(new InDimFilter(dimName, dimUniformFilterVals, null)); dimFilters.add(new SelectorDimFilter(dimName, "3", null)); dimFilters.add(new BoundDimFilter(dimName, "100", "10000", true, true, true, null, null)); return Druids.newSearchQueryBuilder() .dataSource("blah") .granularity(Granularities.ALL) .intervals(intervalSpec) .query("") .dimensions(Collections.singletonList("dimUniform")) .filters(new AndDimFilter(dimFilters)); }
@Test public void testSimpleOptimize() { SelectorDimFilter selectorDimFilter = new SelectorDimFilter("abc", "d", null); DimFilter filter = new AndDimFilter( Collections.singletonList( new OrDimFilter( Collections.singletonList( new AndDimFilter(Arrays.asList(selectorDimFilter, null)) ) ) ) ); Assert.assertEquals(selectorDimFilter, filter.optimize()); }
return newChildren.get(0); } else { return disjunction ? new OrDimFilter(newChildren) : new AndDimFilter(newChildren);
new FilteredAggregatorFactory( filteredAgg.getAggregator(), Filtration.create(new AndDimFilter(ImmutableList.of(filteredAgg.getFilter(), baseOptimizedFilter))) .optimizeFilterOnly(sourceRowSignature) .getDimFilter()
new AndDimFilter(Arrays.asList( new NoBitmapSelectorDimFilter("dimMultivalEnumerated2", "Corundum", null), new SelectorDimFilter("dimMultivalEnumerated", "Bar", null) new SelectorDimFilter("dimSequential", "299", null), new SelectorDimFilter("dimSequential", "399", null), new AndDimFilter(Arrays.asList( new NoBitmapSelectorDimFilter("dimMultivalEnumerated2", "Xylophone", null), new SelectorDimFilter("dimMultivalEnumerated", "Foo", null) dimFilter1, dimFilter2, new AndDimFilter(Arrays.asList( new NoBitmapSelectorDimFilter("dimMultivalEnumerated2", "Orange", null), new SelectorDimFilter("dimMultivalEnumerated", "World", null)