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.
---

Reply via email to