Github user phrocker commented on a diff in the pull request:
https://github.com/apache/accumulo/pull/247#discussion_r111037441
--- Diff:
core/src/main/java/org/apache/accumulo/core/iterators/OrIterator.java ---
@@ -80,59 +128,103 @@ public int compareTo(TermSource o) {
// sorted after they have been determined to be valid.
return
this.iter.getTopKey().compareColumnQualifier(o.iter.getTopKey().getColumnQualifier());
}
+
+ /**
+ * Converts the given {@code Range} into the correct {@code Range} for
this TermSource (per this expected table structure) and then seeks this
TermSource's
+ * SKVI.
+ */
+ public void seek(Range originalRange) throws IOException {
+ // the infinite start key is equivalent to a null startKey on the
Range.
+ if (!originalRange.isInfiniteStartKey()) {
+ Key originalStartKey = originalRange.getStartKey();
+ // Pivot the provided range into the range for this term
+ Key newKey = new Key(originalStartKey.getRow(), term,
originalStartKey.getColumnQualifier(), originalStartKey.getTimestamp());
+ // Construct the new range, preserving the other attributes on the
provided range.
+ currentRange = new Range(newKey,
originalRange.isStartKeyInclusive(), originalRange.getEndKey(),
originalRange.isEndKeyInclusive());
+ } else {
+ currentRange = originalRange;
+ }
+ LOG.trace("Seeking {} to {}", this, currentRange);
+ iter.seek(currentRange, seekColfams, true);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("TermSource{term=").append(term).append(",
currentRange=").append(currentRange).append("}");
+ return sb.toString();
+ }
+
+ /**
+ * @return True if there is a valid topKey which falls into the range
this TermSource's iterator was last seeked to, false otherwise.
+ */
+ boolean hasEntryForTerm() {
+ if (!iter.hasTop()) {
+ return false;
+ }
+ return currentRange.contains(iter.getTopKey());
+ }
}
public OrIterator() {
- this.sources = new ArrayList<>();
+ this.sources = Collections.emptyList();
}
private OrIterator(OrIterator other, IteratorEnvironment env) {
- this.sources = new ArrayList<>();
+ ArrayList<TermSource> copiedSources = new ArrayList<>();
for (TermSource TS : other.sources)
- this.sources.add(new TermSource(TS.iter.deepCopy(env), TS.term));
+ copiedSources.add(new TermSource(TS.iter.deepCopy(env), new
Text(TS.term)));
+ this.sources = Collections.unmodifiableList(copiedSources);
}
@Override
public SortedKeyValueIterator<Key,Value> deepCopy(IteratorEnvironment
env) {
return new OrIterator(this, env);
}
- public void addTerm(SortedKeyValueIterator<Key,Value> source, Text term,
IteratorEnvironment env) {
- this.sources.add(new TermSource(source.deepCopy(env), term));
+ public void setTerms(SortedKeyValueIterator<Key,Value> source,
Collection<String> terms, IteratorEnvironment env) {
+ ArrayList<TermSource> newTerms = new ArrayList<>();
+ for (String term : terms) {
+ newTerms.add(new TermSource(source.deepCopy(env), new Text(term)));
+ }
+ this.sources = Collections.unmodifiableList(newTerms);
}
@Override
final public void next() throws IOException {
-
+ LOG.trace("next()");
if (currentTerm == null)
return;
// Advance currentTerm
currentTerm.iter.next();
--- End diff --
Why was has next top called here to avoid an exception
(IllegalStateException I believe ? )
---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---