private ColumnTupleFilter col(int i) { return new ColumnTupleFilter(info.colRef(i)); }
private ColumnTupleFilter col(int i) { return new ColumnTupleFilter(info.colRef(i)); }
@Override public TblColRef mapCol(TblColRef col) { int gtColIdx = mapping.getIndexOf(col); if (gtColIdx < 0 && innerFuncMap.get(col) != null) { gtColIdx = mapping.getIndexOf(innerFuncMap.get(col)); } return info.colRef(gtColIdx); } };
public void validateColRef(TblColRef ref) { TblColRef expected = colRef(ref.getColumnDesc().getZeroBasedIndex()); if (!expected.equals(ref)) throw new IllegalArgumentException(); }
@Before public void setup() throws IOException { this.createTestMetadata(); table = newTestTable(); info = table.getInfo(); timeComp0 = compare(info.colRef(0), FilterOperatorEnum.LT, enc(info, 0, "2015-01-14")); timeComp1 = compare(info.colRef(0), FilterOperatorEnum.GT, enc(info, 0, "2015-01-14")); timeComp2 = compare(info.colRef(0), FilterOperatorEnum.LT, enc(info, 0, "2015-01-13")); timeComp3 = compare(info.colRef(0), FilterOperatorEnum.LT, enc(info, 0, "2015-01-15")); timeComp4 = compare(info.colRef(0), FilterOperatorEnum.EQ, enc(info, 0, "2015-01-15")); timeComp5 = compare(info.colRef(0), FilterOperatorEnum.GT, enc(info, 0, "2015-01-15")); timeComp6 = compare(info.colRef(0), FilterOperatorEnum.EQ, enc(info, 0, "2015-01-14")); timeComp7 = compare(info.colRef(0), FilterOperatorEnum.EQ, enc(info, 0, "1970-01-01")); ageComp1 = compare(info.colRef(1), FilterOperatorEnum.EQ, enc(info, 1, "10")); ageComp2 = compare(info.colRef(1), FilterOperatorEnum.EQ, enc(info, 1, "20")); ageComp3 = compare(info.colRef(1), FilterOperatorEnum.EQ, enc(info, 1, "30")); ageComp4 = compare(info.colRef(1), FilterOperatorEnum.NEQ, enc(info, 1, "30")); }
@Test public void verifySegmentSkipping2() { { LogicalTupleFilter filter = and(timeComp0, ageComp1); CubeScanRangePlanner planner = new CubeScanRangePlanner(info, info.colRef(0), filter); List<GTScanRange> r = planner.planScanRanges(); assertEquals(1, r.size());//scan range are [close,close] assertEquals("[null, 10]-[1421193600000, 10]", r.get(0).toString()); assertEquals(1, r.get(0).fuzzyKeys.size()); assertEquals("[[null, 10, null, null, null]]", r.get(0).fuzzyKeys.toString()); } { LogicalTupleFilter filter = and(timeComp5, ageComp1); CubeScanRangePlanner planner = new CubeScanRangePlanner(info, info.colRef(0), filter); List<GTScanRange> r = planner.planScanRanges(); assertEquals(1, r.size());//scan range are [close,close] } }
@Override public TupleFilter onSerialize(TupleFilter filter) { if (filter == null) return null; // In case of NOT(unEvaluatableFilter), we should immediately replace it as TRUE, // Otherwise, unEvaluatableFilter will later be replace with TRUE and NOT(unEvaluatableFilter) // will always return FALSE. if (filter.getOperator() == FilterOperatorEnum.NOT && !TupleFilter.isEvaluableRecursively(filter)) { TupleFilter.collectColumns(filter, unevaluatableColumnCollector); return ConstantTupleFilter.TRUE; } // shortcut for unEvaluatable filter if (!filter.isEvaluable()) { TupleFilter.collectColumns(filter, unevaluatableColumnCollector); return ConstantTupleFilter.TRUE; } // map to column onto grid table if (colMapping != null && filter instanceof ColumnTupleFilter) { ColumnTupleFilter colFilter = (ColumnTupleFilter) filter; int gtColIdx = mapCol(colFilter.getColumn()); return new ColumnTupleFilter(info.colRef(gtColIdx)); } // encode constants if (useEncodeConstants && filter instanceof CompareTupleFilter) { return encodeConstants((CompareTupleFilter) filter); } return filter; }
private void compareTwoGTInfo(GTInfo info, GTInfo sInfo) { Assert.assertEquals(info.tableName, sInfo.tableName); Assert.assertEquals(info.primaryKey, sInfo.primaryKey); for (int i = 0; i < info.colTypes.length; i++) { Assert.assertEquals(info.codeSystem.maxCodeLength(i), sInfo.codeSystem.maxCodeLength(i)); Assert.assertTrue(info.codeSystem.maxCodeLength(i) > 0); Assert.assertEquals(info.colRef(i), sInfo.colRef(i)); } Assert.assertArrayEquals(info.colBlocks, sInfo.colBlocks); Assert.assertEquals(info.getRowBlockSize(), sInfo.getRowBlockSize()); Assert.assertEquals(info.rowBlockSize, sInfo.rowBlockSize); } }
CubeScanRangePlanner planner = new CubeScanRangePlanner(info, info.colRef(0), filter); List<GTScanRange> r = planner.planScanRanges(); assertEquals(1, r.size());//scan range are [close,close] CubeScanRangePlanner planner = new CubeScanRangePlanner(info, info.colRef(0), filter); List<GTScanRange> r = planner.planScanRanges(); assertEquals(1, r.size()); CubeScanRangePlanner planner = new CubeScanRangePlanner(info, info.colRef(0), filter); List<GTScanRange> r = planner.planScanRanges(); assertEquals(1, r.size()); CubeScanRangePlanner planner = new CubeScanRangePlanner(info, info.colRef(0), filter); List<GTScanRange> r = planner.planScanRanges(); assertEquals(1, r.size()); CubeScanRangePlanner planner = new CubeScanRangePlanner(info, info.colRef(0), filter); List<GTScanRange> r = planner.planScanRanges(); assertEquals(2, r.size()); CubeScanRangePlanner planner = new CubeScanRangePlanner(info, info.colRef(0), filter); List<GTScanRange> r = planner.planScanRanges(); assertEquals(2, r.size()); CubeScanRangePlanner planner = new CubeScanRangePlanner(info, info.colRef(0), filter); List<GTScanRange> r = planner.planScanRanges(); assertEquals(0, r.size()); CubeScanRangePlanner planner = new CubeScanRangePlanner(info, info.colRef(0), filter);
@Test public void verifyScanWithUnevaluatableFilter() throws IOException { GTInfo info = table.getInfo(); CompareTupleFilter fComp = compare(info.colRef(0), FilterOperatorEnum.GT, enc(info, 0, "2015-01-14")); ExtractTupleFilter fUnevaluatable = unevaluatable(info.colRef(1)); LogicalTupleFilter fNotPlusUnevaluatable = not(unevaluatable(info.colRef(1))); LogicalTupleFilter filter = and(fComp, fUnevaluatable, fNotPlusUnevaluatable); GTScanRequest req = new GTScanRequestBuilder().setInfo(info).setRanges(null).setDimensions(null) .setAggrGroupBy(setOf(0)).setAggrMetrics(setOf(3)).setAggrMetricsFuncs(new String[] { "sum" }) .setFilterPushDown(filter).createGTScanRequest(); // note the unEvaluatable column 1 in filter is added to group by assertEquals( "GTScanRequest [range=[[null, null]-[null, null]], columns={0, 1, 3}, filterPushDown=AND [UNKNOWN_MODEL:NULL.GT_MOCKUP_TABLE.0 GT [\\x00\\x00\\x01J\\xE5\\xBD\\x5C\\x00], [null], [null]], aggrGroupBy={0, 1}, aggrMetrics={3}, aggrMetricsFuncs=[sum]]", req.toString()); doScanAndVerify(table, useDeserializedGTScanRequest(req), "[1421280000000, 20, null, 20, null]", "[1421280000000, 30, null, 10, null]", "[1421366400000, 20, null, 20, null]", "[1421366400000, 30, null, 20, null]", "[1421452800000, 10, null, 10, null]"); }
public static CompareTupleFilter getCompareTupleFilter(int col, Object value) { TblColRef colRef = gtInfo.colRef(col); ColumnTupleFilter colFilter = new ColumnTupleFilter(colRef); ByteArray space = new ByteArray(gtInfo.getCodeSystem().maxCodeLength(col)); gtInfo.getCodeSystem().encodeColumnValue(col, value, space.asBuffer()); ConstantTupleFilter constFilter = new ConstantTupleFilter(space); CompareTupleFilter compareFilter = new CompareTupleFilter(TupleFilter.FilterOperatorEnum.EQ); compareFilter.addChild(colFilter); compareFilter.addChild(constFilter); return compareFilter; }
TupleExpression colExpression = new ColumnTupleExpression(gtInfo.colRef(2)); TupleExpression constExpression1 = new NumberTupleExpression(1); TupleExpression constExpression2 = new NumberTupleExpression(2);
@Test public void verifyScanWithEvaluatableFilter() throws IOException { GTInfo info = table.getInfo(); CompareTupleFilter fComp1 = compare(info.colRef(0), FilterOperatorEnum.GT, enc(info, 0, "2015-01-14")); CompareTupleFilter fComp2 = compare(info.colRef(1), FilterOperatorEnum.GT, enc(info, 1, "10")); LogicalTupleFilter filter = and(fComp1, fComp2); GTScanRequest req = new GTScanRequestBuilder().setInfo(info).setRanges(null).setDimensions(null) .setAggrGroupBy(setOf(0)).setAggrMetrics(setOf(3)).setAggrMetricsFuncs(new String[] { "sum" }) .setFilterPushDown(filter).createGTScanRequest(); // note the evaluatable column 1 in filter is added to returned columns but not in group by assertEquals( "GTScanRequest [range=[[null, null]-[null, null]], columns={0, 1, 3}, filterPushDown=AND [UNKNOWN_MODEL:NULL.GT_MOCKUP_TABLE.0 GT [\\x00\\x00\\x01J\\xE5\\xBD\\x5C\\x00], UNKNOWN_MODEL:NULL.GT_MOCKUP_TABLE.1 GT [\\x00]], aggrGroupBy={0}, aggrMetrics={3}, aggrMetricsFuncs=[sum]]", req.toString()); doScanAndVerify(table, useDeserializedGTScanRequest(req), "[1421280000000, 20, null, 30, null]", "[1421366400000, 20, null, 40, null]"); }
private ColumnTupleFilter col(int i) { return new ColumnTupleFilter(info.colRef(i)); }
private ColumnTupleFilter col(int i) { return new ColumnTupleFilter(info.colRef(i)); }
@Override public TblColRef mapCol(TblColRef col) { int gtColIdx = mapping.getIndexOf(col); if (gtColIdx < 0 && innerFuncMap.get(col) != null) { gtColIdx = mapping.getIndexOf(innerFuncMap.get(col)); } return info.colRef(gtColIdx); } };
public void validateColRef(TblColRef ref) { TblColRef expected = colRef(ref.getColumnDesc().getZeroBasedIndex()); if (!expected.equals(ref)) throw new IllegalArgumentException(); }
@Override public TupleFilter onSerialize(TupleFilter filter) { if (filter == null) return null; // In case of NOT(unEvaluatableFilter), we should immediately replace it as TRUE, // Otherwise, unEvaluatableFilter will later be replace with TRUE and NOT(unEvaluatableFilter) // will always return FALSE. if (filter.getOperator() == FilterOperatorEnum.NOT && !TupleFilter.isEvaluableRecursively(filter)) { TupleFilter.collectColumns(filter, unevaluatableColumnCollector); return ConstantTupleFilter.TRUE; } // shortcut for unEvaluatable filter if (!filter.isEvaluable()) { TupleFilter.collectColumns(filter, unevaluatableColumnCollector); return ConstantTupleFilter.TRUE; } // map to column onto grid table if (colMapping != null && filter instanceof ColumnTupleFilter) { ColumnTupleFilter colFilter = (ColumnTupleFilter) filter; int gtColIdx = mapCol(colFilter.getColumn()); return new ColumnTupleFilter(info.colRef(gtColIdx)); } // encode constants if (useEncodeConstants && filter instanceof CompareTupleFilter) { return encodeConstants((CompareTupleFilter) filter); } return filter; }