/** * Apply an appropriate column filter based on the input string. Four modes of operation: * * <ol> * <li>1. Null or blank ("") `colFilter`: do nothing. * <li>2. No ranges `colFilter`: use scanner.fetchColumn() which invokes an Accumulo system * {@link ColumnQualifierFilter}. * <li>3. Singleton range `colFilter`: use Accumulo user {@link ColumnSliceFilter}. * <li>4. Multi-range `colFilter`: use Graphulo {@link D4mRangeFilter}. * </ol> * * @param colFilter column filter string * @param scanner to call fetchColumn() on, for case #2 * @param dis to call append()/prepend() on, for cases #3 and #4 * @param append True means call {@link DynamicIteratorSetting#append}. False means call {@link * DynamicIteratorSetting#prepend} */ public static void applyGeneralColumnFilter( String colFilter, ScannerBase scanner, DynamicIteratorSetting dis, boolean append) { // System.err.println("colFilter: "+colFilter); if (colFilter != null && !colFilter.isEmpty()) { int pos1 = colFilter.indexOf(':'); if (pos1 == -1) { // no ranges - collection of singleton texts // todo - the order this filter applies is different. Ensure no logical bugs when we have // case 2. for (Text text : GraphuloUtil.d4mRowToTexts(colFilter)) { scanner.fetchColumn(GraphuloUtil.EMPTY_TEXT, text); } } else { SortedSet<Range> ranges = GraphuloUtil.d4mRowToRanges(colFilter); assert ranges.size() > 0; IteratorSetting s; if (ranges.size() == 1) { // single range - use ColumnSliceFilter Range r = ranges.first(); s = new IteratorSetting(1, ColumnSliceFilter.class); // System.err.println("start: "+(r.isInfiniteStartKey() ? null : // r.getStartKey().getRow().toString()) // +"end: "+(r.isInfiniteStopKey() ? null : // r.getEndKey().getRow().toString())); ColumnSliceFilter.setSlice( s, r.isInfiniteStartKey() ? null : r.getStartKey().getRow().toString(), true, r.isInfiniteStopKey() ? null : r.getEndKey().getRow().toString(), true); // System.err.println("!ok "+GraphuloUtil.d4mRowToRanges(colFilter)); } else { // multiple ranges // System.err.println("ok "+GraphuloUtil.d4mRowToRanges(colFilter)); s = D4mRangeFilter.iteratorSetting(1, D4mRangeFilter.KeyPart.COLQ, colFilter); } if (append) dis.append(s); else dis.prepend(s); } } }
// @Deprecated // * @deprecated Use {@link #applyGeneralColumnFilter(String, ScannerBase, // DynamicIteratorSetting)} for more robust filter setting. public static void applyGeneralColumnFilter(String colFilter, ScannerBase scanner, int priority) { // System.err.println("colFilter: "+colFilter); if (colFilter != null && !colFilter.isEmpty()) { int pos1 = colFilter.indexOf(':'); if (pos1 == -1) { // no ranges - collection of singleton texts for (Text text : GraphuloUtil.d4mRowToTexts(colFilter)) { scanner.fetchColumn(GraphuloUtil.EMPTY_TEXT, text); } } else { SortedSet<Range> ranges = GraphuloUtil.d4mRowToRanges(colFilter); assert ranges.size() > 0; IteratorSetting s; if (ranges.size() == 1) { // single range - use ColumnSliceFilter Range r = ranges.first(); if (r.isInfiniteStartKey() && r.isInfiniteStopKey()) return; // Infinite case: no filtering. s = new IteratorSetting(priority, ColumnSliceFilter.class); // System.err.println("start: "+(r.isInfiniteStartKey() ? null : // r.getStartKey().getRow().toString()) // +"end: "+(r.isInfiniteStopKey() ? null : // r.getEndKey().getRow().toString())); ColumnSliceFilter.setSlice( s, r.isInfiniteStartKey() ? null : r.getStartKey().getRow().toString(), true, r.isInfiniteStopKey() ? null : r.getEndKey().getRow().toString(), true); // System.err.println("!ok "+GraphuloUtil.d4mRowToRanges(colFilter)); } else { // multiple ranges // System.err.println("ok "+GraphuloUtil.d4mRowToRanges(colFilter)); s = D4mRangeFilter.iteratorSetting(1, D4mRangeFilter.KeyPart.COLQ, colFilter); } scanner.addScanIterator(s); } } }