diff options
Diffstat (limited to 'core/src/main/java/org/elasticsearch/index/fielddata/plain/AbstractAtomicParentChildFieldData.java')
-rw-r--r-- | core/src/main/java/org/elasticsearch/index/fielddata/plain/AbstractAtomicParentChildFieldData.java | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/core/src/main/java/org/elasticsearch/index/fielddata/plain/AbstractAtomicParentChildFieldData.java b/core/src/main/java/org/elasticsearch/index/fielddata/plain/AbstractAtomicParentChildFieldData.java index 7c03e1a794..2df5aa6bb6 100644 --- a/core/src/main/java/org/elasticsearch/index/fielddata/plain/AbstractAtomicParentChildFieldData.java +++ b/core/src/main/java/org/elasticsearch/index/fielddata/plain/AbstractAtomicParentChildFieldData.java @@ -28,6 +28,7 @@ import org.elasticsearch.index.fielddata.AtomicParentChildFieldData; import org.elasticsearch.index.fielddata.ScriptDocValues; import org.elasticsearch.index.fielddata.SortedBinaryDocValues; +import java.io.IOException; import java.util.Collection; import java.util.Collections; import java.util.Set; @@ -46,16 +47,28 @@ abstract class AbstractAtomicParentChildFieldData implements AtomicParentChildFi public final SortedBinaryDocValues getBytesValues() { return new SortedBinaryDocValues() { + private final SortedDocValues[] perTypeValues; private final BytesRef[] terms = new BytesRef[2]; private int count; + private int termsCursor; + + { + Set<String> types = types(); + perTypeValues = new SortedDocValues[types.size()]; + int i = 0; + for (String type : types) { + perTypeValues[i++] = getOrdinalsValues(type); + } + } @Override - public void setDocument(int docId) { + public boolean advanceExact(int docId) throws IOException { count = 0; - for (String type : types()) { - final SortedDocValues values = getOrdinalsValues(type); - final int ord = values.getOrd(docId); - if (ord >= 0) { + termsCursor = 0; + + for (SortedDocValues values : perTypeValues) { + if (values.advanceExact(docId)) { + final int ord = values.ordValue(); terms[count++] = values.lookupOrd(ord); } } @@ -69,16 +82,17 @@ abstract class AbstractAtomicParentChildFieldData implements AtomicParentChildFi count = 1; } } + return count != 0; } @Override - public int count() { + public int docValueCount() { return count; } @Override - public BytesRef valueAt(int index) { - return terms[index]; + public BytesRef nextValue() throws IOException { + return terms[termsCursor++]; } }; } |