You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by kt...@apache.org on 2012/03/09 23:42:29 UTC
svn commit: r1299085 - in /incubator/accumulo/branches/1.4/src/core/src:
main/java/org/apache/accumulo/core/iterators/user/RowFilter.java
test/java/org/apache/accumulo/core/iterators/user/RowFilterTest.java
Author: kturner
Date: Fri Mar 9 22:42:29 2012
New Revision: 1299085
URL: http://svn.apache.org/viewvc?rev=1299085&view=rev
Log:
ACCUMULO-403 confine seeks in RowFilter accept function to row
Modified:
incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/RowFilter.java
incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/RowFilterTest.java
Modified: incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/RowFilter.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/RowFilter.java?rev=1299085&r1=1299084&r2=1299085&view=diff
==============================================================================
--- incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/RowFilter.java (original)
+++ incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/RowFilter.java Fri Mar 9 22:42:29 2012
@@ -49,13 +49,43 @@ import org.apache.hadoop.io.Text;
*/
public abstract class RowFilter extends WrappingIterator {
- private SortedKeyValueIterator<Key,Value> decisionIterator;
+ private RowIterator decisionIterator;
private Collection<ByteSequence> columnFamilies;
Text currentRow;
private boolean inclusive;
private Range range;
private boolean hasTop;
+ private static class RowIterator extends WrappingIterator {
+ private Range rowRange;
+ private boolean hasTop;
+
+ RowIterator(SortedKeyValueIterator<Key,Value> source) {
+ super.setSource(source);
+ }
+
+ void setRow(Range row) {
+ this.rowRange = row;
+ }
+
+ @Override
+ public boolean hasTop() {
+ return hasTop && super.hasTop();
+ }
+
+ @Override
+ public void seek(Range range, Collection<ByteSequence> columnFamilies, boolean inclusive) throws IOException {
+
+ range = rowRange.clip(range, true);
+ if (range == null) {
+ hasTop = false;
+ } else {
+ hasTop = true;
+ super.seek(range, columnFamilies, inclusive);
+ }
+ }
+ }
+
private void skipRows() throws IOException {
SortedKeyValueIterator<Key,Value> source = getSource();
while (source.hasTop()) {
@@ -64,7 +94,9 @@ public abstract class RowFilter extends
if (currentRow != null && currentRow.equals(row))
break;
- decisionIterator.seek(new Range(row), columnFamilies, inclusive);
+ Range rowRange = new Range(row);
+ decisionIterator.setRow(rowRange);
+ decisionIterator.seek(rowRange, columnFamilies, inclusive);
if (acceptRow(decisionIterator)) {
currentRow = row;
@@ -103,7 +135,7 @@ public abstract class RowFilter extends
@Override
public void init(SortedKeyValueIterator<Key,Value> source, Map<String,String> options, IteratorEnvironment env) throws IOException {
super.init(source, options, env);
- this.decisionIterator = source.deepCopy(env);
+ this.decisionIterator = new RowIterator(source.deepCopy(env));
}
@Override
Modified: incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/RowFilterTest.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/RowFilterTest.java?rev=1299085&r1=1299084&r2=1299085&view=diff
==============================================================================
--- incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/RowFilterTest.java (original)
+++ incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/RowFilterTest.java Fri Mar 9 22:42:29 2012
@@ -29,6 +29,7 @@ import org.apache.accumulo.core.client.C
import org.apache.accumulo.core.client.IteratorSetting;
import org.apache.accumulo.core.client.Scanner;
import org.apache.accumulo.core.client.mock.MockInstance;
+import org.apache.accumulo.core.data.ByteSequence;
import org.apache.accumulo.core.data.Key;
import org.apache.accumulo.core.data.Mutation;
import org.apache.accumulo.core.data.Range;
@@ -47,13 +48,33 @@ public class RowFilterTest extends TestC
@Override
public boolean acceptRow(SortedKeyValueIterator<Key,Value> rowIterator) throws IOException {
int sum = 0;
+ int sum2 = 0;
+ Key firstKey = null;
+
+ if (rowIterator.hasTop()) {
+ firstKey = new Key(rowIterator.getTopKey());
+ }
+
while (rowIterator.hasTop()) {
sum += Integer.parseInt(rowIterator.getTopValue().toString());
rowIterator.next();
}
- return sum == 2;
+ // ensure that seeks are confined to the row
+ rowIterator.seek(new Range(), new HashSet<ByteSequence>(), false);
+ while (rowIterator.hasTop()) {
+ sum2 += Integer.parseInt(rowIterator.getTopValue().toString());
+ rowIterator.next();
+ }
+
+ rowIterator.seek(new Range(firstKey.getRow(), false, null, true), new HashSet<ByteSequence>(), false);
+ while (rowIterator.hasTop()) {
+ sum2 += Integer.parseInt(rowIterator.getTopValue().toString());
+ rowIterator.next();
+ }
+
+ return sum == 2 && sum2 == 2;
}
}
@@ -110,7 +131,7 @@ public class RowFilterTest extends TestC
IteratorSetting is = new IteratorSetting(40, SummingRowFilter.class);
conn.tableOperations().attachIterator("table1", is);
-
+
Scanner scanner = conn.createScanner("table1", Constants.NO_AUTHS);
assertEquals(new HashSet<String>(Arrays.asList("2", "3")), getRows(scanner));