public HashMap<TblColRef, Object> findMustEqualColsAndValues(Collection<TblColRef> lookingForCols) { HashMap<TblColRef, Object> result = new HashMap<>(); findMustEqualColsAndValues(this, lookingForCols, result); return result; }
private void findMustEqualColsAndValues(TupleFilter filter, Collection<TblColRef> lookingForCols, HashMap<TblColRef, Object> result) { if (filter instanceof CompareTupleFilter) { CompareTupleFilter comp = (CompareTupleFilter) filter; TblColRef col = comp.getColumn(); if (lookingForCols.contains(col)) { if (comp.getOperator() == FilterOperatorEnum.EQ) result.put(col, comp.getFirstValue()); else if (comp.getOperator() == FilterOperatorEnum.ISNULL) result.put(col, null); } return; } if (filter instanceof LogicalTupleFilter) { LogicalTupleFilter logic = (LogicalTupleFilter) filter; if (logic.getOperator() == FilterOperatorEnum.AND) { for (TupleFilter child : logic.getChildren()) findMustEqualColsAndValues(child, lookingForCols, result); } return; } }
@Test public void testFindMustEqualColsAndValues() { TableDesc tbl = TableDesc.mockup("mockup_table"); TblColRef colA = TblColRef.mockup(tbl, 0, "A", "bigint"); TblColRef colB = TblColRef.mockup(tbl, 1, "B", "char(256)"); Set<TblColRef> cols = Sets.newHashSet(colA, colB); { TupleFilter f = compare(colA, FilterOperatorEnum.EQ, "1234"); Assert.assertEquals(map(colA, "1234"), f.findMustEqualColsAndValues(cols)); } { TupleFilter f = compare(colA, FilterOperatorEnum.ISNULL); Assert.assertEquals(map(colA, null), f.findMustEqualColsAndValues(cols)); } { TupleFilter f = and(compare(colA, FilterOperatorEnum.ISNULL), compare(colB, FilterOperatorEnum.EQ, "1234")); Assert.assertEquals(map(colA, null, colB, "1234"), f.findMustEqualColsAndValues(cols)); Assert.assertTrue(not(f).findMustEqualColsAndValues(cols).isEmpty()); } { TupleFilter f = compare(colA, FilterOperatorEnum.LT, "1234"); Assert.assertTrue(f.findMustEqualColsAndValues(cols).isEmpty()); } }
public HashMap<TblColRef, Object> findMustEqualColsAndValues(Collection<TblColRef> lookingForCols) { HashMap<TblColRef, Object> result = new HashMap<>(); findMustEqualColsAndValues(this, lookingForCols, result); return result; }
private void findMustEqualColsAndValues(TupleFilter filter, Collection<TblColRef> lookingForCols, HashMap<TblColRef, Object> result) { if (filter instanceof CompareTupleFilter) { CompareTupleFilter comp = (CompareTupleFilter) filter; TblColRef col = comp.getColumn(); if (lookingForCols.contains(col)) { if (comp.getOperator() == FilterOperatorEnum.EQ) result.put(col, comp.getFirstValue()); else if (comp.getOperator() == FilterOperatorEnum.ISNULL) result.put(col, null); } return; } if (filter instanceof LogicalTupleFilter) { LogicalTupleFilter logic = (LogicalTupleFilter) filter; if (logic.getOperator() == FilterOperatorEnum.AND) { for (TupleFilter child : logic.getChildren()) findMustEqualColsAndValues(child, lookingForCols, result); } return; } }