Author: kturner
Date: Fri Jan 18 22:38:20 2013
New Revision: 1435383

URL: http://svn.apache.org/viewvc?rev=1435383&view=rev
Log:
ACCUMULO-956 applied patch from Brian Loss

Modified:
    
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/iterators/user/TransformingIterator.java

Modified: 
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/iterators/user/TransformingIterator.java
URL: 
http://svn.apache.org/viewvc/accumulo/trunk/core/src/main/java/org/apache/accumulo/core/iterators/user/TransformingIterator.java?rev=1435383&r1=1435382&r2=1435383&view=diff
==============================================================================
--- 
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/iterators/user/TransformingIterator.java
 (original)
+++ 
accumulo/trunk/core/src/main/java/org/apache/accumulo/core/iterators/user/TransformingIterator.java
 Fri Jan 18 22:38:20 2013
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.NoSuchElementException;
@@ -125,10 +126,16 @@ abstract public class TransformingIterat
   
   @Override
   public IteratorOptions describeOptions() {
-    String desc = "This iterator allows keys to be transformed.";
+    String desc = "This iterator allows ranges of key to be transformed (with 
the exception of row transformations).";
     String authDesc = "Comma-separated list of user's scan authorizations.  "
         + "If excluded or empty, then no visibility check is performed on 
transformed keys.";
-    return new IteratorOptions(getClass().getSimpleName(), desc, 
Collections.singletonMap(AUTH_OPT, authDesc), null);
+    String bufferDesc = "Maximum buffer size (in accumulo memory spec) to use 
for buffering keys before throwing a BufferOverflowException.  " +
+               "Users should keep this limit in mind when deciding what to 
transform.  That is, if transforming the column family for example, then all " +
+               "keys sharing the same row and column family must fit within 
this limit (along with their associated values)";
+    HashMap<String,String> namedOptions = new HashMap<String,String>();
+    namedOptions.put(AUTH_OPT, authDesc);
+    namedOptions.put(MAX_BUFFER_SIZE_OPT, bufferDesc);
+    return new IteratorOptions(getClass().getSimpleName(), desc, namedOptions, 
null);
   }
   
   @Override
@@ -166,6 +173,8 @@ abstract public class TransformingIterat
       copy.parsedVisibilitiesCache.putAll(parsedVisibilitiesCache);
     }
     
+    copy.maxBufferSize = maxBufferSize;
+    
     return copy;
   }
   
@@ -223,15 +232,17 @@ abstract public class TransformingIterat
     }
   }
 
-  private class RangeIterator implements SortedKeyValueIterator<Key,Value> {
+  private static class RangeIterator implements 
SortedKeyValueIterator<Key,Value> {
     
     private SortedKeyValueIterator<Key,Value> source;
     private Key prefixKey;
+    private PartialKey keyPrefix;
     private boolean hasTop = false;
     
-    RangeIterator(SortedKeyValueIterator<Key,Value> source, Key prefixKey) {
+    RangeIterator(SortedKeyValueIterator<Key,Value> source, Key prefixKey, 
PartialKey keyPrefix) {
       this.source = source;
       this.prefixKey = prefixKey;
+      this.keyPrefix = keyPrefix;
     }
 
     @Override
@@ -242,7 +253,7 @@ abstract public class TransformingIterat
     @Override
     public boolean hasTop() {
       // only have a top if the prefix matches
-      return hasTop = source.hasTop() && source.getTopKey().equals(prefixKey, 
getKeyPrefix());
+      return hasTop = source.hasTop() && source.getTopKey().equals(prefixKey, 
keyPrefix);
     }
     
     @Override
@@ -285,7 +296,7 @@ abstract public class TransformingIterat
     keys.clear();
     final Key prefixKey = super.hasTop() ? new Key(super.getTopKey()) : null;
     
-    transformRange(new RangeIterator(getSource(), prefixKey), new KVBuffer() {
+    transformRange(new RangeIterator(getSource(), prefixKey, getKeyPrefix()), 
new KVBuffer() {
       
       long appened = 0;
 
@@ -608,7 +619,7 @@ abstract public class TransformingIterat
   }
   
   /**
-   * Transforms {@code originalKey}. This method must not change the row part 
of the key, and must only change the parts of the key after the return value of
+   * Transforms {@code input}. This method must not change the row part of the 
key, and must only change the parts of the key after the return value of
    * {@link #getKeyPrefix()}. Implementors must also remember to copy the 
delete flag from {@code originalKey} onto the new key. Or, implementors should 
use one
    * of the helper methods to produce the new key. See any of the 
replaceKeyParts methods.
    * 
@@ -624,7 +635,6 @@ abstract public class TransformingIterat
    * @see #replaceKeyParts(Key, Text, Text)
    * @see #replaceKeyParts(Key, Text, Text, Text)
    */
-  
   abstract protected void transformRange(SortedKeyValueIterator<Key,Value> 
input, KVBuffer output) throws IOException;
   
   /**


Reply via email to