Author: afuchs
Date: Thu Jun 28 15:30:29 2012
New Revision: 1355044

URL: http://svn.apache.org/viewvc?rev=1355044&view=rev
Log:
ACCUMULO-652 fixed stat aggregation at higher levels, fixed some formatting, 
and fixed timestamp filtering of index blocks in the IndexIterator

Modified:
    
accumulo/branches/ACCUMULO-652/core/src/main/java/org/apache/accumulo/core/file/rfile/MultiLevelIndex.java
    
accumulo/branches/ACCUMULO-652/core/src/main/java/org/apache/accumulo/core/file/rfile/RFile.java
    
accumulo/branches/ACCUMULO-652/core/src/main/java/org/apache/accumulo/core/iterators/predicates/TimestampRangePredicate.java
    
accumulo/branches/ACCUMULO-652/core/src/test/java/org/apache/accumulo/core/file/rfile/TimestampFilterTest.java

Modified: 
accumulo/branches/ACCUMULO-652/core/src/main/java/org/apache/accumulo/core/file/rfile/MultiLevelIndex.java
URL: 
http://svn.apache.org/viewvc/accumulo/branches/ACCUMULO-652/core/src/main/java/org/apache/accumulo/core/file/rfile/MultiLevelIndex.java?rev=1355044&r1=1355043&r2=1355044&view=diff
==============================================================================
--- 
accumulo/branches/ACCUMULO-652/core/src/main/java/org/apache/accumulo/core/file/rfile/MultiLevelIndex.java
 (original)
+++ 
accumulo/branches/ACCUMULO-652/core/src/main/java/org/apache/accumulo/core/file/rfile/MultiLevelIndex.java
 Thu Jun 28 15:30:29 2012
@@ -39,6 +39,7 @@ import org.apache.accumulo.core.file.blo
 import org.apache.accumulo.core.file.blockfile.BlockFileReader;
 import org.apache.accumulo.core.file.blockfile.BlockFileWriter;
 import org.apache.accumulo.core.file.rfile.bcfile.Utils;
+import org.apache.accumulo.core.iterators.predicates.ColumnVisibilityPredicate;
 import org.apache.accumulo.core.iterators.predicates.TimestampRangePredicate;
 import org.apache.accumulo.core.security.ColumnVisibility;
 import org.apache.hadoop.io.WritableComparable;
@@ -406,7 +407,7 @@ public class MultiLevelIndex {
       writer.close(out);
     }
   }
-
+  
   public static class Writer {
     private int threshold;
     
@@ -424,8 +425,7 @@ public class MultiLevelIndex {
       levels = new ArrayList<IndexBlock>();
     }
     
-    private void add(int level, Key key, BlockStats blockStats, long offset, 
long compressedSize, long rawSize, boolean last, int version)
-        throws IOException {
+    private void add(int level, Key key, BlockStats blockStats, long offset, 
long compressedSize, long rawSize, boolean last, int version) throws 
IOException {
       if (level == levels.size()) {
         levels.add(new IndexBlock(level, 0));
       }
@@ -443,7 +443,7 @@ public class MultiLevelIndex {
         iblock.write(out);
         out.close();
         
-        add(level + 1, key, blockStats, out.getStartPos(), 
out.getCompressedSize(), out.getRawSize(), last, version);
+        add(level + 1, key, iblock.blockStats, out.getStartPos(), 
out.getCompressedSize(), out.getRawSize(), last, version);
         
         if (last)
           levels.set(level, null);
@@ -501,9 +501,11 @@ public class MultiLevelIndex {
     class IndexIterator implements Iterator<IndexEntry> {
       private Stack<StackEntry> position = new Stack<StackEntry>();
       private final TimestampRangePredicate timestampFilter;
+      private final ColumnVisibilityPredicate columnVisibilityPredicate;
       
-      private IndexIterator(TimestampRangePredicate timestampFilter, Key 
lookupKey) {
+      private IndexIterator(TimestampRangePredicate timestampFilter, 
ColumnVisibilityPredicate columnVisibilityPredicate, Key lookupKey) {
         this.timestampFilter = timestampFilter;
+        this.columnVisibilityPredicate = columnVisibilityPredicate;
         try {
           seek(lookupKey);
         } catch (IOException e) {
@@ -512,10 +514,10 @@ public class MultiLevelIndex {
       }
       
       private final boolean checkFilterIndexEntry(IndexEntry ie) {
-        if(timestampFilter == null)
-        if (timestampFilter != null && (ie.blockStats.maxTimestamp < 
timestampFilter.startTimestamp || ie.blockStats.minTimestamp > 
timestampFilter.endTimestamp)) {
+        if(timestampFilter != null && (ie.blockStats.maxTimestamp < 
timestampFilter.startTimestamp || ie.blockStats.minTimestamp > 
timestampFilter.endTimestamp))
+          return false;
+        if(columnVisibilityPredicate != null && 
ie.blockStats.minimumVisibility != null && 
ie.blockStats.minimumVisibility.evaluate(columnVisibilityPredicate.auths) == 
false)
           return false;
-        }
         return true;
       }
       
@@ -532,7 +534,6 @@ public class MultiLevelIndex {
             }
           });
           
-          
           if (pos < 0) {
             pos = (pos * -1) - 1;
           } else if (pos < top.block.getKeyIndex().size()) {
@@ -542,14 +543,13 @@ public class MultiLevelIndex {
             }
           }
           
-
           IndexEntry ie = null;
           List<IndexEntry> index = top.block.getIndex();
           
-          if(pos > 0)
-          {
-            // look backwards to find any initial previousEntry that might 
match the timestamp range such that no entry within the given timestamp range 
is between the seeked key and the previousKey
-            previousEntry = index.get(pos-1);
+          if (pos > 0) {
+            // look backwards to find any initial previousEntry that might 
match the timestamp range such that no entry within the given timestamp range is
+            // between the seeked key and the previousKey
+            previousEntry = index.get(pos - 1);
             // TODO: find the offset for this block
             previousIndex = Integer.MIN_VALUE;
           }
@@ -562,7 +562,6 @@ public class MultiLevelIndex {
             pos++;
           }
           
-          
           if (pos == index.size()) {
             position.pop();
             goToNext();
@@ -581,7 +580,6 @@ public class MultiLevelIndex {
       }
       
       private void goToNext() throws IOException {
-        int numSkippedBlocks = 0;
         // traverse the index tree forwards
         while (position.isEmpty() == false) {
           StackEntry top = position.peek();
@@ -590,7 +588,6 @@ public class MultiLevelIndex {
           while (top.offset < index.size()) {
             if (checkFilterIndexEntry(index.get(top.offset)))
               break;
-            numSkippedBlocks++;
             top.offset++;
           }
           if (top.offset == index.size()) {
@@ -651,8 +648,6 @@ public class MultiLevelIndex {
         return nextEntry;
       }
       
-      private int blocksReturned = 0;
-      
       public IndexEntry next() {
         prepNext();
         previousEntry = nextEntry;
@@ -697,7 +692,7 @@ public class MultiLevelIndex {
     }
     
     IndexIterator lookup(Key key) throws IOException {
-      return new IndexIterator(timestampRange, key);
+      return new IndexIterator(timestampRange, columnVisibilityPredicate, key);
     }
     
     public void readFields(DataInput in) throws IOException {
@@ -751,7 +746,7 @@ public class MultiLevelIndex {
       return rootBlock.getIndex().get(rootBlock.getIndex().size() - 
1).getKey();
     }
     
-    TimestampRangePredicate timestampRange;
+    TimestampRangePredicate timestampRange = null;
     
     /**
      * @param r
@@ -759,6 +754,12 @@ public class MultiLevelIndex {
     public void setTimestampRange(TimestampRangePredicate r) {
       this.timestampRange = r;
     }
+    
+    ColumnVisibilityPredicate columnVisibilityPredicate = null;
+    
+    public void setColumnVisibilityPredicate(ColumnVisibilityPredicate 
columnVisibilityPredicate) {
+      this.columnVisibilityPredicate = columnVisibilityPredicate;
+    }
   }
   
 }

Modified: 
accumulo/branches/ACCUMULO-652/core/src/main/java/org/apache/accumulo/core/file/rfile/RFile.java
URL: 
http://svn.apache.org/viewvc/accumulo/branches/ACCUMULO-652/core/src/main/java/org/apache/accumulo/core/file/rfile/RFile.java?rev=1355044&r1=1355043&r2=1355044&view=diff
==============================================================================
--- 
accumulo/branches/ACCUMULO-652/core/src/main/java/org/apache/accumulo/core/file/rfile/RFile.java
 (original)
+++ 
accumulo/branches/ACCUMULO-652/core/src/main/java/org/apache/accumulo/core/file/rfile/RFile.java
 Thu Jun 28 15:30:29 2012
@@ -61,6 +61,7 @@ import org.apache.accumulo.core.iterator
 import org.apache.accumulo.core.iterators.IteratorEnvironment;
 import org.apache.accumulo.core.iterators.Predicate;
 import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
+import org.apache.accumulo.core.iterators.predicates.ColumnVisibilityPredicate;
 import org.apache.accumulo.core.iterators.predicates.TimestampRangePredicate;
 import org.apache.accumulo.core.iterators.system.HeapIterator;
 import org.apache.accumulo.core.security.ColumnVisibility;
@@ -776,6 +777,7 @@ public class RFile {
     }
     
     private TimestampRangePredicate timestampRange;
+    private ColumnVisibilityPredicate columnVisibilityPredicate;
     private boolean filterChanged = false;
 
     /* (non-Javadoc)
@@ -795,6 +797,12 @@ public class RFile {
           timestampRange = p;
         index.setTimestampRange(timestampRange);
       }
+      else if(filter instanceof ColumnVisibilityPredicate)
+      {
+         filterChanged = true;
+         columnVisibilityPredicate = (ColumnVisibilityPredicate)filter;
+         index.setColumnVisibilityPredicate(columnVisibilityPredicate);
+      }
       else
       {
         throw new RuntimeException("yikes, not yet implemented");

Modified: 
accumulo/branches/ACCUMULO-652/core/src/main/java/org/apache/accumulo/core/iterators/predicates/TimestampRangePredicate.java
URL: 
http://svn.apache.org/viewvc/accumulo/branches/ACCUMULO-652/core/src/main/java/org/apache/accumulo/core/iterators/predicates/TimestampRangePredicate.java?rev=1355044&r1=1355043&r2=1355044&view=diff
==============================================================================
--- 
accumulo/branches/ACCUMULO-652/core/src/main/java/org/apache/accumulo/core/iterators/predicates/TimestampRangePredicate.java
 (original)
+++ 
accumulo/branches/ACCUMULO-652/core/src/main/java/org/apache/accumulo/core/iterators/predicates/TimestampRangePredicate.java
 Thu Jun 28 15:30:29 2012
@@ -51,4 +51,8 @@ public class TimestampRangePredicate imp
     return timestamp >= startTimestamp && timestamp <= endTimestamp;
   }
   
+  @Override
+  public String toString() {
+    return "{"+startTimestamp+"-"+endTimestamp+"}";
+  }
 }

Modified: 
accumulo/branches/ACCUMULO-652/core/src/test/java/org/apache/accumulo/core/file/rfile/TimestampFilterTest.java
URL: 
http://svn.apache.org/viewvc/accumulo/branches/ACCUMULO-652/core/src/test/java/org/apache/accumulo/core/file/rfile/TimestampFilterTest.java?rev=1355044&r1=1355043&r2=1355044&view=diff
==============================================================================
--- 
accumulo/branches/ACCUMULO-652/core/src/test/java/org/apache/accumulo/core/file/rfile/TimestampFilterTest.java
 (original)
+++ 
accumulo/branches/ACCUMULO-652/core/src/test/java/org/apache/accumulo/core/file/rfile/TimestampFilterTest.java
 Thu Jun 28 15:30:29 2012
@@ -46,7 +46,7 @@ public class TimestampFilterTest {
   @Test
   public void testRFileTimestampFiltering() throws Exception {
     // TODO create an RFile with increasing timestamp and random key order
-    Predicate<Key,Value> timeRange = new TimestampRangePredicate(100, 110);
+    Predicate<Key,Value> timeRange = new TimestampRangePredicate(73, 117);
     int expected = 0;
     Random r = new Random();
     Configuration conf = new Configuration();


Reply via email to