accumulo-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From joshelser <...@git.apache.org>
Subject [GitHub] accumulo pull request #247: ACCUMULO-3208 Integration test for the OrIterato...
Date Wed, 12 Apr 2017 14:45:25 GMT
Github user joshelser commented on a diff in the pull request:

    https://github.com/apache/accumulo/pull/247#discussion_r111170295
  
    --- 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 --
    
    I'm not aware of any exceptions bubbling up out of an iterator if we call `next()` at
the end of the iteration. Whether or not `currentTerm` is `null` is essentially making the
same check (we never preserve the `TermSource` as `currentTerm` or in the heap after it's
been exhausted). Down below, we do that check proactively (do we have more entries for this
TermSource) before preserving it.


---
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 infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

Mime
View raw message