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; /**