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/11/08 17:39:27 UTC

svn commit: r1407162 - in /accumulo/trunk: ./ assemble/ core/ core/src/main/java/org/apache/accumulo/core/iterators/user/ core/src/test/java/org/apache/accumulo/core/iterators/user/ fate/src/main/java/org/apache/accumulo/fate/ fate/src/main/java/org/ap...

Author: billie
Date: Thu Nov  8 16:39:26 2012
New Revision: 1407162

URL: http://svn.apache.org/viewvc?rev=1407162&view=rev
Log:
ACCUMULO-776 made timestamp filter support longs greater than max date - merged to trunk

Modified:
    accumulo/trunk/   (props changed)
    accumulo/trunk/assemble/   (props changed)
    accumulo/trunk/core/   (props changed)
    accumulo/trunk/core/src/main/java/org/apache/accumulo/core/iterators/user/TimestampFilter.java
    accumulo/trunk/core/src/test/java/org/apache/accumulo/core/iterators/user/FilterTest.java
    accumulo/trunk/core/src/test/java/org/apache/accumulo/core/iterators/user/RegExFilterTest.java
    accumulo/trunk/fate/src/main/java/org/apache/accumulo/fate/ZooStore.java   (props changed)
    accumulo/trunk/fate/src/main/java/org/apache/accumulo/fate/zookeeper/ZooSession.java   (props changed)
    accumulo/trunk/server/   (props changed)
    accumulo/trunk/src/   (props changed)

Propchange: accumulo/trunk/
------------------------------------------------------------------------------
  Merged /accumulo/branches/1.4/src:r1407157

Propchange: accumulo/trunk/assemble/
------------------------------------------------------------------------------
  Merged /accumulo/branches/1.4/src/assemble:r1407157

Propchange: accumulo/trunk/core/
------------------------------------------------------------------------------
  Merged /accumulo/branches/1.4/src/core:r1407157

Modified: accumulo/trunk/core/src/main/java/org/apache/accumulo/core/iterators/user/TimestampFilter.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/iterators/user/TimestampFilter.java?rev=1407162&r1=1407161&r2=1407162&view=diff
==============================================================================
--- accumulo/trunk/core/src/main/java/org/apache/accumulo/core/iterators/user/TimestampFilter.java (original)
+++ accumulo/trunk/core/src/main/java/org/apache/accumulo/core/iterators/user/TimestampFilter.java Thu Nov  8 16:39:26 2012
@@ -17,8 +17,8 @@
 package org.apache.accumulo.core.iterators.user;
 
 import java.io.IOException;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.Date;
 import java.util.Map;
 import java.util.TimeZone;
 
@@ -33,6 +33,7 @@ import org.apache.accumulo.core.iterator
  * A Filter that matches entries whose timestamps fall within a range.
  */
 public class TimestampFilter extends Filter {
+  private static final String LONG_PREFIX = "LONG";
   private final SimpleDateFormat dateParser = initDateParser();
   
   private static SimpleDateFormat initDateParser() {
@@ -86,10 +87,20 @@ public class TimestampFilter extends Fil
       throw new IllegalArgumentException("must have either start or end for " + TimestampFilter.class.getName());
     
     try {
-      if (hasStart)
-        start = dateParser.parse(options.get(START)).getTime();
-      if (hasEnd)
-        end = dateParser.parse(options.get(END)).getTime();
+      if (hasStart) {
+        String s = options.get(START);
+        if (s.startsWith(LONG_PREFIX))
+          start = Long.valueOf(s.substring(LONG_PREFIX.length()));
+        else
+          start = dateParser.parse(s).getTime();
+      }
+      if (hasEnd) {
+        String s = options.get(END);
+        if (s.startsWith(LONG_PREFIX))
+          end = Long.valueOf(s.substring(LONG_PREFIX.length()));
+        else
+          end = dateParser.parse(s).getTime();
+      }
     } catch (Exception e) {
       throw new IllegalArgumentException(e);
     }
@@ -116,8 +127,8 @@ public class TimestampFilter extends Fil
     IteratorOptions io = super.describeOptions();
     io.setName("tsfilter");
     io.setDescription("TimestampFilter displays entries with timestamps between specified values");
-    io.addNamedOption("start", "start timestamp (yyyyMMddHHmmssz)");
-    io.addNamedOption("end", "end timestamp (yyyyMMddHHmmssz)");
+    io.addNamedOption("start", "start timestamp (yyyyMMddHHmmssz or LONG<longstring>)");
+    io.addNamedOption("end", "end timestamp (yyyyMMddHHmmssz or LONG<longstring>)");
     io.addNamedOption("startInclusive", "true or false");
     io.addNamedOption("endInclusive", "true or false");
     return io;
@@ -126,11 +137,27 @@ public class TimestampFilter extends Fil
   @Override
   public boolean validateOptions(Map<String,String> options) {
     super.validateOptions(options);
+    boolean hasStart = false;
+    boolean hasEnd = false;
     try {
-      if (options.containsKey(START))
-        dateParser.parse(options.get(START));
-      if (options.containsKey(END))
-        dateParser.parse(options.get(END));
+      if (options.containsKey(START)) {
+        hasStart = true;
+        String s = options.get(START);
+        if (s.startsWith(LONG_PREFIX))
+          Long.valueOf(s.substring(LONG_PREFIX.length()));
+        else
+          dateParser.parse(s);
+      }
+      if (options.containsKey(END)) {
+        hasEnd = true;
+        String s = options.get(END);
+        if (s.startsWith(LONG_PREFIX))
+          Long.valueOf(s.substring(LONG_PREFIX.length()));
+        else
+          dateParser.parse(s);
+      }
+      if (!hasStart && !hasEnd)
+        return false;
       if (options.get(START_INCL) != null)
         Boolean.parseBoolean(options.get(START_INCL));
       if (options.get(END_INCL) != null)
@@ -185,8 +212,13 @@ public class TimestampFilter extends Fil
    *          boolean indicating whether the start is inclusive
    */
   public static void setStart(IteratorSetting is, String start, boolean startInclusive) {
-    is.addOption(START, start);
-    is.addOption(START_INCL, Boolean.toString(startInclusive));
+    SimpleDateFormat dateParser = initDateParser();
+    try {
+      long startTS = dateParser.parse(start).getTime();
+      setStart(is, startTS, startInclusive);
+    } catch (ParseException e) {
+      throw new IllegalArgumentException("couldn't parse " + start);
+    }
   }
   
   /**
@@ -200,8 +232,13 @@ public class TimestampFilter extends Fil
    *          boolean indicating whether the end is inclusive
    */
   public static void setEnd(IteratorSetting is, String end, boolean endInclusive) {
-    is.addOption(END, end);
-    is.addOption(END_INCL, Boolean.toString(endInclusive));
+    SimpleDateFormat dateParser = initDateParser();
+    try {
+      long endTS = dateParser.parse(end).getTime();
+      setEnd(is, endTS, endInclusive);
+    } catch (ParseException e) {
+      throw new IllegalArgumentException("couldn't parse " + end);
+    }
   }
   
   /**
@@ -248,8 +285,7 @@ public class TimestampFilter extends Fil
    *          boolean indicating whether the start is inclusive
    */
   public static void setStart(IteratorSetting is, long start, boolean startInclusive) {
-    SimpleDateFormat dateParser = initDateParser();
-    is.addOption(START, dateParser.format(new Date(start)));
+    is.addOption(START, LONG_PREFIX + Long.toString(start));
     is.addOption(START_INCL, Boolean.toString(startInclusive));
   }
   
@@ -264,8 +300,7 @@ public class TimestampFilter extends Fil
    *          boolean indicating whether the end is inclusive
    */
   public static void setEnd(IteratorSetting is, long end, boolean endInclusive) {
-    SimpleDateFormat dateParser = initDateParser();
-    is.addOption(END, dateParser.format(new Date(end)));
+    is.addOption(END, LONG_PREFIX + Long.toString(end));
     is.addOption(END_INCL, Boolean.toString(endInclusive));
   }
 }

Modified: accumulo/trunk/core/src/test/java/org/apache/accumulo/core/iterators/user/FilterTest.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/test/java/org/apache/accumulo/core/iterators/user/FilterTest.java?rev=1407162&r1=1407161&r2=1407162&view=diff
==============================================================================
--- accumulo/trunk/core/src/test/java/org/apache/accumulo/core/iterators/user/FilterTest.java (original)
+++ accumulo/trunk/core/src/test/java/org/apache/accumulo/core/iterators/user/FilterTest.java Thu Nov  8 16:39:26 2012
@@ -17,6 +17,7 @@
 package org.apache.accumulo.core.iterators.user;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
@@ -197,6 +198,8 @@ public class FilterTest {
     AgeOffFilter.setTTL(is, 101l);
     AgeOffFilter.setCurrentTime(is, 1001l);
     AgeOffFilter.setNegate(is, true);
+    assertTrue(((AgeOffFilter) a).validateOptions(is.getOptions()));
+    assertFalse(((AgeOffFilter) a).validateOptions(EMPTY_OPTS));
     a.init(new SortedMapIterator(tm), is.getOptions(), null);
     a = a.deepCopy(null);
     SortedKeyValueIterator<Key,Value> copy = a.deepCopy(null);
@@ -223,6 +226,7 @@ public class FilterTest {
     assertTrue(tm.size() == 1000);
     
     ColumnAgeOffFilter a = new ColumnAgeOffFilter();
+    assertTrue(a.validateOptions(is.getOptions()));
     a.init(new SortedMapIterator(tm), is.getOptions(), new DefaultIteratorEnvironment());
     a.overrideCurrentTime(ts);
     a.seek(new Range(), EMPTY_COL_FAMS, false);
@@ -429,6 +433,7 @@ public class FilterTest {
     assertEquals(size(a), 89);
     
     TimestampFilter.setStart(is, "19990101000011GMT", false);
+    assertTrue(a.validateOptions(is.getOptions()));
     a.init(new SortedMapIterator(tm), is.getOptions(), null);
     a.seek(new Range(), EMPTY_COL_FAMS, false);
     assertEquals(size(a), 88);
@@ -440,9 +445,29 @@ public class FilterTest {
     assertEquals(size(a), 32);
     
     TimestampFilter.setEnd(is, "19990101000031GMT", false);
+    assertTrue(a.validateOptions(is.getOptions()));
     a.init(new SortedMapIterator(tm), is.getOptions(), null);
     a.seek(new Range(), EMPTY_COL_FAMS, false);
     assertEquals(size(a), 31);
+    
+    TimestampFilter.setEnd(is, 253402300800001l, true);
+    a.init(new SortedMapIterator(tm), is.getOptions(), null);
+    
+    is.clearOptions();
+    is.addOption(TimestampFilter.START, "19990101000011GMT");
+    assertTrue(a.validateOptions(is.getOptions()));
+    a.init(new SortedMapIterator(tm), is.getOptions(), null);
+    a.seek(new Range(), EMPTY_COL_FAMS, false);
+    assertEquals(size(a), 89);
+    
+    is.clearOptions();
+    is.addOption(TimestampFilter.END, "19990101000031GMT");
+    assertTrue(a.validateOptions(is.getOptions()));
+    a.init(new SortedMapIterator(tm), is.getOptions(), null);
+    a.seek(new Range(), EMPTY_COL_FAMS, false);
+    assertEquals(size(a), 32);
+    
+    assertFalse(a.validateOptions(EMPTY_OPTS));
   }
   
   @Test

Modified: accumulo/trunk/core/src/test/java/org/apache/accumulo/core/iterators/user/RegExFilterTest.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/core/src/test/java/org/apache/accumulo/core/iterators/user/RegExFilterTest.java?rev=1407162&r1=1407161&r2=1407162&view=diff
==============================================================================
--- accumulo/trunk/core/src/test/java/org/apache/accumulo/core/iterators/user/RegExFilterTest.java (original)
+++ accumulo/trunk/core/src/test/java/org/apache/accumulo/core/iterators/user/RegExFilterTest.java Thu Nov  8 16:39:26 2012
@@ -59,7 +59,7 @@ public class RegExFilterTest extends Tes
     IteratorSetting is = new IteratorSetting(1, RegExFilter.class);
     RegExFilter.setRegexs(is, ".*2", null, null, null, false);
     
-    rei.validateOptions(is.getOptions());
+    assertTrue(rei.validateOptions(is.getOptions()));
     rei.init(new SortedMapIterator(tm), is.getOptions(), new DefaultIteratorEnvironment());
     rei.seek(new Range(), EMPTY_COL_FAMS, false);
     
@@ -87,7 +87,7 @@ public class RegExFilterTest extends Tes
     is.clearOptions();
     
     RegExFilter.setRegexs(is, null, "ya.*", null, null, false);
-    rei.validateOptions(is.getOptions());
+    assertTrue(rei.validateOptions(is.getOptions()));
     rei.init(new SortedMapIterator(tm), is.getOptions(), new DefaultIteratorEnvironment());
     rei.seek(new Range(), EMPTY_COL_FAMS, false);
     
@@ -100,7 +100,7 @@ public class RegExFilterTest extends Tes
     is.clearOptions();
     
     RegExFilter.setRegexs(is, null, null, ".*01", null, false);
-    rei.validateOptions(is.getOptions());
+    assertTrue(rei.validateOptions(is.getOptions()));
     rei.init(new SortedMapIterator(tm), is.getOptions(), new DefaultIteratorEnvironment());
     rei.seek(new Range(), EMPTY_COL_FAMS, false);
     
@@ -113,7 +113,7 @@ public class RegExFilterTest extends Tes
     is.clearOptions();
     
     RegExFilter.setRegexs(is, null, null, null, ".*at", false);
-    rei.validateOptions(is.getOptions());
+    assertTrue(rei.validateOptions(is.getOptions()));
     rei.init(new SortedMapIterator(tm), is.getOptions(), new DefaultIteratorEnvironment());
     rei.seek(new Range(), EMPTY_COL_FAMS, false);
     

Propchange: accumulo/trunk/fate/src/main/java/org/apache/accumulo/fate/ZooStore.java
------------------------------------------------------------------------------
  Merged /accumulo/branches/1.4/src/fate/src/main/java/org/apache/accumulo/fate/ZooStore.java:r1407157

Propchange: accumulo/trunk/fate/src/main/java/org/apache/accumulo/fate/zookeeper/ZooSession.java
------------------------------------------------------------------------------
  Merged /accumulo/branches/1.4/src/fate/src/main/java/org/apache/accumulo/fate/zookeeper/ZooSession.java:r1407157

Propchange: accumulo/trunk/server/
------------------------------------------------------------------------------
  Merged /accumulo/branches/1.4/src/server:r1407157

Propchange: accumulo/trunk/src/
------------------------------------------------------------------------------
  Merged /accumulo/branches/1.4/src/src:r1407157