/** * flatten to OR-AND filter, (A AND B AND ..) OR (C AND D AND ..) OR .. * flatten filter will ONLY contain AND and OR , no NOT will exist. * This will help to decide scan ranges. * * Notice that the flatten filter will ONLY be used for determining scan ranges, * The filter that is later pushed down into storage level is still the ORIGINAL * filter, since the flattened filter will be too "fat" to evaluate * * @return */ public TupleFilter flatFilter() { return flatFilter(KylinConfig.getInstanceFromEnv().getFlatFilterMaxChildrenSize()); }
protected TupleFilter flattenToOrAndFilter(TupleFilter filter) { if (filter == null) return null; TupleFilter flatFilter = filter.flatFilter(); // normalize to OR-AND filter if (flatFilter.getOperator() == TupleFilter.FilterOperatorEnum.AND) { LogicalTupleFilter f = new LogicalTupleFilter(TupleFilter.FilterOperatorEnum.OR); f.addChild(flatFilter); flatFilter = f; } if (flatFilter.getOperator() != TupleFilter.FilterOperatorEnum.OR) throw new IllegalStateException(); return flatFilter; }
@Test(expected = IllegalStateException.class) public void flatFilterTooFatTest() { TupleFilter topAndFilter = new LogicalTupleFilter(TupleFilter.FilterOperatorEnum.AND); for (int i = 0; i < 3; i++) { TupleFilter orFilter = new LogicalTupleFilter(FilterOperatorEnum.OR); String col = "col-" + i; for (int j = 0; j < 100; j++) { orFilter.addChild(createEQFilter(col, String.valueOf(j))); } topAndFilter.addChild(orFilter); } TupleFilter flatFilter = topAndFilter.flatFilter(500000); System.out.println(flatFilter); }
private TupleFilter flattenToOrAndFilter(TupleFilter filter) { if (filter == null) return null; TupleFilter flatFilter = filter.flatFilter(); // normalize to OR-AND filter if (flatFilter.getOperator() == FilterOperatorEnum.AND) { LogicalTupleFilter f = new LogicalTupleFilter(FilterOperatorEnum.OR); f.addChild(flatFilter); flatFilter = f; } if (flatFilter.getOperator() != FilterOperatorEnum.OR) throw new IllegalStateException(); return flatFilter; }
topAndFilter.addChild(orFilter2); TupleFilter flatFilter = topAndFilter.flatFilter(500000); Assert.assertEquals(6, flatFilter.children.size());
protected TupleFilter flattenToOrAndFilter(TupleFilter filter) { if (filter == null) return null; TupleFilter flatFilter = filter.flatFilter(); // normalize to OR-AND filter if (flatFilter.getOperator() == TupleFilter.FilterOperatorEnum.AND) { LogicalTupleFilter f = new LogicalTupleFilter(TupleFilter.FilterOperatorEnum.OR); f.addChild(flatFilter); flatFilter = f; } if (flatFilter.getOperator() != TupleFilter.FilterOperatorEnum.OR) throw new IllegalStateException(); return flatFilter; }