@Override public int hashCode() { return Objects.hash(getOperator(), getFilters()); } }
public static Filter andFilterAtIndex(Filter currentFilter, int index, Filter newFilter) { if (currentFilter == null) { return newFilter; } else if (newFilter == null) { return currentFilter; } List<Filter> allFilters = Lists.newArrayList(); if (currentFilter instanceof FilterList && ((FilterList)currentFilter).getOperator() == FilterList.Operator.MUST_PASS_ALL) { allFilters.addAll(((FilterList)currentFilter).getFilters()); } else { allFilters.add(currentFilter); } allFilters.add((index == LAST_FILTER ? allFilters.size() : index), newFilter); return new FilterList(FilterList.Operator.MUST_PASS_ALL, allFilters); }
public static Filter orFilterAtIndex(Filter currentFilter, int index, Filter newFilter) { if (currentFilter == null) { return newFilter; } else if (newFilter == null) { return currentFilter; } List<Filter> allFilters = Lists.newArrayList(); if (currentFilter instanceof FilterList && ((FilterList)currentFilter).getOperator() == FilterList.Operator.MUST_PASS_ONE) { allFilters.addAll(((FilterList)currentFilter).getFilters()); } else { allFilters.add(currentFilter); } allFilters.add((index == LAST_FILTER ? allFilters.size() : index), newFilter); return new FilterList(FilterList.Operator.MUST_PASS_ONE, allFilters); }
/** * @param other * @return true if and only if the fields of the filter that are serialized are equal to the * corresponding fields in other. Used for testing. */ @Override boolean areSerializedFieldsEqual(Filter other) { if (other == this) return true; if (!(other instanceof FilterList)) return false; FilterList o = (FilterList) other; return this.getOperator().equals(o.getOperator()) && ((this.getFilters() == o.getFilters()) || this.getFilters().equals(o.getFilters())); }
} break; case FilterList: this.op = ((FilterList)filter).getOperator().toString(); this.filters = new ArrayList<>(); for (Filter child: ((FilterList)filter).getFilters()) {
@Test public void testCompoundFilter2() throws IOException { String filterString = "(PrefixFilter('realtime') AND QualifierFilter (>=, 'binary:e'))" + "OR FamilyFilter (=, 'binary:qualifier') "; FilterList filterList = doTestFilter(filterString, FilterList.class); ArrayList<Filter> filterListFilters = (ArrayList<Filter>) filterList.getFilters(); assertTrue(filterListFilters.get(0) instanceof FilterList); assertTrue(filterListFilters.get(1) instanceof FamilyFilter); assertEquals(FilterList.Operator.MUST_PASS_ONE, filterList.getOperator()); filterList = (FilterList) filterListFilters.get(0); FamilyFilter familyFilter = (FamilyFilter) filterListFilters.get(1); filterListFilters = (ArrayList<Filter>)filterList.getFilters(); assertTrue(filterListFilters.get(0) instanceof PrefixFilter); assertTrue(filterListFilters.get(1) instanceof QualifierFilter); assertEquals(FilterList.Operator.MUST_PASS_ALL, filterList.getOperator()); assertEquals(CompareOperator.EQUAL, familyFilter.getCompareOperator()); assertTrue(familyFilter.getComparator() instanceof BinaryComparator); BinaryComparator binaryComparator = (BinaryComparator) familyFilter.getComparator(); assertEquals("qualifier", new String(binaryComparator.getValue(), StandardCharsets.UTF_8)); PrefixFilter prefixFilter = (PrefixFilter) filterListFilters.get(0); byte [] prefix = prefixFilter.getPrefix(); assertEquals("realtime", new String(prefix, StandardCharsets.UTF_8)); QualifierFilter qualifierFilter = (QualifierFilter) filterListFilters.get(1); assertEquals(CompareOperator.GREATER_OR_EQUAL, qualifierFilter.getCompareOperator()); assertTrue(qualifierFilter.getComparator() instanceof BinaryComparator); binaryComparator = (BinaryComparator) qualifierFilter.getComparator(); assertEquals("e", new String(binaryComparator.getValue(), StandardCharsets.UTF_8)); }
public static Filter stripSkipScanFilter(Filter filter) { if (filter == null) { return null; } if (!(filter instanceof FilterList)) { return filter instanceof BooleanExpressionFilter ? filter : null; } FilterList filterList = (FilterList) filter; if (filterList.getOperator() != FilterList.Operator.MUST_PASS_ALL) { return filter; } List<Filter> list = new ArrayList<>(); for (Filter f : filterList.getFilters()) { Filter stripped = stripSkipScanFilter(f); if (stripped != null) { list.add(stripped); } } return list.isEmpty() ? null : (list.size() == 1 ? list.get(0) : new FilterList(FilterList.Operator.MUST_PASS_ALL, list)); }
/** * @param other * @return true if and only if the fields of the filter that are serialized are equal to the * corresponding fields in other. Used for testing. */ @Override boolean areSerializedFieldsEqual(Filter other) { if (other == this) return true; if (!(other instanceof FilterList)) return false; FilterList o = (FilterList) other; return this.getOperator().equals(o.getOperator()) && ((this.getFilters() == o.getFilters()) || this.getFilters().equals(o.getFilters())); }
public static void andFilterAtBeginning(Scan scan, Filter andWithFilter) { if (andWithFilter == null) { return; } Filter filter = scan.getFilter(); if (filter == null) { scan.setFilter(andWithFilter); } else if (filter instanceof FilterList && ((FilterList)filter).getOperator() == FilterList.Operator.MUST_PASS_ALL) { FilterList filterList = (FilterList)filter; List<Filter> allFilters = new ArrayList<Filter>(filterList.getFilters().size() + 1); allFilters.add(andWithFilter); allFilters.addAll(filterList.getFilters()); scan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL,allFilters)); } else { scan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL,Arrays.asList(andWithFilter, filter))); } }
public static void andFilterAtEnd(Scan scan, Filter andWithFilter) { if (andWithFilter == null) { return; } Filter filter = scan.getFilter(); if (filter == null) { scan.setFilter(andWithFilter); } else if (filter instanceof FilterList && ((FilterList)filter).getOperator() == FilterList.Operator.MUST_PASS_ALL) { FilterList filterList = (FilterList)filter; List<Filter> allFilters = new ArrayList<Filter>(filterList.getFilters().size() + 1); allFilters.addAll(filterList.getFilters()); allFilters.add(andWithFilter); scan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL,allFilters)); } else { scan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL,Arrays.asList(filter, andWithFilter))); } }
public static void andFilterAtEnd(Scan scan, Filter andWithFilter) { if (andWithFilter == null) { return; } Filter filter = scan.getFilter(); if (filter == null) { scan.setFilter(andWithFilter); } else if (filter instanceof FilterList && ((FilterList)filter).getOperator() == FilterList.Operator.MUST_PASS_ALL) { FilterList filterList = (FilterList)filter; List<Filter> allFilters = new ArrayList<Filter>(filterList.getFilters().size() + 1); allFilters.addAll(filterList.getFilters()); allFilters.add(andWithFilter); scan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL,allFilters)); } else { scan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL,Arrays.asList(filter, andWithFilter))); } }
public static void andFilterAtBeginning(Scan scan, Filter andWithFilter) { if (andWithFilter == null) { return; } Filter filter = scan.getFilter(); if (filter == null) { scan.setFilter(andWithFilter); } else if (filter instanceof FilterList && ((FilterList)filter).getOperator() == FilterList.Operator.MUST_PASS_ALL) { FilterList filterList = (FilterList)filter; List<Filter> allFilters = new ArrayList<Filter>(filterList.getFilters().size() + 1); allFilters.add(andWithFilter); allFilters.addAll(filterList.getFilters()); scan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL,allFilters)); } else { scan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL,Arrays.asList(andWithFilter, filter))); } }
assertTrue(filter instanceof FilterList); FilterList filterList = (FilterList)filter; assertEquals(FilterList.Operator.MUST_PASS_ALL, filterList.getOperator()); assertEquals(2, filterList.getFilters().size()); assertTrue(filterList.getFilters().get(0) instanceof SkipScanFilter);
private static boolean isFilterListSupported(FilterList list, PageFilter currentFilter) { // The PageFilter must be the last filter in the FilterList && it must only appear once // in the FilterList (perhaps this second part is a pathological case that isn't worthy // of the cycles required to traverse the list)... return list.getOperator() == Operator.MUST_PASS_ALL && list.getFilters().indexOf(currentFilter) == list.getFilters().size() - 1; } }
private static boolean isFilterListSupported(FilterList list, PageFilter currentFilter) { // The PageFilter must be the last filter in the FilterList && it must only appear once // in the FilterList (perhaps this second part is a pathological case that isn't worthy // of the cycles required to traverse the list)... return list.getOperator() == Operator.MUST_PASS_ALL && list.getFilters().indexOf(currentFilter) == list.getFilters().size() - 1; } }
/** * Wraps an existing {@link FilterList} filter into a {@link ModelAwareFilterList}. */ public static ModelAwareFilterList wrap(FilterList filter) { return new ModelAwareFilterList(filter.getOperator(), filter.getFilters()); }
@Test public void testOrPKWithAndPKAndNotPK() throws SQLException { String query = "select * from bugTable where ID = 'i1' or (ID = 'i2' and company = 'c3')"; PhoenixConnection pconn = DriverManager.getConnection(getUrl(), PropertiesUtil.deepCopy(TEST_PROPERTIES)).unwrap(PhoenixConnection.class); pconn.createStatement().execute("create table bugTable(ID varchar primary key,company varchar)"); PhoenixPreparedStatement pstmt = newPreparedStatement(pconn, query); QueryPlan plan = pstmt.optimizeQuery(); Scan scan = plan.getContext().getScan(); Filter filter = scan.getFilter(); Expression idExpression = new ColumnRef(plan.getTableRef(), plan.getTableRef().getTable().getColumnForColumnName("ID").getPosition()).newColumnExpression(); Expression id = new RowKeyColumnExpression(idExpression,new RowKeyValueAccessor(plan.getTableRef().getTable().getPKColumns(),0)); Expression company = new KeyValueColumnExpression(plan.getTableRef().getTable().getColumnForColumnName("COMPANY")); // FilterList has no equals implementation assertTrue(filter instanceof FilterList); FilterList filterList = (FilterList)filter; assertEquals(FilterList.Operator.MUST_PASS_ALL, filterList.getOperator()); assertEquals( Arrays.asList( new SkipScanFilter( ImmutableList.of(Arrays.asList( pointRange("i1"), pointRange("i2"))), SchemaUtil.VAR_BINARY_SCHEMA), singleKVFilter( or(constantComparison(CompareOp.EQUAL,id,"i1"), and(constantComparison(CompareOp.EQUAL,id,"i2"), constantComparison(CompareOp.EQUAL,company,"c3"))))), filterList.getFilters()); }
/** * @param other * @return true if and only if the fields of the filter that are serialized are equal to the * corresponding fields in other. Used for testing. */ @Override boolean areSerializedFieldsEqual(Filter other) { if (other == this) return true; if (!(other instanceof FilterList)) return false; FilterList o = (FilterList) other; return this.getOperator().equals(o.getOperator()) && ((this.getFilters() == o.getFilters()) || this.getFilters().equals(o.getFilters())); }
/** * @param other * @return true if and only if the fields of the filter that are serialized * are equal to the corresponding fields in other. Used for testing. */ boolean areSerializedFieldsEqual(Filter other) { if (other == this) return true; if (!(other instanceof FilterList)) return false; FilterList o = (FilterList)other; return this.getOperator().equals(o.getOperator()) && ((this.getFilters() == o.getFilters()) || this.getFilters().equals(o.getFilters())); }
FilterList filterList = (FilterList)scan.getFilter(); assertTrue(filterList.getOperator() == Operator.MUST_PASS_ALL); assertEquals(filterList.getFilters().size(),2); assertTrue(filterList.getFilters().get(0) instanceof SkipScanFilter);