/** * @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())); }
@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); }
private FilterList generateTimeFilterList(VisitFilter visitFilter) { FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL); if (visitFilter.lastModStart >= 0) { // NOTE: Negative value does not work in its binary form SingleColumnValueFilter timeStartFilter = new SingleColumnValueFilter(B_FAMILY, B_COLUMN_TS, CompareFilter.CompareOp.GREATER_OR_EQUAL, Bytes.toBytes(visitFilter.lastModStart)); filterList.addFilter(timeStartFilter); } if (visitFilter.lastModEndExclusive != Long.MAX_VALUE) { SingleColumnValueFilter timeEndFilter = new SingleColumnValueFilter(B_FAMILY, B_COLUMN_TS, CompareFilter.CompareOp.LESS, Bytes.toBytes(visitFilter.lastModEndExclusive)); filterList.addFilter(timeEndFilter); } return filterList.getFilters().size() == 0 ? null : filterList; }
@Test public void testCompoundFilter1() throws IOException { String filterString = " (PrefixFilter ('realtime')AND FirstKeyOnlyFilter())"; FilterList filterList = doTestFilter(filterString, FilterList.class); ArrayList<Filter> filters = (ArrayList<Filter>) filterList.getFilters(); assertTrue(filters.get(0) instanceof PrefixFilter); assertTrue(filters.get(1) instanceof FirstKeyOnlyFilter); PrefixFilter PrefixFilter = (PrefixFilter) filters.get(0); byte [] prefix = PrefixFilter.getPrefix(); assertEquals("realtime", new String(prefix, StandardCharsets.UTF_8)); FirstKeyOnlyFilter firstKeyOnlyFilter = (FirstKeyOnlyFilter) filters.get(1); }
@Test public void testPrecedence1() throws IOException { String filterString = " (PrefixFilter ('realtime')AND FirstKeyOnlyFilter()" + " OR KeyOnlyFilter())"; FilterList filterList = doTestFilter(filterString, FilterList.class); ArrayList<Filter> filters = (ArrayList<Filter>) filterList.getFilters(); assertTrue(filters.get(0) instanceof FilterList); assertTrue(filters.get(1) instanceof KeyOnlyFilter); filterList = (FilterList) filters.get(0); filters = (ArrayList<Filter>) filterList.getFilters(); assertTrue(filters.get(0) instanceof PrefixFilter); assertTrue(filters.get(1) instanceof FirstKeyOnlyFilter); PrefixFilter prefixFilter = (PrefixFilter)filters.get(0); byte [] prefix = prefixFilter.getPrefix(); assertEquals("realtime", new String(prefix, StandardCharsets.UTF_8)); }
this.op = ((FilterList)filter).getOperator().toString(); this.filters = new ArrayList<>(); for (Filter child: ((FilterList)filter).getFilters()) { this.filters.add(new FilterModel(child));
@Test public void testPrecedence2() throws IOException { String filterString = " PrefixFilter ('realtime')AND SKIP FirstKeyOnlyFilter()" + "OR KeyOnlyFilter()"; FilterList filterList = doTestFilter(filterString, FilterList.class); ArrayList<Filter> filters = (ArrayList<Filter>) filterList.getFilters(); assertTrue(filters.get(0) instanceof FilterList); assertTrue(filters.get(1) instanceof KeyOnlyFilter); filterList = (FilterList) filters.get(0); filters = (ArrayList<Filter>) filterList.getFilters(); assertTrue(filters.get(0) instanceof PrefixFilter); assertTrue(filters.get(1) instanceof SkipFilter); PrefixFilter prefixFilter = (PrefixFilter)filters.get(0); byte [] prefix = prefixFilter.getPrefix(); assertEquals("realtime", new String(prefix, StandardCharsets.UTF_8)); SkipFilter skipFilter = (SkipFilter)filters.get(1); assertTrue(skipFilter.getFilter() instanceof FirstKeyOnlyFilter); }
List<Filter> filters = ((FilterList)get2.getFilter()).getFilters(); assertEquals(3, filters.size()); assertEquals("test.MockFilter", filters.get(0).getClass().getName());
@Test public void testCompoundFilter5() throws IOException { String filterStr = "(ValueFilter(!=, 'substring:pre'))"; ValueFilter valueFilter = doTestFilter(filterStr, ValueFilter.class); assertTrue(valueFilter.getComparator() instanceof SubstringComparator); filterStr = "(ValueFilter(>=,'binary:x') AND (ValueFilter(<=,'binary:y')))" + " OR ValueFilter(=,'binary:ab')"; filter = f.parseFilterString(filterStr); assertTrue(filter instanceof FilterList); List<Filter> list = ((FilterList) filter).getFilters(); assertEquals(2, list.size()); assertTrue(list.get(0) instanceof FilterList); assertTrue(list.get(1) instanceof ValueFilter); }
@Test public void testCompoundFilter3() throws IOException { String filterString = " ColumnPrefixFilter ('realtime')AND " + "FirstKeyOnlyFilter() OR SKIP FamilyFilter(=, 'substring:hihi')"; FilterList filterList = doTestFilter(filterString, FilterList.class); ArrayList<Filter> filters = (ArrayList<Filter>) filterList.getFilters(); assertTrue(filters.get(0) instanceof FilterList); assertTrue(filters.get(1) instanceof SkipFilter); filterList = (FilterList) filters.get(0); SkipFilter skipFilter = (SkipFilter) filters.get(1); filters = (ArrayList<Filter>) filterList.getFilters(); assertTrue(filters.get(0) instanceof ColumnPrefixFilter); assertTrue(filters.get(1) instanceof FirstKeyOnlyFilter); ColumnPrefixFilter columnPrefixFilter = (ColumnPrefixFilter) filters.get(0); byte [] columnPrefix = columnPrefixFilter.getPrefix(); assertEquals("realtime", new String(columnPrefix, StandardCharsets.UTF_8)); FirstKeyOnlyFilter firstKeyOnlyFilter = (FirstKeyOnlyFilter) filters.get(1); assertTrue(skipFilter.getFilter() instanceof FamilyFilter); FamilyFilter familyFilter = (FamilyFilter) skipFilter.getFilter(); assertEquals(CompareOperator.EQUAL, familyFilter.getCompareOperator()); assertTrue(familyFilter.getComparator() instanceof SubstringComparator); SubstringComparator substringComparator = (SubstringComparator) familyFilter.getComparator(); assertEquals("hihi", new String(substringComparator.getValue(), StandardCharsets.UTF_8)); }
@Test public void testCompoundFilter4() throws IOException { String filterString = " ColumnPrefixFilter ('realtime') OR " + "FirstKeyOnlyFilter() OR SKIP FamilyFilter(=, 'substring:hihi')"; FilterList filterList = doTestFilter(filterString, FilterList.class); ArrayList<Filter> filters = (ArrayList<Filter>) filterList.getFilters(); assertTrue(filters.get(0) instanceof ColumnPrefixFilter); assertTrue(filters.get(1) instanceof FirstKeyOnlyFilter); assertTrue(filters.get(2) instanceof SkipFilter); ColumnPrefixFilter columnPrefixFilter = (ColumnPrefixFilter) filters.get(0); FirstKeyOnlyFilter firstKeyOnlyFilter = (FirstKeyOnlyFilter) filters.get(1); SkipFilter skipFilter = (SkipFilter) filters.get(2); byte [] columnPrefix = columnPrefixFilter.getPrefix(); assertEquals("realtime", new String(columnPrefix, StandardCharsets.UTF_8)); assertTrue(skipFilter.getFilter() instanceof FamilyFilter); FamilyFilter familyFilter = (FamilyFilter) skipFilter.getFilter(); assertEquals(CompareOperator.EQUAL, familyFilter.getCompareOperator()); assertTrue(familyFilter.getComparator() instanceof SubstringComparator); SubstringComparator substringComparator = (SubstringComparator) familyFilter.getComparator(); assertEquals("hihi", new String(substringComparator.getValue(), StandardCharsets.UTF_8)); }
@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)); }
/** * @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 Iterator<Filter> getFilterIterator(Scan scan) { Iterator<Filter> filterIterator; Filter topLevelFilter = scan.getFilter(); if (topLevelFilter == null) { filterIterator = Collections.emptyIterator(); } else if (topLevelFilter instanceof FilterList) { filterIterator = ((FilterList) topLevelFilter).getFilters().iterator(); } else { filterIterator = Iterators.singletonIterator(topLevelFilter); } return filterIterator; }
private static boolean usingSkipScan(Scan scan) { Filter filter = scan.getFilter(); if (filter instanceof FilterList) { FilterList filterList = (FilterList) filter; for (Filter childFilter : filterList.getFilters()) { if (childFilter instanceof SkipScanFilter) { return true; } } return false; } return filter instanceof SkipScanFilter; }
private static boolean usingSkipScan(Scan scan) { Filter filter = scan.getFilter(); if (filter instanceof FilterList) { FilterList filterList = (FilterList) filter; for (Filter childFilter : filterList.getFilters()) { if (childFilter instanceof SkipScanFilter) { return true; } } return false; } return filter instanceof SkipScanFilter; }
public static void setRowKeyOffset(Scan scan, int offset) { Filter filter = scan.getFilter(); if (filter == null) { return; } if (filter instanceof FilterList) { FilterList filterList = (FilterList)filter; for (Filter childFilter : filterList.getFilters()) { setRowKeyOffset(childFilter, offset); } } else { setRowKeyOffset(filter, offset); } }
public static void setQualifierRangesOnFilter(Scan scan, Pair<Integer, Integer> minMaxQualifiers) { Filter filter = scan.getFilter(); if (filter != null) { if (filter instanceof FilterList) { for (Filter f : ((FilterList)filter).getFilters()) { if (f instanceof MultiEncodedCQKeyValueComparisonFilter) { ((MultiEncodedCQKeyValueComparisonFilter)f).setMinMaxQualifierRange(minMaxQualifiers); } } } else if (filter instanceof MultiEncodedCQKeyValueComparisonFilter) { ((MultiEncodedCQKeyValueComparisonFilter)filter).setMinMaxQualifierRange(minMaxQualifiers); } } }