/** * @param root the root of the schema * @param validating * @param columnStore * @param unboundFilter Filter records, pass in NULL_FILTER to leave unfiltered. */ public FilteredRecordReader(MessageColumnIO root, RecordMaterializer<T> recordMaterializer, boolean validating, ColumnReadStoreImpl columnStore, UnboundRecordFilter unboundFilter, long recordCount) { super(root, recordMaterializer, validating, columnStore); this.recordCount = recordCount; if ( unboundFilter != null ) { recordFilter = unboundFilter.bind(getColumnReaders()); } else { recordFilter = null; } }
/** * Override read() method to provide skip. */ @Override public T read() { skipToMatch(); if (recordsRead == recordCount) { return null; } ++ recordsRead; return super.read(); }
@Override public RecordReader<T> visit(UnboundRecordFilterCompat unboundRecordFilterCompat) { return new FilteredRecordReader<T>( MessageColumnIO.this, recordMaterializer, validating, new ColumnReadStoreImpl(columns, recordMaterializer.getRootConverter(), getType(), createdBy), unboundRecordFilterCompat.getUnboundRecordFilter(), columns.getRowCount() ); }
/** * Skips forwards until the filter finds the first match. Returns false * if none found. */ private void skipToMatch() { while (recordsRead < recordCount && !recordFilter.isMatch()) { State currentState = getState(0); do { ColumnReader columnReader = currentState.column; // currentLevel = depth + 1 at this point // set the current value if (columnReader.getCurrentDefinitionLevel() >= currentState.maxDefinitionLevel) { columnReader.skip(); } columnReader.consume(); // Based on repetition level work out next state to go to int nextR = currentState.maxRepetitionLevel == 0 ? 0 : columnReader.getCurrentRepetitionLevel(); currentState = currentState.getNextState(nextR); } while (currentState != null); ++ recordsRead; } } }
@Override public RecordReader<T> visit(UnboundRecordFilterCompat unboundRecordFilterCompat) { return new FilteredRecordReader<T>( MessageColumnIO.this, recordMaterializer, validating, new ColumnReadStoreImpl(columns, recordMaterializer.getRootConverter(), getType(), createdBy), unboundRecordFilterCompat.getUnboundRecordFilter(), columns.getRowCount() ); }
/** * Skips forwards until the filter finds the first match. Returns false * if none found. */ private void skipToMatch() { while (recordsRead < recordCount && !recordFilter.isMatch()) { State currentState = getState(0); do { ColumnReader columnReader = currentState.column; // currentLevel = depth + 1 at this point // set the current value if (columnReader.getCurrentDefinitionLevel() >= currentState.maxDefinitionLevel) { columnReader.skip(); } columnReader.consume(); // Based on repetition level work out next state to go to int nextR = currentState.maxRepetitionLevel == 0 ? 0 : columnReader.getCurrentRepetitionLevel(); currentState = currentState.getNextState(nextR); } while (currentState != null); ++ recordsRead; } } }
/** * Override read() method to provide skip. */ @Override public T read() { skipToMatch(); if (recordsRead == recordCount) { return null; } ++ recordsRead; return super.read(); }
/** * @param root the root of the schema * @param validating * @param columnStore * @param unboundFilter Filter records, pass in NULL_FILTER to leave unfiltered. */ public FilteredRecordReader(MessageColumnIO root, RecordMaterializer<T> recordMaterializer, boolean validating, ColumnReadStoreImpl columnStore, UnboundRecordFilter unboundFilter, long recordCount) { super(root, recordMaterializer, validating, columnStore); this.recordCount = recordCount; if ( unboundFilter != null ) { recordFilter = unboundFilter.bind(getColumnReaders()); } else { recordFilter = null; } }