Github user mikemccand commented on a diff in the pull request:
https://github.com/apache/lucene-solr/pull/526#discussion_r241372770
--- Diff:
lucene/core/src/java/org/apache/lucene/index/FrozenBufferedUpdates.java ---
@@ -821,4 +759,93 @@ public String toString() {
boolean any() {
return deleteTerms.size() > 0 || deleteQueries.length > 0 ||
fieldUpdatesCount > 0 ;
}
+
+ /**
+ * This class helps iterating a term dictionary and consuming all the
docs for each terms.
+ * It accepts a field, value tuple and returns a {@link
DocIdSetIterator} if the field has an entry
+ * for the given value. It has an optimized way of iterating the term
dictionary if the terms are
+ * passed in sorted order and makes sure terms and postings are reused
as much as possible.
+ */
+ static final class TermDocsIterator {
+ private final TermsProvider provider;
+ private String field;
+ private TermsEnum termsEnum;
+ private PostingsEnum postingsEnum;
+ private final boolean sortedTerms;
+ private BytesRef readerTerm;
+
+ @FunctionalInterface
+ interface TermsProvider {
+ Terms terms(String field) throws IOException;
+ }
+
+ TermDocsIterator(Fields fields, boolean sortedTerms) {
+ this(fields::terms, sortedTerms);
+ }
+
+ TermDocsIterator(LeafReader reader, boolean sortedTerms) {
+ this(reader::terms, sortedTerms);
+ }
+
+ private TermDocsIterator(TermsProvider provider, boolean sortedTerms) {
+ this.sortedTerms = sortedTerms;
+ this.provider = provider;
+ }
+
+ private void nextField(String field) throws IOException {
+ if (this.field == null || this.field.equals(field) == false) {
+ this.field = field;
+ Terms terms = provider.terms(field);
+ if (terms != null) {
+ termsEnum = terms.iterator();
+ if (sortedTerms) {
+ readerTerm = termsEnum.next();
+ }
+ } else {
+ termsEnum = null;
+ }
+ }
+ }
+
+ DocIdSetIterator nextTerm(String field, BytesRef term) throws
IOException {
+ nextField(field);
+ if (termsEnum != null) {
+ if (sortedTerms) {
+ // in the sorted case we can take advantage of the "seeking
forward" property
+ // this allows us depending on the term dict impl to reuse
data-strucutres internally
--- End diff --
`data-strucutres` -> `data-structures`
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]