public static AndDimFilter and(List<DimFilter> filters) { return new AndDimFilter(filters); }
@Override public DimFilter optimize() { List<DimFilter> elements = DimFilters.optimize(fields); return elements.size() == 1 ? elements.get(0) : new AndDimFilter(elements); }
public static AndDimFilter AND(DimFilter... filters) { return new AndDimFilter(Arrays.asList(filters)); }
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)); }
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()); }
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)
/** * 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 testAndFilter() { DimFilter and1 = new AndDimFilter(ImmutableList.of(selector1, selector2, in1)); Assert.assertEquals(empty, and1.getDimensionRangeSet("dim1")); Assert.assertNull(and1.getDimensionRangeSet("dim2")); DimFilter and2 = new AndDimFilter(ImmutableList.of(selector3, bound1, other1)); RangeSet expected2 = rangeSet(ImmutableList.of(Range.closed("from", "to"))); Assert.assertEquals(expected2, and2.getDimensionRangeSet("dim1")); DimFilter and3 = new AndDimFilter(ImmutableList.of(in2, bound1, bound2, bound3, bound4)); RangeSet expected3 = rangeSet(Range.openClosed("notincluded", "tillend")); Assert.assertEquals(expected3, and3.getDimensionRangeSet("dim1")); Assert.assertEquals(empty, and3.getDimensionRangeSet("dim2")); DimFilter and4 = new AndDimFilter(ImmutableList.of(in3, bound3)); RangeSet expected4 = rangeSet(point("null")); Assert.assertEquals(expected4, and4.getDimensionRangeSet("dim1")); DimFilter and5 = new AndDimFilter(ImmutableList.of(and3, in1)); RangeSet expected5 = rangeSet(ImmutableList.of(point("testing"), point("this"), point("tillend"))); Assert.assertEquals(expected5, and5.getDimensionRangeSet("dim1")); }
@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")); } }
@Test public void testAggregateWithAndFilter() { final float[] values = {0.15f, 0.27f}; final TestFloatColumnSelector selector = new TestFloatColumnSelector(values); FilteredAggregatorFactory factory = new FilteredAggregatorFactory( new DoubleSumAggregatorFactory("billy", "value"), new AndDimFilter(Lists.newArrayList(new NotDimFilter(new SelectorDimFilter("dim", "b", null)), new SelectorDimFilter("dim", "a", null)))); validateFilteredAggs(factory, values, selector); }
@Test public void testSerde() throws Exception { final TransformSpec transformSpec = new TransformSpec( new AndDimFilter( ImmutableList.of( new SelectorDimFilter("x", "foo", null), new SelectorDimFilter("f", "foobar", null), new SelectorDimFilter("g", "5.0", null) ) ), ImmutableList.of( new ExpressionTransform("f", "concat(x,y)", TestExprMacroTable.INSTANCE), new ExpressionTransform("g", "a + b", TestExprMacroTable.INSTANCE) ) ); final ObjectMapper jsonMapper = TestHelper.makeJsonMapper(); Assert.assertEquals( transformSpec, jsonMapper.readValue(jsonMapper.writeValueAsString(transformSpec), TransformSpec.class) ); } }
@Test public void testFilterOnTransforms() { // Filters are allowed to refer to transformed fields; double-check this. final TransformSpec transformSpec = new TransformSpec( new AndDimFilter( ImmutableList.of( new SelectorDimFilter("x", "foo", null), new SelectorDimFilter("f", "foobar", null), new SelectorDimFilter("g", "5.0", null) ) ), ImmutableList.of( new ExpressionTransform("f", "concat(x,y)", TestExprMacroTable.INSTANCE), new ExpressionTransform("g", "a + b", TestExprMacroTable.INSTANCE) ) ); final InputRowParser<Map<String, Object>> parser = transformSpec.decorate(PARSER); Assert.assertNotNull(parser.parseBatch(ROW1).get(0)); Assert.assertNull(parser.parseBatch(ROW2).get(0)); }
@Test public void testFullSelectNoResults() { ScanQuery query = newTestQuery() .intervals(I_0112_0114) .filters( new AndDimFilter( Arrays.asList( new SelectorDimFilter(QueryRunnerTestHelper.marketDimension, "spot", null), new SelectorDimFilter(QueryRunnerTestHelper.marketDimension, "foo", null) ) ) ) .build(); Iterable<ScanResultValue> results = runner.run(QueryPlus.wrap(query), new HashMap<>()).toList(); List<ScanResultValue> expectedResults = Collections.emptyList(); verify(expectedResults, populateNullColumnAtLastForQueryableIndexCase(results, "null_column")); }
@Test public void testSearchWithSingleFilter1() { List<SearchHit> expectedHits = new ArrayList<>(); expectedHits.add(new SearchHit(QueryRunnerTestHelper.qualityDimension, "mezzanine", 93)); checkSearchQuery( Druids.newSearchQueryBuilder() .dataSource(QueryRunnerTestHelper.dataSource) .granularity(QueryRunnerTestHelper.allGran) .filters( new AndDimFilter( Arrays.asList( new SelectorDimFilter(QueryRunnerTestHelper.marketDimension, "total_market", null), new SelectorDimFilter(QueryRunnerTestHelper.qualityDimension, "mezzanine", null) ))) .intervals(QueryRunnerTestHelper.fullOnIntervalSpec) .dimensions(QueryRunnerTestHelper.qualityDimension) .query("a") .build(), expectedHits ); }
private TopNQuery makeFilteredTopNQuery() { return new TopNQueryBuilder() .dataSource(dataSource) .granularity(allGran) .dimension(marketDimension) .metric(indexMetric) .threshold(3) .filters( new AndDimFilter( new SelectorDimFilter(marketDimension, "spot", null), new SelectorDimFilter(placementDimension, "preferred", null) ) ) .intervals(fullOnInterval) .aggregators( Lists.newArrayList( Iterables.concat( commonAggregators, Lists.newArrayList( new DoubleMaxAggregatorFactory("maxIndex", "index"), new DoubleMinAggregatorFactory("minIndex", "index") ) ) ) ) .postAggregators(Collections.singletonList(addRowsIndexConstant)) .build(); }
@Test public void testSearchMultiAndFilter() { List<SearchHit> expectedHits = new ArrayList<>(); expectedHits.add(new SearchHit(QueryRunnerTestHelper.qualityDimension, "automotive", 93)); DimFilter filter = new AndDimFilter( new SelectorDimFilter(QueryRunnerTestHelper.marketDimension, "spot", null), new SelectorDimFilter(QueryRunnerTestHelper.qualityDimension, "automotive", null) ); checkSearchQuery( Druids.newSearchQueryBuilder() .dataSource(QueryRunnerTestHelper.dataSource) .granularity(QueryRunnerTestHelper.allGran) .filters(filter) .dimensions(QueryRunnerTestHelper.qualityDimension) .intervals(QueryRunnerTestHelper.fullOnIntervalSpec) .query("a") .build(), expectedHits ); }
@Test public void testSearchWithFilterEmptyResults() { List<SearchHit> expectedHits = new ArrayList<>(); DimFilter filter = new AndDimFilter( new SelectorDimFilter(QueryRunnerTestHelper.marketDimension, "total_market", null), new SelectorDimFilter(QueryRunnerTestHelper.qualityDimension, "automotive", null) ); checkSearchQuery( Druids.newSearchQueryBuilder() .dataSource(QueryRunnerTestHelper.dataSource) .granularity(QueryRunnerTestHelper.allGran) .filters(filter) .intervals(QueryRunnerTestHelper.fullOnIntervalSpec) .query("a") .build(), expectedHits ); }
@Test public void testTopNWithNonExistentFilterMultiDim() { AndDimFilter andDimFilter = new AndDimFilter( new SelectorDimFilter(QueryRunnerTestHelper.marketDimension, "billyblank", null), new SelectorDimFilter(QueryRunnerTestHelper.qualityDimension, "mezzanine", null) ); TopNQuery query = new TopNQueryBuilder() .dataSource(QueryRunnerTestHelper.dataSource) .granularity(QueryRunnerTestHelper.allGran) .filters(andDimFilter) .dimension(QueryRunnerTestHelper.marketDimension) .metric(QueryRunnerTestHelper.indexMetric) .threshold(4) .intervals(QueryRunnerTestHelper.firstToThird) .aggregators(commonAggregators) .postAggregators(Collections.singletonList(QueryRunnerTestHelper.addRowsIndexConstant)) .build(); assertExpectedResults( Collections.singletonList( new Result<>(DateTimes.of("2011-04-01T00:00:00.000Z"), new TopNResultValue(Collections.emptyList())) ), query ); }
@Test public void testTimeseriesWithMultiValueDimFilterAndOr1() AndDimFilter andDimFilter = new AndDimFilter( new SelectorDimFilter(QueryRunnerTestHelper.marketDimension, "spot", null), new SelectorDimFilter(QueryRunnerTestHelper.placementishDimension, "a", null) .build(); AndDimFilter andDimFilter2 = new AndDimFilter( new SelectorDimFilter(QueryRunnerTestHelper.marketDimension, "spot", null), new SelectorDimFilter(QueryRunnerTestHelper.qualityDimension, "automotive", null)