diff --git a/server/src/main/java/org/elasticsearch/index/codec/tsdb/ES87TSDBDocValuesProducer.java b/server/src/main/java/org/elasticsearch/index/codec/tsdb/ES87TSDBDocValuesProducer.java index 1315c27704c7e..5fc708b5ac76a 100644 --- a/server/src/main/java/org/elasticsearch/index/codec/tsdb/ES87TSDBDocValuesProducer.java +++ b/server/src/main/java/org/elasticsearch/index/codec/tsdb/ES87TSDBDocValuesProducer.java @@ -46,21 +46,29 @@ import static org.elasticsearch.index.codec.tsdb.ES87TSDBDocValuesFormat.TERMS_DICT_BLOCK_LZ4_SHIFT; public class ES87TSDBDocValuesProducer extends DocValuesProducer { - private final Map numerics = new HashMap<>(); - private final Map binaries = new HashMap<>(); - private final Map sorted = new HashMap<>(); - private final Map sortedSets = new HashMap<>(); - private final Map sortedNumerics = new HashMap<>(); + private final Map numerics; + private final Map binaries; + private final Map sorted; + private final Map sortedSets; + private final Map sortedNumerics; private final IndexInput data; private final int maxDoc; + private final int version; + private final boolean merging; ES87TSDBDocValuesProducer(SegmentReadState state, String dataCodec, String dataExtension, String metaCodec, String metaExtension) throws IOException { - String metaName = IndexFileNames.segmentFileName(state.segmentInfo.name, state.segmentSuffix, metaExtension); + this.numerics = new HashMap<>(); + this.binaries = new HashMap<>(); + this.sorted = new HashMap<>(); + this.sortedSets = new HashMap<>(); + this.sortedNumerics = new HashMap<>(); this.maxDoc = state.segmentInfo.maxDoc(); + this.merging = false; // read in the entries from the metadata file. int version = -1; + String metaName = IndexFileNames.segmentFileName(state.segmentInfo.name, state.segmentSuffix, metaExtension); try (ChecksumIndexInput in = state.directory.openChecksumInput(metaName, state.context)) { Throwable priorE = null; @@ -106,6 +114,7 @@ public class ES87TSDBDocValuesProducer extends DocValuesProducer { CodecUtil.retrieveChecksum(data); success = true; + this.version = version; } finally { if (success == false) { IOUtils.closeWhileHandlingException(this.data); @@ -113,6 +122,33 @@ public class ES87TSDBDocValuesProducer extends DocValuesProducer { } } + private ES87TSDBDocValuesProducer( + Map numerics, + Map binaries, + Map sorted, + Map sortedSets, + Map sortedNumerics, + IndexInput data, + int maxDoc, + int version, + boolean merging + ) { + this.numerics = numerics; + this.binaries = binaries; + this.sorted = sorted; + this.sortedSets = sortedSets; + this.sortedNumerics = sortedNumerics; + this.data = data.clone(); + this.maxDoc = maxDoc; + this.version = version; + this.merging = merging; + } + + @Override + public DocValuesProducer getMergeInstance() { + return new ES87TSDBDocValuesProducer(numerics, binaries, sorted, sortedSets, sortedNumerics, data, maxDoc, version, true); + } + @Override public NumericDocValues getNumeric(FieldInfo field) throws IOException { NumericEntry entry = numerics.get(field.name); @@ -146,7 +182,7 @@ public BytesRef binaryValue() throws IOException { } else { // variable length final RandomAccessInput addressesData = this.data.randomAccessSlice(entry.addressesOffset, entry.addressesLength); - final LongValues addresses = DirectMonotonicReader.getInstance(entry.addressesMeta, addressesData); + final LongValues addresses = DirectMonotonicReader.getInstance(entry.addressesMeta, addressesData, merging); return new DenseBinaryDocValues(maxDoc) { final BytesRef bytes = new BytesRef(new byte[entry.maxLength], 0, entry.maxLength); @@ -186,7 +222,7 @@ public BytesRef binaryValue() throws IOException { } else { // variable length final RandomAccessInput addressesData = this.data.randomAccessSlice(entry.addressesOffset, entry.addressesLength); - final LongValues addresses = DirectMonotonicReader.getInstance(entry.addressesMeta, addressesData); + final LongValues addresses = DirectMonotonicReader.getInstance(entry.addressesMeta, addressesData, merging); return new SparseBinaryDocValues(disi) { final BytesRef bytes = new BytesRef(new byte[entry.maxLength], 0, entry.maxLength); @@ -351,7 +387,7 @@ public int lookupTerm(BytesRef key) throws IOException { @Override public TermsEnum termsEnum() throws IOException { - return new TermsDict(entry.termsDictEntry, data); + return new TermsDict(entry.termsDictEntry, data, merging); } } @@ -359,11 +395,13 @@ private abstract class BaseSortedSetDocValues extends SortedSetDocValues { final SortedSetEntry entry; final IndexInput data; + final boolean merging; final TermsEnum termsEnum; - BaseSortedSetDocValues(SortedSetEntry entry, IndexInput data) throws IOException { + BaseSortedSetDocValues(SortedSetEntry entry, IndexInput data, boolean merging) throws IOException { this.entry = entry; this.data = data; + this.merging = merging; this.termsEnum = termsEnum(); } @@ -389,7 +427,7 @@ public long lookupTerm(BytesRef key) throws IOException { @Override public TermsEnum termsEnum() throws IOException { - return new TermsDict(entry.termsDictEntry, data); + return new TermsDict(entry.termsDictEntry, data, merging); } } @@ -410,17 +448,17 @@ private static class TermsDict extends BaseTermsEnum { long currentCompressedBlockStart = -1; long currentCompressedBlockEnd = -1; - TermsDict(TermsDictEntry entry, IndexInput data) throws IOException { + TermsDict(TermsDictEntry entry, IndexInput data, boolean merging) throws IOException { this.entry = entry; RandomAccessInput addressesSlice = data.randomAccessSlice(entry.termsAddressesOffset, entry.termsAddressesLength); - blockAddresses = DirectMonotonicReader.getInstance(entry.termsAddressesMeta, addressesSlice); + blockAddresses = DirectMonotonicReader.getInstance(entry.termsAddressesMeta, addressesSlice, merging); bytes = data.slice("terms", entry.termsDataOffset, entry.termsDataLength); blockMask = (1L << TERMS_DICT_BLOCK_LZ4_SHIFT) - 1; RandomAccessInput indexAddressesSlice = data.randomAccessSlice( entry.termsIndexAddressesOffset, entry.termsIndexAddressesLength ); - indexAddresses = DirectMonotonicReader.getInstance(entry.termsIndexAddressesMeta, indexAddressesSlice); + indexAddresses = DirectMonotonicReader.getInstance(entry.termsIndexAddressesMeta, indexAddressesSlice, merging); indexBytes = data.slice("terms-index", entry.termsIndexOffset, entry.termsIndexLength); term = new BytesRef(entry.maxTermLength); @@ -646,7 +684,7 @@ public SortedSetDocValues getSortedSet(FieldInfo field) throws IOException { SortedNumericEntry ordsEntry = entry.ordsEntry; final SortedNumericDocValues ords = getSortedNumeric(ordsEntry, entry.termsDictEntry.termsDictSize); - return new BaseSortedSetDocValues(entry, data) { + return new BaseSortedSetDocValues(entry, data, merging) { int i = 0; int count = 0; @@ -955,7 +993,7 @@ public long longValue() { // makes things slower. final RandomAccessInput indexSlice = data.randomAccessSlice(entry.indexOffset, entry.indexLength); - final DirectMonotonicReader indexReader = DirectMonotonicReader.getInstance(entry.indexMeta, indexSlice); + final DirectMonotonicReader indexReader = DirectMonotonicReader.getInstance(entry.indexMeta, indexSlice, merging); final IndexInput valuesData = data.slice("values", entry.valuesOffset, entry.valuesLength); final int bitsPerOrd = maxOrd >= 0 ? PackedInts.bitsRequired(maxOrd - 1) : -1; @@ -1086,7 +1124,7 @@ public long longValue() throws IOException { private NumericValues getValues(NumericEntry entry, final long maxOrd) throws IOException { assert entry.numValues > 0; final RandomAccessInput indexSlice = data.randomAccessSlice(entry.indexOffset, entry.indexLength); - final DirectMonotonicReader indexReader = DirectMonotonicReader.getInstance(entry.indexMeta, indexSlice); + final DirectMonotonicReader indexReader = DirectMonotonicReader.getInstance(entry.indexMeta, indexSlice, merging); final IndexInput valuesData = data.slice("values", entry.valuesOffset, entry.valuesLength); final int bitsPerOrd = maxOrd >= 0 ? PackedInts.bitsRequired(maxOrd - 1) : -1; @@ -1123,7 +1161,7 @@ private SortedNumericDocValues getSortedNumeric(SortedNumericEntry entry, long m } final RandomAccessInput addressesInput = data.randomAccessSlice(entry.addressesOffset, entry.addressesLength); - final LongValues addresses = DirectMonotonicReader.getInstance(entry.addressesMeta, addressesInput); + final LongValues addresses = DirectMonotonicReader.getInstance(entry.addressesMeta, addressesInput, merging); final NumericValues values = getValues(entry, maxOrd);