You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by bi...@apache.org on 2012/01/19 20:33:09 UTC

svn commit: r1233547 - in /incubator/accumulo/branches/1.4/src/core/src: main/java/org/apache/accumulo/core/iterators/ main/java/org/apache/accumulo/core/iterators/user/ test/java/org/apache/accumulo/core/iterators/user/

Author: billie
Date: Thu Jan 19 19:33:09 2012
New Revision: 1233547

URL: http://svn.apache.org/viewvc?rev=1233547&view=rev
Log:
ACCUMULO-307 reworked deepCopy for Combiners and Filters in 1.4

Modified:
    incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/Combiner.java
    incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/TypedValueCombiner.java
    incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/VersioningIterator.java
    incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/AgeOffFilter.java
    incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/ColumnAgeOffFilter.java
    incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/RegExFilter.java
    incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/TimestampFilter.java
    incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/VersioningIterator.java
    incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/CombinerTest.java
    incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/FilterTest.java
    incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/VersioningIteratorTest.java

Modified: incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/Combiner.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/Combiner.java?rev=1233547&r1=1233546&r2=1233547&view=diff
==============================================================================
--- incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/Combiner.java (original)
+++ incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/Combiner.java Thu Jan 19 19:33:09 2012
@@ -228,6 +228,20 @@ public abstract class Combiner extends W
   }
   
   @Override
+  public SortedKeyValueIterator<Key,Value> deepCopy(IteratorEnvironment env) {
+    Combiner newInstance;
+    try {
+      newInstance = this.getClass().newInstance();
+    } catch (Exception e) {
+      throw new RuntimeException(e);
+    }
+    newInstance.setSource(getSource().deepCopy(env));
+    newInstance.combiners = combiners;
+    newInstance.combineAllColumns = combineAllColumns;
+    return newInstance;
+  }
+  
+  @Override
   public IteratorOptions describeOptions() {
     IteratorOptions io = new IteratorOptions("comb", "Combiners apply reduce functions to values with identical keys", null, null);
     io.addNamedOption(ALL_OPTION, "set to true to apply Combiner to every column, otherwise leave blank. if true, " + COLUMNS_OPTION

Modified: incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/TypedValueCombiner.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/TypedValueCombiner.java?rev=1233547&r1=1233546&r2=1233547&view=diff
==============================================================================
--- incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/TypedValueCombiner.java (original)
+++ incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/TypedValueCombiner.java Thu Jan 19 19:33:09 2012
@@ -145,6 +145,14 @@ public abstract class TypedValueCombiner
     }
   }
   
+  @SuppressWarnings("unchecked")
+  @Override
+  public SortedKeyValueIterator<Key,Value> deepCopy(IteratorEnvironment env) {
+    TypedValueCombiner<V> newInstance = (TypedValueCombiner<V>) super.deepCopy(env);
+    newInstance.setEncoder(encoder);
+    return newInstance;
+  }
+  
   @Override
   public Value reduce(Key key, Iterator<Value> iter) {
     return new Value(encoder.encode(typedReduce(key, new VIterator<V>(iter, encoder))));

Modified: incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/VersioningIterator.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/VersioningIterator.java?rev=1233547&r1=1233546&r2=1233547&view=diff
==============================================================================
--- incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/VersioningIterator.java (original)
+++ incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/VersioningIterator.java Thu Jan 19 19:33:09 2012
@@ -29,6 +29,8 @@ public class VersioningIterator extends 
   public VersioningIterator() {}
   
   public VersioningIterator(SortedKeyValueIterator<Key,Value> iterator, int maxVersions) {
-    super(iterator, maxVersions);
+    super();
+    this.setSource(iterator);
+    this.maxVersions = maxVersions;
   }
 }

Modified: incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/AgeOffFilter.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/AgeOffFilter.java?rev=1233547&r1=1233546&r2=1233547&view=diff
==============================================================================
--- incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/AgeOffFilter.java (original)
+++ incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/AgeOffFilter.java Thu Jan 19 19:33:09 2012
@@ -37,26 +37,6 @@ public class AgeOffFilter extends Filter
   private long threshold;
   private long currentTime;
   
-  public AgeOffFilter() {}
-  
-  /**
-   * Constructs a filter that omits entries read from a source iterator if the Key's timestamp is less than currentTime - threshold.
-   * 
-   * @param iterator
-   *          The source iterator.
-   * 
-   * @param threshold
-   *          Maximum age in milliseconds of data to keep.
-   * 
-   * @param threshold
-   *          Current time in milliseconds.
-   */
-  private AgeOffFilter(SortedKeyValueIterator<Key,Value> iterator, long threshold, long currentTime) {
-    setSource(iterator);
-    this.threshold = threshold;
-    this.currentTime = currentTime;
-  }
-  
   /**
    * Accepts entries whose timestamps are less than currentTime - threshold.
    * 
@@ -93,7 +73,10 @@ public class AgeOffFilter extends Filter
   
   @Override
   public SortedKeyValueIterator<Key,Value> deepCopy(IteratorEnvironment env) {
-    return new AgeOffFilter(getSource(), threshold, currentTime);
+    AgeOffFilter copy = (AgeOffFilter) super.deepCopy(env);
+    copy.currentTime = currentTime;
+    copy.threshold = threshold;
+    return copy;
   }
   
   @Override

Modified: incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/ColumnAgeOffFilter.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/ColumnAgeOffFilter.java?rev=1233547&r1=1233546&r2=1233547&view=diff
==============================================================================
--- incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/ColumnAgeOffFilter.java (original)
+++ incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/ColumnAgeOffFilter.java Thu Jan 19 19:33:09 2012
@@ -36,15 +36,6 @@ import org.apache.hadoop.io.Text;
  * Different thresholds are set for each column.
  */
 public class ColumnAgeOffFilter extends Filter {
-  
-  public ColumnAgeOffFilter() {}
-  
-  private ColumnAgeOffFilter(SortedKeyValueIterator<Key,Value> iterator, TTLSet ttls, long currentTime) {
-    setSource(iterator);
-    this.ttls = ttls;
-    this.currentTime = currentTime;
-  }
-  
   public static class TTLSet extends ColumnToClassMapping<Long> {
     public TTLSet(Map<String,String> objectStrings) {
       super();
@@ -87,7 +78,10 @@ public class ColumnAgeOffFilter extends 
   
   @Override
   public SortedKeyValueIterator<Key,Value> deepCopy(IteratorEnvironment env) {
-    return new ColumnAgeOffFilter(getSource(), ttls, currentTime);
+    ColumnAgeOffFilter copy = (ColumnAgeOffFilter) super.deepCopy(env);
+    copy.currentTime = currentTime;
+    copy.ttls = ttls;
+    return copy;
   }
   
   public void overrideCurrentTime(long ts) {
@@ -123,7 +117,7 @@ public class ColumnAgeOffFilter extends 
   public static void addTTL(IteratorSetting is, IteratorSetting.Column column, Long ttl) {
     is.addOption(ColumnSet.encodeColumns(column.getFirst(), column.getSecond()), Long.toString(ttl));
   }
-
+  
   /**
    * A convenience method for removing an age off threshold for a column.
    * 

Modified: incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/RegExFilter.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/RegExFilter.java?rev=1233547&r1=1233546&r2=1233547&view=diff
==============================================================================
--- incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/RegExFilter.java (original)
+++ incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/RegExFilter.java Thu Jan 19 19:33:09 2012
@@ -37,8 +37,7 @@ public class RegExFilter extends Filter 
   
   @Override
   public SortedKeyValueIterator<Key,Value> deepCopy(IteratorEnvironment env) {
-    RegExFilter result = new RegExFilter();
-    result.setSource(getSource().deepCopy(env));
+    RegExFilter result = (RegExFilter) super.deepCopy(env);
     result.rowMatcher = copyMatcher(rowMatcher);
     result.colfMatcher = copyMatcher(colfMatcher);
     result.colqMatcher = copyMatcher(colqMatcher);

Modified: incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/TimestampFilter.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/TimestampFilter.java?rev=1233547&r1=1233546&r2=1233547&view=diff
==============================================================================
--- incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/TimestampFilter.java (original)
+++ incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/TimestampFilter.java Thu Jan 19 19:33:09 2012
@@ -54,17 +54,6 @@ public class TimestampFilter extends Fil
   
   public TimestampFilter() {}
   
-  private TimestampFilter(SortedKeyValueIterator<Key,Value> iterator, boolean hasStart, long start, boolean startInclusive, boolean hasEnd, long end,
-      boolean endInclusive) {
-    setSource(iterator);
-    this.start = start;
-    this.startInclusive = startInclusive;
-    this.hasStart = true;
-    this.end = end;
-    this.endInclusive = endInclusive;
-    this.hasEnd = true;
-  }
-  
   @Override
   public boolean accept(Key k, Value v) {
     long ts = k.getTimestamp();
@@ -112,7 +101,14 @@ public class TimestampFilter extends Fil
   
   @Override
   public SortedKeyValueIterator<Key,Value> deepCopy(IteratorEnvironment env) {
-    return new TimestampFilter(getSource(), hasStart, start, startInclusive, hasEnd, end, endInclusive);
+    TimestampFilter copy = (TimestampFilter) super.deepCopy(env);
+    copy.hasStart = hasStart;
+    copy.start = start;
+    copy.startInclusive = startInclusive;
+    copy.hasEnd = hasEnd;
+    copy.end = end;
+    copy.endInclusive = endInclusive;
+    return copy;
   }
   
   @Override

Modified: incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/VersioningIterator.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/VersioningIterator.java?rev=1233547&r1=1233546&r2=1233547&view=diff
==============================================================================
--- incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/VersioningIterator.java (original)
+++ incubator/accumulo/branches/1.4/src/core/src/main/java/org/apache/accumulo/core/iterators/user/VersioningIterator.java Thu Jan 19 19:33:09 2012
@@ -37,25 +37,14 @@ public class VersioningIterator extends 
   
   private Key currentKey = new Key();
   private int numVersions;
-  private int maxVersions;
+  protected int maxVersions;
   
   @Override
   public VersioningIterator deepCopy(IteratorEnvironment env) {
-    return new VersioningIterator(this, env);
-  }
-  
-  private VersioningIterator(VersioningIterator other, IteratorEnvironment env) {
-    setSource(other.getSource().deepCopy(env));
-    maxVersions = other.maxVersions;
-  }
-  
-  public VersioningIterator() {}
-  
-  public VersioningIterator(SortedKeyValueIterator<Key,Value> iterator, int maxVersions) {
-    if (maxVersions < 1)
-      throw new IllegalArgumentException("maxVersions for versioning iterator must be >= 1");
-    this.setSource(iterator);
-    this.maxVersions = maxVersions;
+    VersioningIterator copy = new VersioningIterator();
+    copy.setSource(getSource().deepCopy(env));
+    copy.maxVersions = maxVersions;
+    return copy;
   }
   
   @Override

Modified: incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/CombinerTest.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/CombinerTest.java?rev=1233547&r1=1233546&r2=1233547&view=diff
==============================================================================
--- incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/CombinerTest.java (original)
+++ incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/CombinerTest.java Thu Jan 19 19:33:09 2012
@@ -279,6 +279,74 @@ public class CombinerTest {
   }
   
   @Test
+  public void testDeepCopy() throws IOException {
+    Encoder<Long> encoder = LongCombiner.FIXED_LEN_ENCODER;
+    
+    TreeMap<Key,Value> tm1 = new TreeMap<Key,Value>();
+    
+    // keys that aggregate
+    nkv(tm1, 1, 1, 1, 1, false, 2l, encoder);
+    nkv(tm1, 1, 1, 1, 2, false, 3l, encoder);
+    nkv(tm1, 1, 1, 1, 3, false, 4l, encoder);
+    
+    // keys that do not aggregate
+    nkv(tm1, 2, 2, 1, 1, false, 2l, encoder);
+    nkv(tm1, 2, 2, 1, 2, false, 3l, encoder);
+    
+    Combiner ai = new SummingCombiner();
+    
+    IteratorSetting is = new IteratorSetting(1, SummingCombiner.class);
+    LongCombiner.setEncodingType(is, FixedLenEncoder.class.getName());
+    Combiner.setColumns(is, Collections.singletonList(new IteratorSetting.Column("cf001")));
+    
+    ai.init(new SortedMapIterator(tm1), is.getProperties(), null);
+    
+    SortedKeyValueIterator<Key,Value> ai2 = ai.deepCopy(null);
+    SortedKeyValueIterator<Key,Value> ai3 = ai.deepCopy(null);
+    ai.seek(new Range(), EMPTY_COL_FAMS, false);
+    
+    assertTrue(ai.hasTop());
+    assertEquals(nk(1, 1, 1, 3), ai.getTopKey());
+    assertEquals("9", encoder.decode(ai.getTopValue().get()).toString());
+    
+    ai.next();
+    
+    assertTrue(ai.hasTop());
+    assertEquals(nk(2, 2, 1, 2), ai.getTopKey());
+    assertEquals("3", encoder.decode(ai.getTopValue().get()).toString());
+    
+    ai.next();
+    
+    assertTrue(ai.hasTop());
+    assertEquals(nk(2, 2, 1, 1), ai.getTopKey());
+    assertEquals("2", encoder.decode(ai.getTopValue().get()).toString());
+    
+    ai.next();
+    
+    assertFalse(ai.hasTop());
+    
+    // seek after key that aggregates
+    ai2.seek(nr(1, 1, 1, 2), EMPTY_COL_FAMS, false);
+    
+    assertTrue(ai2.hasTop());
+    assertEquals(nk(2, 2, 1, 2), ai2.getTopKey());
+    assertEquals("3", encoder.decode(ai2.getTopValue().get()).toString());
+    
+    // seek before key that aggregates
+    ai3.seek(nr(1, 1, 1, 4), EMPTY_COL_FAMS, false);
+    
+    assertTrue(ai3.hasTop());
+    assertEquals(nk(1, 1, 1, 3), ai3.getTopKey());
+    assertEquals("9", encoder.decode(ai3.getTopValue().get()).toString());
+    
+    ai3.next();
+    
+    assertTrue(ai3.hasTop());
+    assertEquals(nk(2, 2, 1, 2), ai3.getTopKey());
+    assertEquals("3", encoder.decode(ai3.getTopValue().get()).toString());
+  }
+  
+  @Test
   public void test4() throws IOException {
     Encoder<Long> encoder = LongCombiner.STRING_ENCODER;
     

Modified: incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/FilterTest.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/FilterTest.java?rev=1233547&r1=1233546&r2=1233547&view=diff
==============================================================================
--- incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/FilterTest.java (original)
+++ incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/FilterTest.java Thu Jan 19 19:33:09 2012
@@ -16,6 +16,9 @@
  */
 package org.apache.accumulo.core.iterators.user;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
 import java.io.IOException;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -26,8 +29,6 @@ import java.util.HashSet;
 import java.util.Map;
 import java.util.TreeMap;
 
-import junit.framework.TestCase;
-
 import org.apache.accumulo.core.client.IteratorSetting;
 import org.apache.accumulo.core.data.ByteSequence;
 import org.apache.accumulo.core.data.Column;
@@ -43,13 +44,14 @@ import org.apache.accumulo.core.iterator
 import org.apache.accumulo.core.security.Authorizations;
 import org.apache.accumulo.core.security.ColumnVisibility;
 import org.apache.hadoop.io.Text;
+import org.junit.Test;
 
-public class FilterTest extends TestCase {
+public class FilterTest {
   
   private static final Collection<ByteSequence> EMPTY_COL_FAMS = new ArrayList<ByteSequence>();
   private static final Map<String,String> EMPTY_OPTS = new HashMap<String,String>();
   
-  public class SimpleFilter extends Filter {
+  public static class SimpleFilter extends Filter {
     public boolean accept(Key k, Value v) {
       // System.out.println(k.getRow());
       if (k.getRow().toString().endsWith("0"))
@@ -58,7 +60,7 @@ public class FilterTest extends TestCase
     }
   }
   
-  public class SimpleFilter2 extends Filter {
+  public static class SimpleFilter2 extends Filter {
     public boolean accept(Key k, Value v) {
       if (k.getColumnFamily().toString().equals("a"))
         return false;
@@ -76,6 +78,7 @@ public class FilterTest extends TestCase
     return size;
   }
   
+  @Test
   public void test1() throws IOException {
     Text colf = new Text("a");
     Text colq = new Text("b");
@@ -110,6 +113,7 @@ public class FilterTest extends TestCase
     assertTrue("size = " + size, size == 0);
   }
   
+  @Test
   public void test1neg() throws IOException {
     Text colf = new Text("a");
     Text colq = new Text("b");
@@ -122,32 +126,59 @@ public class FilterTest extends TestCase
     }
     assertTrue(tm.size() == 1000);
     
-    Filter filter1 = new SimpleFilter();
+    Filter filter = new SimpleFilter();
     
     IteratorSetting is = new IteratorSetting(1, SimpleFilter.class);
     Filter.setNegate(is, true);
     
-    filter1.init(new SortedMapIterator(tm), is.getProperties(), null);
-    filter1.seek(new Range(), EMPTY_COL_FAMS, false);
-    int size = size(filter1);
+    filter.init(new SortedMapIterator(tm), is.getProperties(), null);
+    filter.seek(new Range(), EMPTY_COL_FAMS, false);
+    int size = size(filter);
     assertTrue("size = " + size, size == 900);
     
-    Filter fi = new SimpleFilter();
-    fi.init(new SortedMapIterator(tm), is.getProperties(), null);
+    filter.init(new SortedMapIterator(tm), is.getProperties(), null);
     Key k = new Key(new Text("500"));
-    fi.seek(new Range(k, null), EMPTY_COL_FAMS, false);
-    size = size(fi);
+    filter.seek(new Range(k, null), EMPTY_COL_FAMS, false);
+    size = size(filter);
     assertTrue("size = " + size, size == 450);
     
-    filter1 = new SimpleFilter();
-    filter1.init(new SortedMapIterator(tm), EMPTY_OPTS, null);
+    filter.init(new SortedMapIterator(tm), EMPTY_OPTS, null);
     Filter filter2 = new SimpleFilter2();
-    filter2.init(filter1, is.getProperties(), null);
+    filter2.init(filter, is.getProperties(), null);
     filter2.seek(new Range(), EMPTY_COL_FAMS, false);
     size = size(filter2);
     assertTrue("size = " + size, size == 100);
   }
   
+  @Test
+  public void testDeepCopy() throws IOException {
+    Text colf = new Text("a");
+    Text colq = new Text("b");
+    Value dv = new Value();
+    TreeMap<Key,Value> tm = new TreeMap<Key,Value>();
+    
+    for (int i = 0; i < 1000; i++) {
+      Key k = new Key(new Text(String.format("%03d", i)), colf, colq);
+      tm.put(k, dv);
+    }
+    assertTrue(tm.size() == 1000);
+    
+    SimpleFilter filter = new SimpleFilter();
+    
+    IteratorSetting is = new IteratorSetting(1, SimpleFilter.class);
+    Filter.setNegate(is, true);
+    
+    filter.init(new SortedMapIterator(tm), is.getProperties(), null);
+    SortedKeyValueIterator<Key,Value> copy = filter.deepCopy(null);
+    filter.seek(new Range(), EMPTY_COL_FAMS, false);
+    int size = size(filter);
+    assertTrue("size = " + size, size == 900);
+    copy.seek(new Range(), EMPTY_COL_FAMS, false);
+    size = size(copy);
+    assertTrue("size = " + size, size == 900);
+  }
+  
+  @Test
   public void test2() throws IOException {
     Text colf = new Text("a");
     Text colq = new Text("b");
@@ -161,15 +192,21 @@ public class FilterTest extends TestCase
     }
     assertTrue(tm.size() == 1000);
     
-    AgeOffFilter a = new AgeOffFilter();
+    SortedKeyValueIterator<Key,Value> a = new AgeOffFilter();
     IteratorSetting is = new IteratorSetting(1, AgeOffFilter.class);
     AgeOffFilter.setTTL(is, 101l);
     AgeOffFilter.setCurrentTime(is, 1001l);
+    AgeOffFilter.setNegate(is, true);
     a.init(new SortedMapIterator(tm), is.getProperties(), null);
+    a = a.deepCopy(null);
+    SortedKeyValueIterator<Key,Value> copy = a.deepCopy(null);
     a.seek(new Range(), EMPTY_COL_FAMS, false);
-    assertEquals(size(a), 100);
+    assertEquals(size(a), 900);
+    copy.seek(new Range(), EMPTY_COL_FAMS, false);
+    assertEquals(size(copy), 900);
   }
   
+  @Test
   public void test2a() throws IOException {
     Text colf = new Text("a");
     Text colq = new Text("b");
@@ -199,11 +236,13 @@ public class FilterTest extends TestCase
     
     ColumnAgeOffFilter.removeTTL(is, new IteratorSetting.Column("a", "b"));
     a.init(new SortedMapIterator(tm), is.getProperties(), new DefaultIteratorEnvironment());
+    a = (ColumnAgeOffFilter) a.deepCopy(null);
     a.overrideCurrentTime(ts);
     a.seek(new Range(), EMPTY_COL_FAMS, false);
     assertEquals(size(a), 902);
   }
   
+  @Test
   public void test3() throws IOException {
     Value dv = new Value();
     TreeMap<Key,Value> tm = new TreeMap<Key,Value>();
@@ -248,6 +287,7 @@ public class FilterTest extends TestCase
     assertTrue("size was " + size, size == 1000);
   }
   
+  @Test
   public void test4() throws IOException {
     Value dv = new Value();
     TreeMap<Key,Value> tm = new TreeMap<Key,Value>();
@@ -283,6 +323,7 @@ public class FilterTest extends TestCase
     return a;
   }
   
+  @Test
   public void test5() throws IOException {
     Value dv = new Value();
     TreeMap<Key,Value> tm = new TreeMap<Key,Value>();
@@ -314,6 +355,7 @@ public class FilterTest extends TestCase
     assertTrue(size == 3);
   }
   
+  @Test
   public void testNoVisFilter() throws IOException {
     TreeMap<Key,Value> tm = new TreeMap<Key,Value>();
     Value v = new Value();
@@ -330,6 +372,7 @@ public class FilterTest extends TestCase
     assertTrue("size = " + size, size == 100);
   }
   
+  @Test
   public void testTimestampFilter() throws IOException, ParseException {
     Text colf = new Text("a");
     Text colq = new Text("b");
@@ -356,6 +399,7 @@ public class FilterTest extends TestCase
     IteratorSetting is = new IteratorSetting(1, TimestampFilter.class);
     TimestampFilter.setRange(is, "19990101010011GMT+01:00", "19990101010031GMT+01:00");
     a.init(new SortedMapIterator(tm), is.getProperties(), null);
+    a = (TimestampFilter) a.deepCopy(null);
     a.seek(new Range(), EMPTY_COL_FAMS, false);
     assertEquals(size(a), 21);
     TimestampFilter.setRange(is, baseTime + 11000, baseTime + 31000);

Modified: incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/VersioningIteratorTest.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/VersioningIteratorTest.java?rev=1233547&r1=1233546&r2=1233547&view=diff
==============================================================================
--- incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/VersioningIteratorTest.java (original)
+++ incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/VersioningIteratorTest.java Thu Jan 19 19:33:09 2012
@@ -16,14 +16,15 @@
  */
 package org.apache.accumulo.core.iterators.user;
 
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Map.Entry;
 import java.util.TreeMap;
 
-import junit.framework.TestCase;
-
 import org.apache.accumulo.core.client.IteratorSetting;
 import org.apache.accumulo.core.data.ByteSequence;
 import org.apache.accumulo.core.data.Key;
@@ -33,8 +34,9 @@ import org.apache.accumulo.core.iterator
 import org.apache.accumulo.core.iterators.SortedMapIterator;
 import org.apache.accumulo.core.iterators.TypedValueCombiner.Encoder;
 import org.apache.hadoop.io.Text;
+import org.junit.Test;
 
-public class VersioningIteratorTest extends TestCase {
+public class VersioningIteratorTest {
   // add test for seek function
   private static final Collection<ByteSequence> EMPTY_COL_FAMS = new ArrayList<ByteSequence>();
   private static final Encoder<Long> encoder = LongCombiner.FIXED_LEN_ENCODER;
@@ -60,6 +62,7 @@ public class VersioningIteratorTest exte
     return tmOut;
   }
   
+  @Test
   public void test1() {
     Text colf = new Text("a");
     Text colq = new Text("b");
@@ -90,6 +93,7 @@ public class VersioningIteratorTest exte
     }
   }
   
+  @Test
   public void test2() {
     Text colf = new Text("a");
     Text colq = new Text("b");
@@ -99,7 +103,10 @@ public class VersioningIteratorTest exte
     createTestData(tm, colf, colq);
     
     try {
-      VersioningIterator it = new VersioningIterator(new SortedMapIterator(tm), 3);
+      VersioningIterator it = new VersioningIterator();
+      IteratorSetting is = new IteratorSetting(1, VersioningIterator.class);
+      VersioningIterator.setMaxVersions(is, 3);
+      it.init(new SortedMapIterator(tm), is.getProperties(), null);
       
       // after doing this seek, should only get two keys for row 1
       // since we are seeking to the middle of the most recent
@@ -122,6 +129,7 @@ public class VersioningIteratorTest exte
     }
   }
   
+  @Test
   public void test3() {
     Text colf = new Text("a");
     Text colq = new Text("b");
@@ -170,6 +178,7 @@ public class VersioningIteratorTest exte
     }
   }
   
+  @Test
   public void test4() {
     Text colf = new Text("a");
     Text colq = new Text("b");
@@ -198,6 +207,7 @@ public class VersioningIteratorTest exte
     }
   }
   
+  @Test
   public void test5() throws IOException {
     Text colf = new Text("a");
     Text colq = new Text("b");
@@ -219,4 +229,29 @@ public class VersioningIteratorTest exte
     
   }
   
+  @Test
+  public void test6() throws IOException {
+    Text colf = new Text("a");
+    Text colq = new Text("b");
+    
+    TreeMap<Key,Value> tm = new TreeMap<Key,Value>();
+    
+    createTestData(tm, colf, colq);
+    
+    VersioningIterator it = new VersioningIterator();
+    IteratorSetting is = new IteratorSetting(1, VersioningIterator.class);
+    VersioningIterator.setMaxVersions(is, 3);
+    it.init(new SortedMapIterator(tm), is.getProperties(), null);
+    VersioningIterator it2 = it.deepCopy(null);
+    
+    Key seekKey = new Key(new Text(String.format("%03d", 1)), colf, colq, 19);
+    it.seek(new Range(seekKey, false, null, true), EMPTY_COL_FAMS, false);
+    it2.seek(new Range(seekKey, false, null, true), EMPTY_COL_FAMS, false);
+    
+    assertTrue(it.hasTop());
+    assertTrue(it.getTopKey().getTimestamp() == 18);
+    
+    assertTrue(it2.hasTop());
+    assertTrue(it2.getTopKey().getTimestamp() == 18);
+  }
 }