diff --git a/server/src/main/java/org/elasticsearch/index/mapper/AbstractShapeGeometryFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/AbstractShapeGeometryFieldMapper.java index f531f60d2e0ae..472fb5f2d763d 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/AbstractShapeGeometryFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/AbstractShapeGeometryFieldMapper.java @@ -92,12 +92,12 @@ protected BoundsBlockLoader(String fieldName) { } @Override - public BlockLoader.AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + public BlockLoader.ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { breaker.addEstimateBytesAndMaybeBreak(BLOCK_LOADER_ESTIMATED_SIZE, "load blocks"); BinaryDocValues binaryDocValues = context.reader().getBinaryDocValues(fieldName); if (binaryDocValues == null) { breaker.addWithoutBreaking(-BLOCK_LOADER_ESTIMATED_SIZE); - return ConstantNull.READER; + return ConstantNull.COLUMN_READER; } return new BoundsReader(breaker, binaryDocValues); } @@ -108,7 +108,7 @@ public BlockLoader.Builder builder(BlockLoader.BlockFactory factory, int expecte } } - private static class BoundsReader implements BlockLoader.AllReader { + private static class BoundsReader implements BlockLoader.ColumnAtATimeReader { private final GeometryDocValueReader reader = new GeometryDocValueReader(); private final CircuitBreaker breaker; private final BinaryDocValues binaryDocValues; @@ -129,11 +129,6 @@ public BlockLoader.Block read(BlockLoader.BlockFactory factory, BlockLoader.Docs } } - @Override - public void read(int docId, BlockLoader.StoredFields storedFields, BlockLoader.Builder builder) throws IOException { - read(binaryDocValues, docId, (org.elasticsearch.index.mapper.BlockLoader.IntBuilder) builder); - } - private void read(BinaryDocValues binaryDocValues, int doc, org.elasticsearch.index.mapper.BlockLoader.IntBuilder builder) throws IOException { if (binaryDocValues.advanceExact(doc) == false) { diff --git a/server/src/main/java/org/elasticsearch/index/mapper/BlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/BlockLoader.java index 1485b49d6e6e3..a41d3925ea180 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/BlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/BlockLoader.java @@ -146,14 +146,14 @@ * but to disable {@code _source} and {@code doc_values}. Nothing's perfect. Especially * code. *

- *

Why is {@link AllReader}?

+ *

Column-at-a-time vs row-stride

*

- * When we described how to read from {@code doc_values} we said we prefer - * to use {@link ColumnAtATimeReader}. But some callers don't support reading column-at-a-time - * and need to read row-by-row. So we also need an implementation of {@link RowStrideReader} - * that reads from {@code doc_values}. Usually it's most convenient to implement both of those - * in the same {@code class}. {@link AllReader} is an interface for those sorts of classes, and - * you'll see it in the {@code doc_values} code frequently. + * Readers may load {@link ColumnAtATimeReader column-at-a-time} or {@link RowStrideReader row-by-row}. + * They need only return non-null from {@link #columnAtATimeReader} or {@link #rowStrideReader}. + * {@link ColumnAtATimeReader}s have the lowest overhead and get access to a large batch of document + * ids to load at once, making them must faster for loading dense on disk structures like doc values + * or vector distances. {@link RowStrideReader}s can use {@link StoredFields} to access Lucene's + * compressed {@code stored} fields, include Elasticsearch's {@code _source}. *

*

Why is {@link #rowStrideStoredFieldSpec}?

*

@@ -294,13 +294,6 @@ interface RowStrideReader extends Reader { void read(int docId, StoredFields storedFields, Builder builder) throws IOException; } - /** - * @deprecated we no longer need to implement {@link RowStrideReader} when - * storage prefers column-at-a-time - */ - @Deprecated - interface AllReader extends ColumnAtATimeReader, RowStrideReader {} - interface StoredFields { /** * The {@code _source} of the document. @@ -431,31 +424,57 @@ public RowStrideReader rowStrideReader(CircuitBreaker breaker, LeafReaderContext if (preferLoader.rowStrideStoredFieldSpec().noRequirements() == false) { return fallbackLoader.rowStrideReader(breaker, context); } - RowStrideReader preferReader = preferLoader.rowStrideReader(breaker, context); - if (canUsePreferLoaderForLeaf(context)) { - return preferReader; - } - RowStrideReader fallbackReader = fallbackLoader.rowStrideReader(breaker, context); - return new RowStrideReader() { - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - if (storedFields.loaded() == false && canUsePreferLoaderForDoc(docId)) { - preferReader.read(docId, storedFields, builder); - } else { - fallbackReader.read(docId, storedFields, builder); - } + RowStrideReader preferReader = null; + RowStrideReader fallbackReader = null; + boolean success = false; + try { + preferReader = preferLoader.rowStrideReader(breaker, context); + if (preferReader == null) { + throw new IllegalStateException( + "ConditionalBlockLoader requires sub-readers to support both row-at-a-time and column-at-a-time: " + preferLoader + ); } - - @Override - public boolean canReuse(int startingDocID) { - return fallbackReader.canReuse(startingDocID) && preferReader.canReuse(startingDocID); + if (canUsePreferLoaderForLeaf(context)) { + success = true; + return preferReader; } - - @Override - public void close() { + fallbackReader = fallbackLoader.rowStrideReader(breaker, context); + success = true; + return new ConditionalRowStrideReader(preferReader, fallbackReader); + } finally { + if (success == false) { Releasables.close(preferReader, fallbackReader); } - }; + } + } + + class ConditionalRowStrideReader implements RowStrideReader { + private final RowStrideReader preferReader; + private final RowStrideReader fallbackReader; + + ConditionalRowStrideReader(RowStrideReader preferReader, RowStrideReader fallbackReader) { + this.preferReader = preferReader; + this.fallbackReader = fallbackReader; + } + + @Override + public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { + if (storedFields.loaded() == false && canUsePreferLoaderForDoc(docId)) { + preferReader.read(docId, storedFields, builder); + } else { + fallbackReader.read(docId, storedFields, builder); + } + } + + @Override + public boolean canReuse(int startingDocID) { + return fallbackReader.canReuse(startingDocID) && preferReader.canReuse(startingDocID); + } + + @Override + public void close() { + Releasables.close(preferReader, fallbackReader); + } } @Override diff --git a/server/src/main/java/org/elasticsearch/index/mapper/BlockSourceReader.java b/server/src/main/java/org/elasticsearch/index/mapper/BlockSourceReader.java index 66da2d304b99a..350d6f7df3978 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/BlockSourceReader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/BlockSourceReader.java @@ -139,7 +139,7 @@ public final RowStrideReader rowStrideReader(CircuitBreaker breaker, LeafReaderC DocIdSetIterator iter = lookup.lookup(context); if (iter == null) { breaker.addWithoutBreaking(-ESTIMATED_SIZE); - return ConstantNull.READER; + return ConstantNull.ROW_READER; } return rowStrideReader(breaker, context, iter); } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/IdFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/IdFieldMapper.java index 1080522132622..1bf27b3288210 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/IdFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/IdFieldMapper.java @@ -135,8 +135,7 @@ public Query existsQuery(SearchExecutionContext context) { @Override public BlockLoader blockLoader(BlockLoaderContext blContext) { - return IdLoader.create(blContext.indexSettings(), blContext.mappingLookup()) - .blockLoader(blContext.ordinalsByteSize().getBytes()); + return IdLoader.create(blContext.indexSettings(), blContext.mappingLookup()).blockLoader(blContext.ordinalsByteSize()); } @Override diff --git a/server/src/main/java/org/elasticsearch/index/mapper/IdLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/IdLoader.java index 1d34cc548f587..b356a314cfb37 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/IdLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/IdLoader.java @@ -20,12 +20,17 @@ import org.elasticsearch.cluster.routing.IndexRouting; import org.elasticsearch.cluster.routing.RoutingHashBuilder; import org.elasticsearch.common.breaker.CircuitBreaker; +import org.elasticsearch.common.unit.ByteSizeValue; +import org.elasticsearch.core.Releasables; import org.elasticsearch.index.IndexMode; import org.elasticsearch.index.IndexSettings; import org.elasticsearch.index.IndexVersions; import org.elasticsearch.index.fieldvisitor.LeafStoredFieldLoader; import org.elasticsearch.index.mapper.blockloader.docvalues.BlockDocValuesReader; -import org.elasticsearch.index.mapper.blockloader.docvalues.tracking.TrackingNumericDocValues; +import org.elasticsearch.index.mapper.blockloader.docvalues.tracking.NumericDvSingletonOrSorted; +import org.elasticsearch.index.mapper.blockloader.docvalues.tracking.SortedDvSingletonOrSet; +import org.elasticsearch.index.mapper.blockloader.docvalues.tracking.TrackingSortedDocValues; +import org.elasticsearch.index.mapper.blockloader.docvalues.tracking.TrackingSortedNumericDocValues; import java.io.IOException; import java.util.ArrayList; @@ -89,7 +94,7 @@ static IdLoader createTsIdLoader( Leaf leaf(LeafStoredFieldLoader loader, LeafReader reader, int[] docIdsInLeaf) throws IOException; - BlockLoader blockLoader(long ordinalsByteSize); + BlockLoader blockLoader(ByteSizeValue ordinalsByteSize); /** * Returns a leaf instance for a leaf reader that returns the _id for segment level doc ids. @@ -179,14 +184,14 @@ public IdLoader.Leaf leaf(LeafStoredFieldLoader loader, LeafReader reader, int[] } @Override - public BlockLoader blockLoader(long ordinalsByteSize) { + public BlockLoader blockLoader(ByteSizeValue ordinalsByteSize) { return new BlockDocValuesReader.DocValuesBlockLoader() { @Override - public AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + public ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { if (indexRouting != null) { - return new LegacyTsIdFieldReader(breaker, ordinalsByteSize, context.reader(), indexRouting, routingPaths); + return new LegacyTsIdFieldReader(breaker, ordinalsByteSize, context, indexRouting, routingPaths); } else { - return new TsIdFieldReader(breaker, ordinalsByteSize, context.reader(), useSyntheticId); + return new TsIdFieldReader(breaker, ordinalsByteSize, context, useSyntheticId); } } @@ -198,26 +203,38 @@ public Builder builder(BlockFactory factory, int expectedCount) { } private static class TsIdFieldReader extends BlockDocValuesReader { - final long ordinalsByteSize; - final SortedDocValues tsidDVs; - final SortedNumericDocValues timestampDVs; - final SortedDocValues routingHashDVs; + final TrackingSortedDocValues tsidDVs; + final TrackingSortedNumericDocValues timestampDVs; + final TrackingSortedDocValues routingHashDVs; final boolean useSyntheticId; - TsIdFieldReader(CircuitBreaker breaker, long ordinalsByteSize, LeafReader leafReader, boolean useSyntheticId) + TsIdFieldReader(CircuitBreaker breaker, ByteSizeValue ordinalsByteSize, LeafReaderContext ctx, boolean useSyntheticId) throws IOException { - super(breaker); - this.ordinalsByteSize = ordinalsByteSize; - breaker.addWithoutBreaking(estimatedSize(ordinalsByteSize)); - this.tsidDVs = DocValues.getSorted(leafReader, TimeSeriesIdFieldMapper.NAME); - this.timestampDVs = DocValues.getSortedNumeric(leafReader, DataStream.TIMESTAMP_FIELD_NAME); - this.routingHashDVs = DocValues.getSorted(leafReader, TimeSeriesRoutingHashFieldMapper.NAME); + super(null); + boolean success = false; + TrackingSortedDocValues tsidDVs = null; + TrackingSortedNumericDocValues timestampDVs = null; + TrackingSortedDocValues routingHashDVs = null; + try { + tsidDVs = SortedDvSingletonOrSet.get(breaker, ordinalsByteSize, ctx, TimeSeriesIdFieldMapper.NAME).forceSingle(); + timestampDVs = NumericDvSingletonOrSorted.get(breaker, ctx, DataStream.TIMESTAMP_FIELD_NAME).forceSorted(); + routingHashDVs = SortedDvSingletonOrSet.get(breaker, ordinalsByteSize, ctx, TimeSeriesRoutingHashFieldMapper.NAME) + .forceSingle(); + success = true; + } finally { + if (success == false) { + Releasables.close(tsidDVs, timestampDVs, routingHashDVs); + } + } + this.tsidDVs = tsidDVs; + this.timestampDVs = timestampDVs; + this.routingHashDVs = routingHashDVs; this.useSyntheticId = useSyntheticId; } @Override protected int docId() { - return tsidDVs.docID(); + return tsidDVs.docValues().docID(); } @Override @@ -230,23 +247,22 @@ public BlockLoader.Block read(BlockLoader.BlockFactory factory, BlockLoader.Docs throws IOException { try (var builder = factory.bytesRefs(docs.count() - offset)) { for (int i = offset; i < docs.count(); i++) { - read(docs.get(i), null, builder); + read(docs.get(i), builder); } return builder.build(); } } - @Override - public void read(int docId, BlockLoader.StoredFields storedFields, BlockLoader.Builder builder) throws IOException { - if (tsidDVs.advanceExact(docId) == false - || timestampDVs.advanceExact(docId) == false - || routingHashDVs.advanceExact(docId) == false) { + private void read(int docId, BlockLoader.BytesRefBuilder builder) throws IOException { + if (tsidDVs.docValues().advanceExact(docId) == false + || timestampDVs.docValues().advanceExact(docId) == false + || routingHashDVs.docValues().advanceExact(docId) == false) { assert false : "_tsid or @timestamp or _ts_routing_hash missing for docId " + docId; throw new IllegalStateException("_tsid or @timestamp or _ts_routing_hash missing for docId " + docId); } - BytesRef tsid = tsidDVs.lookupOrd(tsidDVs.ordValue()); - long timestamp = timestampDVs.nextValue(); - BytesRef routingHashBytes = routingHashDVs.lookupOrd(routingHashDVs.ordValue()); + BytesRef tsid = tsidDVs.docValues().lookupOrd(tsidDVs.docValues().ordValue()); + long timestamp = timestampDVs.docValues().nextValue(); + BytesRef routingHashBytes = routingHashDVs.docValues().lookupOrd(routingHashDVs.docValues().ordValue()); int routingHash = TimeSeriesRoutingHashFieldMapper.decode( Uid.decodeId(routingHashBytes.bytes, routingHashBytes.offset, routingHashBytes.length) ); @@ -256,52 +272,56 @@ public void read(int docId, BlockLoader.StoredFields storedFields, BlockLoader.B } else { id = TsidExtractingIdFieldMapper.createId(routingHash, tsid, timestamp); } - ((BlockLoader.BytesRefBuilder) builder).appendBytesRef(new BytesRef(id)); + builder.appendBytesRef(new BytesRef(id)); } @Override public void close() { - breaker.addWithoutBreaking(-estimatedSize(ordinalsByteSize)); + Releasables.close(tsidDVs, timestampDVs, routingHashDVs); } - - private static long estimatedSize(long ordinalsByteSize) { - return TrackingNumericDocValues.ESTIMATED_SIZE + ordinalsByteSize + TrackingNumericDocValues.ESTIMATED_SIZE; - } - } private static class LegacyTsIdFieldReader extends BlockDocValuesReader { - final long ordinalsByteSize; final RoutingHashBuilder routingBuilder; - final SortedDocValues tsidDVs; - final SortedNumericDocValues timestampDVs; - final SortedDocValues[] routingHashDVs; + final TrackingSortedDocValues tsidDVs; + final TrackingSortedNumericDocValues timestampDVs; + final TrackingSortedDocValues[] routingHashDVs; final List routingPaths; final byte[] scratch = new byte[16]; LegacyTsIdFieldReader( CircuitBreaker breaker, - long ordinalsByteSize, - LeafReader leafReader, + ByteSizeValue ordinalsByteSize, + LeafReaderContext ctx, IndexRouting.ExtractFromSource.ForRoutingPath indexRouting, List routingPaths ) throws IOException { - super(breaker); - this.ordinalsByteSize = ordinalsByteSize; - breaker.addEstimateBytesAndMaybeBreak(estimatedSize(ordinalsByteSize, routingPaths.size()), "load blocks"); + super(null); + boolean success = false; + TrackingSortedDocValues tsidDVs = null; + TrackingSortedNumericDocValues timestampDVs = null; + TrackingSortedDocValues[] routingHashDVs = new TrackingSortedDocValues[routingPaths.size()]; + try { + tsidDVs = SortedDvSingletonOrSet.get(breaker, ordinalsByteSize, ctx, TimeSeriesIdFieldMapper.NAME).forceSingle(); + timestampDVs = NumericDvSingletonOrSorted.get(breaker, ctx, DataStream.TIMESTAMP_FIELD_NAME).forceSorted(); + for (int i = 0; i < routingPaths.size(); i++) { + routingHashDVs[i] = SortedDvSingletonOrSet.get(breaker, ordinalsByteSize, ctx, routingPaths.get(i)).forceSingle(); + } + } finally { + if (success == false) { + Releasables.close(tsidDVs, timestampDVs, Releasables.wrap(routingHashDVs)); + } + } this.routingBuilder = indexRouting.builder(); this.routingPaths = routingPaths; - this.routingHashDVs = new SortedDocValues[routingPaths.size()]; - for (int i = 0; i < routingPaths.size(); i++) { - this.routingHashDVs[i] = DocValues.getSorted(leafReader, routingPaths.get(i)); - } - this.tsidDVs = DocValues.getSorted(leafReader, TimeSeriesIdFieldMapper.NAME); - this.timestampDVs = DocValues.getSortedNumeric(leafReader, DataStream.TIMESTAMP_FIELD_NAME); + this.tsidDVs = tsidDVs; + this.timestampDVs = timestampDVs; + this.routingHashDVs = routingHashDVs; } @Override protected int docId() { - return tsidDVs.docID(); + return tsidDVs.docValues().docID(); } @Override @@ -314,39 +334,34 @@ public BlockLoader.Block read(BlockLoader.BlockFactory factory, BlockLoader.Docs throws IOException { try (var builder = factory.bytesRefs(docs.count() - offset)) { for (int i = offset; i < docs.count(); i++) { - read(docs.get(i), null, builder); + read(docs.get(i), builder); } return builder.build(); } } - @Override - public void read(int docId, BlockLoader.StoredFields storedFields, BlockLoader.Builder builder) throws IOException { - if (tsidDVs.advanceExact(docId) == false || timestampDVs.advanceExact(docId) == false) { + private void read(int docId, BlockLoader.BytesRefBuilder builder) throws IOException { + if (tsidDVs.docValues().advanceExact(docId) == false || timestampDVs.docValues().advanceExact(docId) == false) { assert false : "_tsid or @timestamp missing for docId " + docId; throw new IllegalStateException("_tsid or @timestamp missing for docId " + docId); } routingBuilder.clear(); - BytesRef tsid = tsidDVs.lookupOrd(tsidDVs.ordValue()); - long timestamp = timestampDVs.nextValue(); + BytesRef tsid = tsidDVs.docValues().lookupOrd(tsidDVs.docValues().ordValue()); + long timestamp = timestampDVs.docValues().nextValue(); for (int i = 0; i < routingHashDVs.length; i++) { - SortedDocValues dv = routingHashDVs[i]; + SortedDocValues dv = routingHashDVs[i].docValues(); if (dv.advanceExact(docId)) { BytesRef v = dv.lookupOrd(dv.ordValue()); routingBuilder.addMatching(routingPaths.get(i), v); } } var id = TsidExtractingIdFieldMapper.createId(false, routingBuilder, tsid, timestamp, scratch); - ((BlockLoader.BytesRefBuilder) builder).appendBytesRef(new BytesRef(id)); + builder.appendBytesRef(new BytesRef(id)); } @Override public void close() { - breaker.addWithoutBreaking(-estimatedSize(ordinalsByteSize, routingPaths.size())); - } - - private static long estimatedSize(long ordinalsByteSize, int routingPathCount) { - return routingPathCount * ordinalsByteSize + ordinalsByteSize + TrackingNumericDocValues.ESTIMATED_SIZE; + Releasables.close(tsidDVs, timestampDVs, Releasables.wrap(routingHashDVs)); } } } @@ -362,7 +377,7 @@ public Leaf leaf(LeafStoredFieldLoader loader, LeafReader reader, int[] docIdsIn } @Override - public BlockLoader blockLoader(long ordinalsByteSize) { + public BlockLoader blockLoader(ByteSizeValue ordinalsByteSize) { return new BlockStoredFieldsReader.IdBlockLoader(); } } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/ConstantBytes.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/ConstantBytes.java index e95af5edf5574..25ca9c4b2ed94 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/ConstantBytes.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/ConstantBytes.java @@ -40,7 +40,7 @@ public IOFunction columnAtATimeReader(LeafR @Override public RowStrideReader rowStrideReader(CircuitBreaker breaker, LeafReaderContext context) { - return reader; + return null; } @Override @@ -63,17 +63,12 @@ public String toString() { return "ConstantBytes[" + value + "]"; } - private class Reader implements AllReader { + private class Reader implements ColumnAtATimeReader { @Override public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFiltered) { return factory.constantBytes(value, docs.count() - offset); } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) { - ((BlockLoader.BytesRefBuilder) builder).appendBytesRef(value); - } - @Override public boolean canReuse(int startingDocID) { return true; diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/ConstantNull.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/ConstantNull.java index 8ff6e30af8173..cb020d0bd8e5a 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/ConstantNull.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/ConstantNull.java @@ -16,12 +16,15 @@ import org.elasticsearch.index.mapper.BlockLoader; import org.elasticsearch.search.fetch.StoredFieldsSpec; +import java.io.IOException; + /** * Load blocks with only null. */ public class ConstantNull implements BlockLoader { public static final BlockLoader INSTANCE = new ConstantNull(); - public static final BlockLoader.AllReader READER = new Reader(); + public static final BlockLoader.ColumnAtATimeReader COLUMN_READER = new ColumnReader(); + public static final BlockLoader.RowStrideReader ROW_READER = new RowReader(); private ConstantNull() {} @@ -32,12 +35,13 @@ public Builder builder(BlockFactory factory, int expectedCount) { @Override public IOFunction columnAtATimeReader(LeafReaderContext context) { - return breaker -> READER; + return breaker -> COLUMN_READER; } @Override public RowStrideReader rowStrideReader(CircuitBreaker breaker, LeafReaderContext context) { - return READER; + // There is a ROW_READER row-byte-row implementations can use. But we don't need it here. + return null; } @Override @@ -61,22 +65,16 @@ public String toString() { } /** - * Implementation of {@link ColumnAtATimeReader} and {@link RowStrideReader} that always - * loads {@code null}. + * Implementation of {@link ColumnAtATimeReader} that always loads {@code null}. */ - private static class Reader implements AllReader { - private Reader() {} + static class ColumnReader implements ColumnAtATimeReader { + private ColumnReader() {} @Override public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFiltered) { return factory.constantNulls(docs.count() - offset); } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) { - builder.appendNull(); - } - @Override public boolean canReuse(int startingDocID) { return true; @@ -90,4 +88,24 @@ public String toString() { @Override public void close() {} } + + /** + * Implementation of {@link RowStrideReader} that always loads {@code null}. + */ + static class RowReader implements RowStrideReader { + private RowReader() {} + + @Override + public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { + builder.appendNull(); + } + + @Override + public boolean canReuse(int startingDocID) { + return true; + } + + @Override + public void close() {} + } } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/AbstractBooleansBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/AbstractBooleansBlockLoader.java index c946360596829..64b2ebdc44ba2 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/AbstractBooleansBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/AbstractBooleansBlockLoader.java @@ -34,10 +34,10 @@ public final BooleanBuilder builder(BlockFactory factory, int expectedCount) { } @Override - public AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + public final ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { NumericDvSingletonOrSorted dv = NumericDvSingletonOrSorted.get(breaker, context, fieldName); if (dv == null) { - return ConstantNull.READER; + return ConstantNull.COLUMN_READER; } if (dv.singleton() != null) { return singletonReader(dv.singleton()); @@ -45,9 +45,9 @@ public AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throw return sortedReader(dv.sorted()); } - protected abstract AllReader singletonReader(TrackingNumericDocValues docValues); + protected abstract ColumnAtATimeReader singletonReader(TrackingNumericDocValues docValues); - protected abstract AllReader sortedReader(TrackingSortedNumericDocValues docValues); + protected abstract ColumnAtATimeReader sortedReader(TrackingSortedNumericDocValues docValues); public static class Singleton extends BlockDocValuesReader { private final TrackingNumericDocValues numericDocValues; @@ -77,16 +77,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - BooleanBuilder blockBuilder = (BooleanBuilder) builder; - if (numericDocValues.docValues().advanceExact(docId)) { - blockBuilder.appendBoolean(numericDocValues.docValues().longValue() != 0); - } else { - blockBuilder.appendNull(); - } - } - @Override public int docId() { return numericDocValues.docValues().docID(); @@ -122,11 +112,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - read(docId, (BooleanBuilder) builder); - } - private void read(int doc, BooleanBuilder builder) throws IOException { if (false == numericDocValues.docValues().advanceExact(doc)) { builder.appendNull(); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/AbstractBytesRefsFromOrdsBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/AbstractBytesRefsFromOrdsBlockLoader.java index 6121d4362a4ed..152989c498764 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/AbstractBytesRefsFromOrdsBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/AbstractBytesRefsFromOrdsBlockLoader.java @@ -25,7 +25,7 @@ */ public abstract class AbstractBytesRefsFromOrdsBlockLoader extends BlockDocValuesReader.DocValuesBlockLoader { protected final String fieldName; - private final ByteSizeValue size; + protected final ByteSizeValue size; public AbstractBytesRefsFromOrdsBlockLoader(String fieldName, ByteSizeValue size) { this.fieldName = fieldName; @@ -38,10 +38,10 @@ public final BytesRefBuilder builder(BlockFactory factory, int expectedCount) { } @Override - public final AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + public final ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { SortedDvSingletonOrSet dv = SortedDvSingletonOrSet.get(breaker, size, context, fieldName); if (dv == null) { - return ConstantNull.READER; + return ConstantNull.COLUMN_READER; } if (dv.singleton() != null) { return singletonReader(dv.singleton()); @@ -49,9 +49,9 @@ public final AllReader reader(CircuitBreaker breaker, LeafReaderContext context) return sortedSetReader(dv.set()); } - protected abstract AllReader singletonReader(TrackingSortedDocValues docValues); + protected abstract ColumnAtATimeReader singletonReader(TrackingSortedDocValues docValues); - protected abstract AllReader sortedSetReader(TrackingSortedSetDocValues docValues); + protected abstract ColumnAtATimeReader sortedSetReader(TrackingSortedSetDocValues docValues); protected class Singleton extends BlockDocValuesReader { private final TrackingSortedDocValues ordinals; @@ -95,15 +95,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - if (ordinals.docValues().advanceExact(docId)) { - ((BytesRefBuilder) builder).appendBytesRef(ordinals.docValues().lookupOrd(ordinals.docValues().ordValue())); - } else { - builder.appendNull(); - } - } - @Override public int docId() { return ordinals.docValues().docID(); @@ -158,11 +149,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - read(docId, (BytesRefBuilder) builder); - } - private Block readSingleDoc(BlockFactory factory, int docId) throws IOException { if (ordinals.docValues().advanceExact(docId) == false) { return factory.constantNulls(1); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/AbstractDoublesFromDocValuesBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/AbstractDoublesFromDocValuesBlockLoader.java index b48ab11be0010..0b7751761d095 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/AbstractDoublesFromDocValuesBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/AbstractDoublesFromDocValuesBlockLoader.java @@ -37,10 +37,10 @@ public final Builder builder(BlockFactory factory, int expectedCount) { } @Override - public final AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + public final ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { NumericDvSingletonOrSorted dv = NumericDvSingletonOrSorted.get(breaker, context, fieldName); if (dv == null) { - return ConstantNull.READER; + return ConstantNull.COLUMN_READER; } if (dv.singleton() != null) { return singletonReader(dv.singleton(), toDouble); @@ -48,9 +48,9 @@ public final AllReader reader(CircuitBreaker breaker, LeafReaderContext context) return sortedReader(dv.sorted(), toDouble); } - protected abstract AllReader singletonReader(TrackingNumericDocValues docValues, BlockDocValuesReader.ToDouble toDouble); + protected abstract ColumnAtATimeReader singletonReader(TrackingNumericDocValues docValues, BlockDocValuesReader.ToDouble toDouble); - protected abstract AllReader sortedReader(TrackingSortedNumericDocValues docValues, BlockDocValuesReader.ToDouble toDouble); + protected abstract ColumnAtATimeReader sortedReader(TrackingSortedNumericDocValues docValues, BlockDocValuesReader.ToDouble toDouble); public static class Singleton extends BlockDocValuesReader implements BlockDocValuesReader.NumericDocValuesAccessor { private final TrackingNumericDocValues docValues; @@ -83,16 +83,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - DoubleBuilder blockBuilder = (DoubleBuilder) builder; - if (docValues.docValues().advanceExact(docId)) { - blockBuilder.appendDouble(toDouble.convert(docValues.docValues().longValue())); - } else { - blockBuilder.appendNull(); - } - } - @Override public int docId() { return docValues.docValues().docID(); @@ -135,11 +125,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - read(docId, (DoubleBuilder) builder); - } - private void read(int doc, DoubleBuilder builder) throws IOException { if (false == docValues.docValues().advanceExact(doc)) { builder.appendNull(); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/AbstractIntsFromDocValuesBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/AbstractIntsFromDocValuesBlockLoader.java index 4ddd6d2fa81cc..65c4e1886bd14 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/AbstractIntsFromDocValuesBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/AbstractIntsFromDocValuesBlockLoader.java @@ -35,10 +35,10 @@ public final Builder builder(BlockFactory factory, int expectedCount) { } @Override - public final AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + public final ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { NumericDvSingletonOrSorted dv = NumericDvSingletonOrSorted.get(breaker, context, fieldName); if (dv == null) { - return ConstantNull.READER; + return ConstantNull.COLUMN_READER; } if (dv.singleton() != null) { return singletonReader(dv.singleton()); @@ -46,9 +46,9 @@ public final AllReader reader(CircuitBreaker breaker, LeafReaderContext context) return sortedReader(dv.sorted()); } - protected abstract AllReader singletonReader(TrackingNumericDocValues docValues); + protected abstract ColumnAtATimeReader singletonReader(TrackingNumericDocValues docValues); - protected abstract AllReader sortedReader(TrackingSortedNumericDocValues docValues); + protected abstract ColumnAtATimeReader sortedReader(TrackingSortedNumericDocValues docValues); public static class Singleton extends BlockDocValuesReader implements BlockDocValuesReader.NumericDocValuesAccessor { private final TrackingNumericDocValues numericDocValues; @@ -79,16 +79,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - IntBuilder blockBuilder = (IntBuilder) builder; - if (numericDocValues.docValues().advanceExact(docId)) { - blockBuilder.appendInt(Math.toIntExact(numericDocValues.docValues().longValue())); - } else { - blockBuilder.appendNull(); - } - } - @Override public int docId() { return numericDocValues.docValues().docID(); @@ -129,11 +119,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - read(docId, (IntBuilder) builder); - } - private void read(int doc, IntBuilder builder) throws IOException { if (false == numericDocValues.docValues().advanceExact(doc)) { builder.appendNull(); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/AbstractLongsFromDocValuesBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/AbstractLongsFromDocValuesBlockLoader.java index 2e78b84beee68..46b73cc7eaa77 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/AbstractLongsFromDocValuesBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/AbstractLongsFromDocValuesBlockLoader.java @@ -35,10 +35,10 @@ public final Builder builder(BlockFactory factory, int expectedCount) { } @Override - public final AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + public final ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { NumericDvSingletonOrSorted dv = NumericDvSingletonOrSorted.get(breaker, context, fieldName); if (dv == null) { - return ConstantNull.READER; + return ConstantNull.COLUMN_READER; } if (dv.singleton() != null) { return singletonReader(dv.singleton()); @@ -46,9 +46,9 @@ public final AllReader reader(CircuitBreaker breaker, LeafReaderContext context) return sortedReader(dv.sorted()); } - protected abstract AllReader singletonReader(TrackingNumericDocValues docValues); + protected abstract ColumnAtATimeReader singletonReader(TrackingNumericDocValues docValues); - protected abstract AllReader sortedReader(TrackingSortedNumericDocValues docValues); + protected abstract ColumnAtATimeReader sortedReader(TrackingSortedNumericDocValues docValues); public static class Singleton extends BlockDocValuesReader implements BlockDocValuesReader.NumericDocValuesAccessor { private final TrackingNumericDocValues numericDocValues; @@ -79,16 +79,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - LongBuilder blockBuilder = (LongBuilder) builder; - if (numericDocValues.docValues().advanceExact(docId)) { - blockBuilder.appendLong(numericDocValues.docValues().longValue()); - } else { - blockBuilder.appendNull(); - } - } - @Override public int docId() { return numericDocValues.docValues().docID(); @@ -129,11 +119,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - read(docId, (LongBuilder) builder); - } - private void read(int doc, LongBuilder builder) throws IOException { if (false == numericDocValues.docValues().advanceExact(doc)) { builder.appendNull(); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BlockDocValuesReader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BlockDocValuesReader.java index d555517b9bc79..030e83bd96e2e 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BlockDocValuesReader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BlockDocValuesReader.java @@ -22,7 +22,7 @@ /** * A reader that supports reading doc-values from a Lucene segment in Block fashion. */ -public abstract class BlockDocValuesReader implements BlockLoader.AllReader { +public abstract class BlockDocValuesReader implements BlockLoader.ColumnAtATimeReader { protected final CircuitBreaker breaker; private final Thread creationThread; @@ -45,7 +45,7 @@ public final boolean canReuse(int startingDocID) { public abstract String toString(); public abstract static class DocValuesBlockLoader implements BlockLoader { - public abstract AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException; + public abstract ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException; @Override public final IOFunction columnAtATimeReader(LeafReaderContext context) { @@ -53,8 +53,8 @@ public final IOFunction columnAtATimeReader } @Override - public final RowStrideReader rowStrideReader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { - return reader(breaker, context); + public RowStrideReader rowStrideReader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + return null; } @Override diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BooleansBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BooleansBlockLoader.java index 16d07116f64e2..1516c23081101 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BooleansBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BooleansBlockLoader.java @@ -18,12 +18,12 @@ public BooleansBlockLoader(String fieldName) { } @Override - protected AllReader singletonReader(TrackingNumericDocValues docValues) { + protected ColumnAtATimeReader singletonReader(TrackingNumericDocValues docValues) { return new Singleton(docValues); } @Override - protected AllReader sortedReader(TrackingSortedNumericDocValues docValues) { + protected ColumnAtATimeReader sortedReader(TrackingSortedNumericDocValues docValues) { return new Sorted(docValues); } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BytesRefsFromBinaryBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BytesRefsFromBinaryBlockLoader.java index b33441d1643cb..3b09c66779e61 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BytesRefsFromBinaryBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BytesRefsFromBinaryBlockLoader.java @@ -47,10 +47,10 @@ public Builder builder(BlockFactory factory, int expectedCount) { } @Override - public AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + public ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { TrackingBinaryDocValues dv = TrackingBinaryDocValues.get(breaker, context, docValuesSupplier); if (dv == null) { - return ConstantNull.READER; + return ConstantNull.COLUMN_READER; } return new BytesRefsFromBinary(dv); } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BytesRefsFromBinaryMultiSeparateCountBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BytesRefsFromBinaryMultiSeparateCountBlockLoader.java index 586e0857ee902..70bbcd17eeebc 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BytesRefsFromBinaryMultiSeparateCountBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BytesRefsFromBinaryMultiSeparateCountBlockLoader.java @@ -35,10 +35,10 @@ public Builder builder(BlockFactory factory, int expectedCount) { } @Override - public AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + public ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { BinaryAndCounts bc = BinaryAndCounts.get(breaker, context, fieldName, true); if (bc == null) { - return ConstantNull.READER; + return ConstantNull.COLUMN_READER; } if (bc.counts() == null) { return new BytesRefsFromBinaryBlockLoader.BytesRefsFromBinary(bc.binary()); @@ -55,11 +55,6 @@ static class BytesRefsFromBinarySeparateCount extends BytesRefsFromCustomBinaryB this.counts = counts; } - @Override - public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFiltered) throws IOException { - return super.read(factory, docs, offset, nullsFiltered); - } - @Override public void read(int doc, BytesRefBuilder builder) throws IOException { if (false == docValues.docValues().advanceExact(doc)) { diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BytesRefsFromCustomBinaryBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BytesRefsFromCustomBinaryBlockLoader.java index 9d7da5bc633dd..2049f33387b18 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BytesRefsFromCustomBinaryBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BytesRefsFromCustomBinaryBlockLoader.java @@ -37,15 +37,15 @@ public Builder builder(BlockFactory factory, int expectedCount) { } @Override - public AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + public ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { TrackingBinaryDocValues dv = TrackingBinaryDocValues.get(breaker, context, fieldName); if (dv == null) { - return ConstantNull.READER; + return ConstantNull.COLUMN_READER; } return new BytesRefsFromCustomBinary(dv); } - public abstract static class AbstractBytesRefsFromBinary extends BlockDocValuesReader { + public abstract static class AbstractBytesRefsFromBinary extends BlockDocValuesReader implements RowStrideReader { protected final TrackingBinaryDocValues docValues; public AbstractBytesRefsFromBinary(TrackingBinaryDocValues docValues) { @@ -65,7 +65,7 @@ public BlockLoader.Block read(BlockFactory factory, Docs docs, int offset, boole } @Override - public void read(int docId, BlockLoader.StoredFields storedFields, Builder builder) throws IOException { + public final void read(int docId, StoredFields storedFields, Builder builder) throws IOException { read(docId, (BytesRefBuilder) builder); } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BytesRefsFromOrdsBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BytesRefsFromOrdsBlockLoader.java index 4304a8ecc9242..ddd783db7cd4e 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BytesRefsFromOrdsBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/BytesRefsFromOrdsBlockLoader.java @@ -12,7 +12,10 @@ import org.apache.lucene.index.DocValues; import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.SortedSetDocValues; +import org.elasticsearch.common.breaker.CircuitBreaker; import org.elasticsearch.common.unit.ByteSizeValue; +import org.elasticsearch.index.mapper.blockloader.ConstantNull; +import org.elasticsearch.index.mapper.blockloader.docvalues.tracking.SortedDvSingletonOrSet; import org.elasticsearch.index.mapper.blockloader.docvalues.tracking.TrackingSortedDocValues; import org.elasticsearch.index.mapper.blockloader.docvalues.tracking.TrackingSortedSetDocValues; @@ -29,12 +32,12 @@ public BytesRefsFromOrdsBlockLoader(String fieldName, ByteSizeValue size) { } @Override - protected AllReader singletonReader(TrackingSortedDocValues docValues) { + protected ColumnAtATimeReader singletonReader(TrackingSortedDocValues docValues) { return new Singleton(docValues); } @Override - protected AllReader sortedSetReader(TrackingSortedSetDocValues docValues) { + protected ColumnAtATimeReader sortedSetReader(TrackingSortedSetDocValues docValues) { return new SortedSet(docValues); } @@ -52,4 +55,44 @@ public SortedSetDocValues ordinals(LeafReaderContext context) throws IOException public String toString() { return "BytesRefsFromOrds[" + fieldName + "]"; } + + @Override + public RowStrideReader rowStrideReader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + SortedDvSingletonOrSet dv = SortedDvSingletonOrSet.get(breaker, size, context, fieldName); + if (dv == null) { + return ConstantNull.ROW_READER; + } + return new RowStride(dv.forceSet(), Thread.currentThread()); + } + + private record RowStride(TrackingSortedSetDocValues ordinals, Thread creationThread) implements RowStrideReader { + @Override + public void read(int docId, StoredFields storedFields, Builder b) throws IOException { + BytesRefBuilder builder = (BytesRefBuilder) b; + if (ordinals.docValues().advanceExact(docId) == false) { + builder.appendNull(); + return; + } + int count = ordinals.docValues().docValueCount(); + if (count == 1) { + builder.appendBytesRef(ordinals.docValues().lookupOrd(ordinals.docValues().nextOrd())); + return; + } + builder.beginPositionEntry(); + for (int v = 0; v < count; v++) { + builder.appendBytesRef(ordinals.docValues().lookupOrd(ordinals.docValues().nextOrd())); + } + builder.endPositionEntry(); + } + + @Override + public boolean canReuse(int startingDocID) { + return creationThread == Thread.currentThread() && ordinals.docValues().docID() <= startingDocID; + } + + @Override + public void close() { + ordinals.close(); + } + } } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/DateRangeDocValuesLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/DateRangeDocValuesLoader.java index 5e4e86e8f7288..b7124dd97520d 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/DateRangeDocValuesLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/DateRangeDocValuesLoader.java @@ -32,10 +32,10 @@ public Builder builder(BlockFactory factory, int expectedCount) { } @Override - public AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + public ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { TrackingBinaryDocValues dv = TrackingBinaryDocValues.get(breaker, context, fieldName); if (dv == null) { - return ConstantNull.READER; + return ConstantNull.COLUMN_READER; } return new DateRangeDocValuesReader(dv); } @@ -87,20 +87,6 @@ public BlockLoader.Block read(BlockLoader.BlockFactory factory, BlockLoader.Docs } } - @Override - public void read(int doc, BlockLoader.StoredFields storedFields, BlockLoader.Builder builder) throws IOException { - var blockBuilder = (BlockLoader.LongRangeBuilder) builder; - this.docId = doc; - if (false == docValues.docValues().advanceExact(doc)) { - blockBuilder.appendNull(); - } else { - var range = BinaryRangeUtil.decodeLongRanges(docValues.docValues().binaryValue()); - assert range.size() == 1 : "stored fields should only have a single range"; - blockBuilder.from().appendLong((long) range.getFirst().getFrom()); - blockBuilder.to().appendLong((long) range.getFirst().getTo()); - } - } - @Override public void close() { docValues.close(); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/DenseVectorBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/DenseVectorBlockLoader.java index dfe09ad05958d..468a07a8b4487 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/DenseVectorBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/DenseVectorBlockLoader.java @@ -61,7 +61,7 @@ public Builder builder(BlockFactory factory, int expectedCount) { } @Override - public AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + public ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { breaker.addEstimateBytesAndMaybeBreak(ESTIMATED_SIZE, "load blocks"); boolean release = true; try { @@ -101,7 +101,7 @@ public AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throw } } - return ConstantNull.READER; + return ConstantNull.COLUMN_READER; } finally { if (release) { breaker.addWithoutBreaking(-ESTIMATED_SIZE); @@ -151,12 +151,6 @@ public BlockLoader.Block read(BlockLoader.BlockFactory factory, BlockLoader.Docs } } - @Override - @SuppressWarnings("unchecked") - public void read(int docId, BlockLoader.StoredFields storedFields, BlockLoader.Builder builder) throws IOException { - read(docId, (B) builder); - } - /** * Reads a document and appends it to the builder. * Handles null values when the document doesn't have a vector. diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/DenseVectorFromBinaryBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/DenseVectorFromBinaryBlockLoader.java index 87f93272d8a23..a78bf63577dca 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/DenseVectorFromBinaryBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/DenseVectorFromBinaryBlockLoader.java @@ -45,10 +45,10 @@ public Builder builder(BlockFactory factory, int expectedCount) { } @Override - public AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + public ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { TrackingBinaryDocValues dv = TrackingBinaryDocValues.get(breaker, context, fieldName); if (dv == null) { - return ConstantNull.READER; + return ConstantNull.COLUMN_READER; } return switch (elementType) { case FLOAT -> new FloatDenseVectorFromBinary(dv, dims, indexVersion); @@ -77,11 +77,6 @@ public int docId() { return docValues.docValues().docID(); } - @Override - public void read(int docId, BlockLoader.StoredFields storedFields, Builder builder) throws IOException { - read(docId, (BlockLoader.FloatBuilder) builder); - } - @Override public BlockLoader.Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFiltered) throws IOException { try (BlockLoader.FloatBuilder builder = factory.denseVectors(docs.count() - offset, dimensions)) { diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/DoublesBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/DoublesBlockLoader.java index ccf1f53550173..418aff194648e 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/DoublesBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/DoublesBlockLoader.java @@ -18,12 +18,12 @@ public DoublesBlockLoader(String fieldName, BlockDocValuesReader.ToDouble toDoub } @Override - protected AllReader singletonReader(TrackingNumericDocValues docValues, BlockDocValuesReader.ToDouble toDouble) { + protected ColumnAtATimeReader singletonReader(TrackingNumericDocValues docValues, BlockDocValuesReader.ToDouble toDouble) { return new Singleton(docValues, toDouble); } @Override - protected AllReader sortedReader(TrackingSortedNumericDocValues docValues, BlockDocValuesReader.ToDouble toDouble) { + protected ColumnAtATimeReader sortedReader(TrackingSortedNumericDocValues docValues, BlockDocValuesReader.ToDouble toDouble) { return new Sorted(docValues, toDouble); } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/GeoBytesRefFromLongsBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/GeoBytesRefFromLongsBlockLoader.java index 3f83975159f55..94cb2e007798e 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/GeoBytesRefFromLongsBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/GeoBytesRefFromLongsBlockLoader.java @@ -44,10 +44,10 @@ public Builder builder(BlockFactory factory, int expectedCount) { } @Override - public AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + public ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { NumericDvSingletonOrSorted dv = NumericDvSingletonOrSorted.get(breaker, context, fieldName); if (dv == null) { - return ConstantNull.READER; + return ConstantNull.COLUMN_READER; } TrackingSortedNumericDocValues sorted = dv.forceSorted(); return new BytesRefsFromLong(sorted, geoPointLong -> { @@ -91,11 +91,6 @@ public BlockLoader.Block read(BlockLoader.BlockFactory factory, BlockLoader.Docs } } - @Override - public void read(int docId, BlockLoader.StoredFields storedFields, BlockLoader.Builder builder) throws IOException { - read(docId, (BlockLoader.BytesRefBuilder) builder); - } - private void read(int doc, BlockLoader.BytesRefBuilder builder) throws IOException { if (numericDocValues.docValues().advanceExact(doc) == false) { builder.appendNull(); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/IntsBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/IntsBlockLoader.java index 5fa2db9bd46b2..bfbf80d14df49 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/IntsBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/IntsBlockLoader.java @@ -21,12 +21,12 @@ public IntsBlockLoader(String fieldName) { } @Override - protected AllReader singletonReader(TrackingNumericDocValues docValues) { + protected ColumnAtATimeReader singletonReader(TrackingNumericDocValues docValues) { return new Singleton(docValues); } @Override - protected AllReader sortedReader(TrackingSortedNumericDocValues docValues) { + protected ColumnAtATimeReader sortedReader(TrackingSortedNumericDocValues docValues) { return new Sorted(docValues); } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/LongsBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/LongsBlockLoader.java index 2ebba02978f3d..01db28a21f369 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/LongsBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/LongsBlockLoader.java @@ -18,12 +18,12 @@ public LongsBlockLoader(String fieldName) { } @Override - protected AllReader singletonReader(TrackingNumericDocValues docValues) { + protected ColumnAtATimeReader singletonReader(TrackingNumericDocValues docValues) { return new Singleton(docValues); } @Override - protected AllReader sortedReader(TrackingSortedNumericDocValues docValues) { + protected ColumnAtATimeReader sortedReader(TrackingSortedNumericDocValues docValues) { return new Sorted(docValues); } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/ByteLengthFromBytesRefDocValuesBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/ByteLengthFromBytesRefDocValuesBlockLoader.java index 3119632356459..0ad932e877409 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/ByteLengthFromBytesRefDocValuesBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/ByteLengthFromBytesRefDocValuesBlockLoader.java @@ -40,10 +40,10 @@ public Builder builder(BlockFactory factory, int expectedCount) { } @Override - public AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + public ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { BinaryAndCounts bc = BinaryAndCounts.get(breaker, context, fieldName, true); if (bc == null) { - return ConstantNull.READER; + return ConstantNull.COLUMN_READER; } if (bc.counts() == null) { return new SingleValued(bc.binary()); @@ -64,11 +64,6 @@ public int docId() { return docValues.docValues().docID(); } - @Override - public void read(int docId, BlockLoader.StoredFields storedFields, Builder builder) throws IOException { - read(docId, (IntBuilder) builder); - } - @Override public BlockLoader.Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFiltered) throws IOException { if (docValues.docValues() instanceof BlockLoader.OptionalLengthReader direct) { diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MultiValuedBinaryWithSeparateCountsLengthReader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MultiValuedBinaryWithSeparateCountsLengthReader.java index d13df944cdf6f..3772b7cdc2b42 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MultiValuedBinaryWithSeparateCountsLengthReader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MultiValuedBinaryWithSeparateCountsLengthReader.java @@ -54,11 +54,6 @@ public BlockLoader.Block read(BlockLoader.BlockFactory factory, BlockLoader.Docs } } - @Override - public void read(int docId, BlockLoader.StoredFields storedFields, BlockLoader.Builder builder) throws IOException { - appendLength(docId, (BlockLoader.IntBuilder) builder); - } - @Override public int docId() { return counts.docValues().docID(); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMaxBooleansBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMaxBooleansBlockLoader.java index 53faf4518d496..1f51cb505ae14 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMaxBooleansBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMaxBooleansBlockLoader.java @@ -27,12 +27,12 @@ public MvMaxBooleansBlockLoader(String fieldName) { } @Override - protected AllReader singletonReader(TrackingNumericDocValues docValues) { + protected ColumnAtATimeReader singletonReader(TrackingNumericDocValues docValues) { return new Singleton(docValues); } @Override - protected AllReader sortedReader(TrackingSortedNumericDocValues docValues) { + protected ColumnAtATimeReader sortedReader(TrackingSortedNumericDocValues docValues) { return new MvMaxSorted(docValues); } @@ -60,11 +60,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - read(docId, (BooleanBuilder) builder); - } - private void read(int doc, BooleanBuilder builder) throws IOException { if (false == numericDocValues.docValues().advanceExact(doc)) { builder.appendNull(); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMaxBytesRefsFromOrdsBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMaxBytesRefsFromOrdsBlockLoader.java index 76f728d6de382..3cbde7f59a8e2 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMaxBytesRefsFromOrdsBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMaxBytesRefsFromOrdsBlockLoader.java @@ -30,12 +30,12 @@ public MvMaxBytesRefsFromOrdsBlockLoader(String fieldName, ByteSizeValue byteSiz } @Override - protected AllReader singletonReader(TrackingSortedDocValues docValues) { + protected ColumnAtATimeReader singletonReader(TrackingSortedDocValues docValues) { return new Singleton(docValues); } @Override - protected AllReader sortedSetReader(TrackingSortedSetDocValues docValues) { + protected ColumnAtATimeReader sortedSetReader(TrackingSortedSetDocValues docValues) { return new MvMaxSortedSet(docValues); } @@ -74,11 +74,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - read(docId, (BytesRefBuilder) builder); - } - private Block readSingleDoc(BlockFactory factory, int docId) throws IOException { if (ordinals.docValues().advanceExact(docId) == false) { return factory.constantNulls(1); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMaxDoublesFromDocValuesBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMaxDoublesFromDocValuesBlockLoader.java index 3a0e4f70e097d..89650fe66ed6d 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMaxDoublesFromDocValuesBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMaxDoublesFromDocValuesBlockLoader.java @@ -27,12 +27,12 @@ public MvMaxDoublesFromDocValuesBlockLoader(String fieldName, BlockDocValuesRead } @Override - protected AllReader singletonReader(TrackingNumericDocValues docValues, BlockDocValuesReader.ToDouble toDouble) { + protected ColumnAtATimeReader singletonReader(TrackingNumericDocValues docValues, BlockDocValuesReader.ToDouble toDouble) { return new Singleton(docValues, toDouble); } @Override - protected AllReader sortedReader(TrackingSortedNumericDocValues docValues, BlockDocValuesReader.ToDouble toDouble) { + protected ColumnAtATimeReader sortedReader(TrackingSortedNumericDocValues docValues, BlockDocValuesReader.ToDouble toDouble) { return new MvMaxSorted(docValues, toDouble); } @@ -62,11 +62,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - read(docId, (DoubleBuilder) builder); - } - private void read(int doc, DoubleBuilder builder) throws IOException { if (false == numericDocValues.docValues().advanceExact(doc)) { builder.appendNull(); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMaxIntsFromDocValuesBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMaxIntsFromDocValuesBlockLoader.java index 5e3a58a8958f6..c4da3f73b5fc6 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMaxIntsFromDocValuesBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMaxIntsFromDocValuesBlockLoader.java @@ -27,12 +27,12 @@ public MvMaxIntsFromDocValuesBlockLoader(String fieldName) { } @Override - protected AllReader singletonReader(TrackingNumericDocValues docValues) { + protected ColumnAtATimeReader singletonReader(TrackingNumericDocValues docValues) { return new Singleton(docValues); } @Override - protected AllReader sortedReader(TrackingSortedNumericDocValues docValues) { + protected ColumnAtATimeReader sortedReader(TrackingSortedNumericDocValues docValues) { return new MvMaxSorted(docValues); } @@ -60,11 +60,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - read(docId, (IntBuilder) builder); - } - private void read(int doc, IntBuilder builder) throws IOException { if (false == numericDocValues.docValues().advanceExact(doc)) { builder.appendNull(); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMaxLongsFromDocValuesBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMaxLongsFromDocValuesBlockLoader.java index bcd01f75209e2..1cfa0a6a3e851 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMaxLongsFromDocValuesBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMaxLongsFromDocValuesBlockLoader.java @@ -26,12 +26,12 @@ public MvMaxLongsFromDocValuesBlockLoader(String fieldName) { } @Override - protected AllReader singletonReader(TrackingNumericDocValues docValues) { + protected ColumnAtATimeReader singletonReader(TrackingNumericDocValues docValues) { return new Singleton(docValues); } @Override - protected AllReader sortedReader(TrackingSortedNumericDocValues docValues) { + protected ColumnAtATimeReader sortedReader(TrackingSortedNumericDocValues docValues) { return new MvMaxSorted(docValues); } @@ -59,11 +59,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - read(docId, (LongBuilder) builder); - } - private void read(int doc, LongBuilder builder) throws IOException { if (false == numericDocValues.docValues().advanceExact(doc)) { builder.appendNull(); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinBooleansBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinBooleansBlockLoader.java index d500d22a3652a..351a06a0d18a3 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinBooleansBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinBooleansBlockLoader.java @@ -25,12 +25,12 @@ public MvMinBooleansBlockLoader(String fieldName) { } @Override - protected AllReader singletonReader(TrackingNumericDocValues docValues) { + protected ColumnAtATimeReader singletonReader(TrackingNumericDocValues docValues) { return new Singleton(docValues); } @Override - protected AllReader sortedReader(TrackingSortedNumericDocValues docValues) { + protected ColumnAtATimeReader sortedReader(TrackingSortedNumericDocValues docValues) { return new MvMinSorted(docValues); } @@ -58,11 +58,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - read(docId, (BooleanBuilder) builder); - } - private void read(int doc, BooleanBuilder builder) throws IOException { if (false == numericDocValues.docValues().advanceExact(doc)) { builder.appendNull(); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinBytesRefsFromBinaryBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinBytesRefsFromBinaryBlockLoader.java index 4c810e11b33b8..95f08868515c3 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinBytesRefsFromBinaryBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinBytesRefsFromBinaryBlockLoader.java @@ -39,10 +39,10 @@ public Builder builder(BlockFactory factory, int expectedCount) { } @Override - public AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + public ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { BinaryAndCounts bc = BinaryAndCounts.get(breaker, context, fieldName, true); if (bc == null) { - return ConstantNull.READER; + return ConstantNull.COLUMN_READER; } if (bc.counts() == null) { return new BytesRefsFromBinaryBlockLoader.BytesRefsFromBinary(bc.binary()); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinBytesRefsFromOrdsBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinBytesRefsFromOrdsBlockLoader.java index e37cd0315efaa..19db87e609e95 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinBytesRefsFromOrdsBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinBytesRefsFromOrdsBlockLoader.java @@ -30,12 +30,12 @@ public MvMinBytesRefsFromOrdsBlockLoader(String fieldName, ByteSizeValue byteSiz } @Override - protected AllReader singletonReader(TrackingSortedDocValues docValues) { + protected ColumnAtATimeReader singletonReader(TrackingSortedDocValues docValues) { return new Singleton(docValues); } @Override - protected AllReader sortedSetReader(TrackingSortedSetDocValues docValues) { + protected ColumnAtATimeReader sortedSetReader(TrackingSortedSetDocValues docValues) { return new MvMinSortedSet(docValues); } @@ -73,11 +73,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - read(docId, (BytesRefBuilder) builder); - } - private Block readSingleDoc(BlockFactory factory, int docId) throws IOException { if (ordinals.docValues().advanceExact(docId) == false) { return factory.constantNulls(1); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinDoublesFromDocValuesBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinDoublesFromDocValuesBlockLoader.java index 7bc28b117f04c..5d58497ff7d8f 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinDoublesFromDocValuesBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinDoublesFromDocValuesBlockLoader.java @@ -25,12 +25,12 @@ public MvMinDoublesFromDocValuesBlockLoader(String fieldName, BlockDocValuesRead } @Override - protected AllReader singletonReader(TrackingNumericDocValues docValues, BlockDocValuesReader.ToDouble toDouble) { + protected ColumnAtATimeReader singletonReader(TrackingNumericDocValues docValues, BlockDocValuesReader.ToDouble toDouble) { return new Singleton(docValues, toDouble); } @Override - protected AllReader sortedReader(TrackingSortedNumericDocValues docValues, BlockDocValuesReader.ToDouble toDouble) { + protected ColumnAtATimeReader sortedReader(TrackingSortedNumericDocValues docValues, BlockDocValuesReader.ToDouble toDouble) { return new MvMinSorted(docValues, toDouble); } @@ -60,11 +60,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - read(docId, (DoubleBuilder) builder); - } - private void read(int doc, DoubleBuilder builder) throws IOException { if (false == numericDocValues.docValues().advanceExact(doc)) { builder.appendNull(); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinIntsFromDocValuesBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinIntsFromDocValuesBlockLoader.java index f705131299694..e804a29b43810 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinIntsFromDocValuesBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinIntsFromDocValuesBlockLoader.java @@ -25,12 +25,12 @@ public MvMinIntsFromDocValuesBlockLoader(String fieldName) { } @Override - protected AllReader singletonReader(TrackingNumericDocValues docValues) { + protected ColumnAtATimeReader singletonReader(TrackingNumericDocValues docValues) { return new Singleton(docValues); } @Override - protected AllReader sortedReader(TrackingSortedNumericDocValues docValues) { + protected ColumnAtATimeReader sortedReader(TrackingSortedNumericDocValues docValues) { return new MvMinSorted(docValues); } @@ -58,11 +58,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - read(docId, (IntBuilder) builder); - } - private void read(int doc, IntBuilder builder) throws IOException { if (false == numericDocValues.docValues().advanceExact(doc)) { builder.appendNull(); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinLongsFromDocValuesBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinLongsFromDocValuesBlockLoader.java index b7badd82f36a2..d9db693581aa4 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinLongsFromDocValuesBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/MvMinLongsFromDocValuesBlockLoader.java @@ -25,12 +25,12 @@ public MvMinLongsFromDocValuesBlockLoader(String fieldName) { } @Override - protected AllReader singletonReader(TrackingNumericDocValues docValues) { + protected ColumnAtATimeReader singletonReader(TrackingNumericDocValues docValues) { return new Singleton(docValues); } @Override - protected AllReader sortedReader(TrackingSortedNumericDocValues docValues) { + protected ColumnAtATimeReader sortedReader(TrackingSortedNumericDocValues docValues) { return new MvMinSorted(docValues); } @@ -58,11 +58,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - read(docId, (LongBuilder) builder); - } - private void read(int doc, LongBuilder builder) throws IOException { if (false == numericDocValues.docValues().advanceExact(doc)) { builder.appendNull(); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/Utf8CodePointsFromOrdsBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/Utf8CodePointsFromOrdsBlockLoader.java index cba418067a499..93c671153a8cd 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/Utf8CodePointsFromOrdsBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/Utf8CodePointsFromOrdsBlockLoader.java @@ -70,7 +70,7 @@ public IntBuilder builder(BlockFactory factory, int expectedCount) { } @Override - public AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + public ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { SortedDvSingletonOrSet dv = SortedDvSingletonOrSet.get(breaker, size, context, fieldName); if (dv != null) { if (dv.singleton() != null) { @@ -86,7 +86,7 @@ public AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throw } BinaryAndCounts bc = BinaryAndCounts.get(breaker, context, fieldName, false); if (bc == null) { - return ConstantNull.READER; + return ConstantNull.COLUMN_READER; } return new MultiValuedBinaryWithSeparateCounts(warnings, bc.counts(), bc.binary()); } @@ -155,15 +155,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - if (ordinals.docValues().advanceExact(docId)) { - ((IntBuilder) builder).appendInt(codePointsAtOrd(ordinals.docValues().ordValue())); - } else { - builder.appendNull(); - } - } - @Override public int docId() { return ordinals.docValues().docID(); @@ -317,20 +308,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - if (ordinals.docValues().advanceExact(docId) == false) { - builder.appendNull(); - return; - } - if (ordinals.docValues().docValueCount() != 1) { - registerSingleValueWarning(warnings); - builder.appendNull(); - return; - } - ((IntBuilder) builder).appendInt(codePointsAtOrd(Math.toIntExact(ordinals.docValues().nextOrd()))); - } - @Override public int docId() { return ordinals.docValues().docID(); @@ -479,11 +456,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - read(docId, (IntBuilder) builder); - } - private void read(int docId, IntBuilder builder) throws IOException { if (ordinals.docValues().advanceExact(docId) == false) { builder.appendNull(); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/tracking/SortedDvSingletonOrSet.java b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/tracking/SortedDvSingletonOrSet.java index fb1cc4a42bd8b..a58898b1b94b3 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/tracking/SortedDvSingletonOrSet.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/tracking/SortedDvSingletonOrSet.java @@ -55,6 +55,14 @@ public static SortedDvSingletonOrSet get(CircuitBreaker breaker, ByteSizeValue s } } + public TrackingSortedDocValues forceSingle() { + if (singleton == null) { + set.close(); + throw new IllegalStateException("expected singleton"); + } + return singleton; + } + public TrackingSortedSetDocValues forceSet() { if (set != null) { return set; diff --git a/server/src/main/java/org/elasticsearch/index/mapper/flattened/RootFlattenedDocValuesBlockLoader.java b/server/src/main/java/org/elasticsearch/index/mapper/flattened/RootFlattenedDocValuesBlockLoader.java index 7afff7192bc67..ad9f2d5d039b0 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/flattened/RootFlattenedDocValuesBlockLoader.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/flattened/RootFlattenedDocValuesBlockLoader.java @@ -70,11 +70,11 @@ public SortedSetDocValues ordinals(LeafReaderContext context) throws IOException return null; } - public AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + FlattenedReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { var reader = fieldLoader.docValuesLoader(context.reader(), null); var trackingReader = reader != null ? new TrackingLoader(reader) : null; - return new AllReader() { + return new FlattenedReader() { private final Thread creationThread = Thread.currentThread(); @Override @@ -144,6 +144,8 @@ public RowStrideReader rowStrideReader(CircuitBreaker breaker, LeafReaderContext return reader(breaker, context); } + private interface FlattenedReader extends ColumnAtATimeReader, RowStrideReader {} + /** * A DocValuesLoader that tracks the last advanced docId. */ diff --git a/server/src/test/java/org/elasticsearch/index/mapper/AbstractShapeGeometryFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/AbstractShapeGeometryFieldMapperTests.java index 3cad059af9672..7405909170dbc 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/AbstractShapeGeometryFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/AbstractShapeGeometryFieldMapperTests.java @@ -78,7 +78,7 @@ public void testCartesianBoundsNoData() throws IOException { try (DirectoryReader reader = DirectoryReader.open(directory)) { LeafReader leaf = getOnlyLeafReader(reader); try ( - BlockLoader.AllReader allReader = loader.reader(breaker, leaf.getContext()); + BlockLoader.ColumnAtATimeReader allReader = loader.reader(breaker, leaf.getContext()); var block = (TestBlock) allReader.read(TestBlock.factory(), TestBlock.docs(0), 0, false) ) { assertThat(block.size(), equalTo(1)); @@ -152,7 +152,7 @@ private static void testBoundsBlockLoaderAux( expected.add(visitor.apply(geometries.get(j + currentIndex)).get()); } try ( - BlockLoader.AllReader allReader = loader.reader(breaker, leaf); + BlockLoader.ColumnAtATimeReader allReader = loader.reader(breaker, leaf); var block = (TestBlock) allReader.read(TestBlock.factory(), TestBlock.docs(array), 0, false) ) { for (int i = 0; i < block.size(); i++) { diff --git a/server/src/test/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/AbstractBooleansFromDocValuesBlockLoaderTests.java b/server/src/test/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/AbstractBooleansFromDocValuesBlockLoaderTests.java index 70423d062ecc6..569a59059c789 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/AbstractBooleansFromDocValuesBlockLoaderTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/AbstractBooleansFromDocValuesBlockLoaderTests.java @@ -18,8 +18,6 @@ import org.elasticsearch.common.breaker.CircuitBreaker; import org.elasticsearch.core.CheckedFunction; import org.elasticsearch.index.mapper.AbstractBlockLoaderTestCase; -import org.elasticsearch.index.mapper.BlockLoader; -import org.elasticsearch.index.mapper.TestBlock; import java.io.IOException; import java.util.ArrayList; @@ -58,10 +56,6 @@ protected final void test(CircuitBreaker breaker, CheckedFunction readerMatcher() { return hasToString("BlockDocValuesReader.Bytes"); } - private TestBlock read(BlockLoader.AllReader reader, BlockLoader.Docs docs) throws IOException { - return (TestBlock) reader.read(TestBlock.factory(), docs, 0, false); - } - private void checkBlocks(TestBlock strings, TestBlock mvMin) { for (int i = 0; i < strings.size(); i++) { Object str = strings.get(i); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/BinaryUtf8CodePointLengthBlockLoaderTests.java b/server/src/test/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/BinaryUtf8CodePointLengthBlockLoaderTests.java index 4dacb9668ff71..51da064d6945a 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/BinaryUtf8CodePointLengthBlockLoaderTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/blockloader/docvalues/fn/BinaryUtf8CodePointLengthBlockLoaderTests.java @@ -122,10 +122,6 @@ protected void test(CircuitBreaker breaker, CheckedFunction wrap) throws IOException; + + protected final TestBlock read(BlockLoader.ColumnAtATimeReader reader, BlockLoader.Docs docs) throws IOException { + return (TestBlock) reader.read(TestBlock.factory(), docs, 0, false); + } } diff --git a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/mapper/ExponentialHistogramFieldMapper.java b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/mapper/ExponentialHistogramFieldMapper.java index d5240b2e3e9d0..3ce61225b726c 100644 --- a/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/mapper/ExponentialHistogramFieldMapper.java +++ b/x-pack/plugin/analytics/src/main/java/org/elasticsearch/xpack/analytics/mapper/ExponentialHistogramFieldMapper.java @@ -381,13 +381,13 @@ public Builder builder(BlockFactory factory, int expectedCount) { } @Override - public AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { - AllReader bytesReader = null; - AllReader minimaReader = null; - AllReader maximaReader = null; - AllReader sumsReader = null; - AllReader valueCountsReader = null; - AllReader zeroThresholdsReader = null; + public ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + ColumnAtATimeReader bytesReader = null; + ColumnAtATimeReader minimaReader = null; + ColumnAtATimeReader maximaReader = null; + ColumnAtATimeReader sumsReader = null; + ColumnAtATimeReader valueCountsReader = null; + ColumnAtATimeReader zeroThresholdsReader = null; try { bytesReader = bytesLoader.reader(breaker, context); @@ -415,21 +415,21 @@ public AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throw } } - static class Reader implements BlockLoader.AllReader { - private final BlockLoader.AllReader bytesReader; - private final BlockLoader.AllReader minimaReader; - private final BlockLoader.AllReader maximaReader; - private final BlockLoader.AllReader sumsReader; - private final BlockLoader.AllReader valueCountsReader; - private final BlockLoader.AllReader zeroThresholdsReader; + static class Reader implements BlockLoader.ColumnAtATimeReader { + private final BlockLoader.ColumnAtATimeReader bytesReader; + private final BlockLoader.ColumnAtATimeReader minimaReader; + private final BlockLoader.ColumnAtATimeReader maximaReader; + private final BlockLoader.ColumnAtATimeReader sumsReader; + private final BlockLoader.ColumnAtATimeReader valueCountsReader; + private final BlockLoader.ColumnAtATimeReader zeroThresholdsReader; Reader( - BlockLoader.AllReader bytesReader, - BlockLoader.AllReader minimaReader, - BlockLoader.AllReader maximaReader, - BlockLoader.AllReader sumsReader, - BlockLoader.AllReader valueCountsReader, - BlockLoader.AllReader zeroThresholdsReader + BlockLoader.ColumnAtATimeReader bytesReader, + BlockLoader.ColumnAtATimeReader minimaReader, + BlockLoader.ColumnAtATimeReader maximaReader, + BlockLoader.ColumnAtATimeReader sumsReader, + BlockLoader.ColumnAtATimeReader valueCountsReader, + BlockLoader.ColumnAtATimeReader zeroThresholdsReader ) { this.bytesReader = bytesReader; this.minimaReader = minimaReader; @@ -482,17 +482,6 @@ public BlockLoader.Block read(BlockLoader.BlockFactory factory, BlockLoader.Docs return result; } - @Override - public void read(int docId, BlockLoader.StoredFields storedFields, BlockLoader.Builder builder) throws IOException { - BlockLoader.ExponentialHistogramBuilder histogramBuilder = (BlockLoader.ExponentialHistogramBuilder) builder; - minimaReader.read(docId, storedFields, histogramBuilder.minima()); - maximaReader.read(docId, storedFields, histogramBuilder.maxima()); - sumsReader.read(docId, storedFields, histogramBuilder.sums()); - valueCountsReader.read(docId, storedFields, histogramBuilder.valueCounts()); - zeroThresholdsReader.read(docId, storedFields, histogramBuilder.zeroThresholds()); - bytesReader.read(docId, storedFields, histogramBuilder.encodedHistograms()); - } - @Override public void close() { Releasables.close(minimaReader, maximaReader, sumsReader, valueCountsReader, zeroThresholdsReader, bytesReader); diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/analytics/mapper/TDigestBlockLoader.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/analytics/mapper/TDigestBlockLoader.java index a6250f604a3fc..3af7a342c52bb 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/analytics/mapper/TDigestBlockLoader.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/analytics/mapper/TDigestBlockLoader.java @@ -39,12 +39,12 @@ public TDigestBlockLoader( } @Override - public AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { - AllReader encodedDigestReader = null; - AllReader minimaReader = null; - AllReader maximaReader = null; - AllReader sumsReader = null; - AllReader valueCountsReader = null; + public ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + ColumnAtATimeReader encodedDigestReader = null; + ColumnAtATimeReader minimaReader = null; + ColumnAtATimeReader maximaReader = null; + ColumnAtATimeReader sumsReader = null; + ColumnAtATimeReader valueCountsReader = null; try { encodedDigestReader = encodedDigestLoader.reader(breaker, context); minimaReader = minimaLoader.reader(breaker, context); @@ -65,20 +65,20 @@ public Builder builder(BlockFactory factory, int expectedCount) { return factory.tdigestBlockBuilder(expectedCount); } - static class TDigestReader implements AllReader { + static class TDigestReader implements ColumnAtATimeReader { - private final AllReader encodedDigestReader; - private final AllReader minimaReader; - private final AllReader maximaReader; - private final AllReader sumsReader; - private final AllReader valueCountsReader; + private final ColumnAtATimeReader encodedDigestReader; + private final ColumnAtATimeReader minimaReader; + private final ColumnAtATimeReader maximaReader; + private final ColumnAtATimeReader sumsReader; + private final ColumnAtATimeReader valueCountsReader; TDigestReader( - AllReader encodedDigestReader, - AllReader minimaReader, - AllReader maximaReader, - AllReader sumsReader, - AllReader valueCountsReader + ColumnAtATimeReader encodedDigestReader, + ColumnAtATimeReader minimaReader, + ColumnAtATimeReader maximaReader, + ColumnAtATimeReader sumsReader, + ColumnAtATimeReader valueCountsReader ) { this.encodedDigestReader = encodedDigestReader; this.minimaReader = minimaReader; @@ -122,16 +122,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt return result; } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - TDigestBuilder histogramBuilder = (TDigestBuilder) builder; - minimaReader.read(docId, storedFields, histogramBuilder.minima()); - maximaReader.read(docId, storedFields, histogramBuilder.maxima()); - sumsReader.read(docId, storedFields, histogramBuilder.sums()); - valueCountsReader.read(docId, storedFields, histogramBuilder.valueCounts()); - encodedDigestReader.read(docId, storedFields, histogramBuilder.encodedDigests()); - } - @Override public String toString() { return "BlockDocValuesReader.TDigest"; diff --git a/x-pack/plugin/mapper-aggregate-metric/src/main/java/org/elasticsearch/xpack/aggregatemetric/mapper/AggregateMetricDoubleBlockLoader.java b/x-pack/plugin/mapper-aggregate-metric/src/main/java/org/elasticsearch/xpack/aggregatemetric/mapper/AggregateMetricDoubleBlockLoader.java index 5279fa4b616f0..66f0638f5e7db 100644 --- a/x-pack/plugin/mapper-aggregate-metric/src/main/java/org/elasticsearch/xpack/aggregatemetric/mapper/AggregateMetricDoubleBlockLoader.java +++ b/x-pack/plugin/mapper-aggregate-metric/src/main/java/org/elasticsearch/xpack/aggregatemetric/mapper/AggregateMetricDoubleBlockLoader.java @@ -55,11 +55,11 @@ private static IntsBlockLoader getIntsBlockLoader( } @Override - public AllReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { - AllReader minReader = null; - AllReader maxReader = null; - AllReader sumReader = null; - AllReader countReader = null; + public ColumnAtATimeReader reader(CircuitBreaker breaker, LeafReaderContext context) throws IOException { + ColumnAtATimeReader minReader = null; + ColumnAtATimeReader maxReader = null; + ColumnAtATimeReader sumReader = null; + ColumnAtATimeReader countReader = null; boolean success = false; try { minReader = minLoader != null ? minLoader.reader(breaker, context) : null; @@ -81,13 +81,18 @@ public Builder builder(BlockFactory factory, int expectedCount) { return factory.aggregateMetricDoubleBuilder(expectedCount); } - private static class Reader implements AllReader { - private final AllReader minReader; - private final AllReader maxReader; - private final AllReader sumReader; - private final AllReader countReader; - - private Reader(AllReader minReader, AllReader maxReader, AllReader sumReader, AllReader countReader) { + private static class Reader implements ColumnAtATimeReader { + private final ColumnAtATimeReader minReader; + private final ColumnAtATimeReader maxReader; + private final ColumnAtATimeReader sumReader; + private final ColumnAtATimeReader countReader; + + private Reader( + ColumnAtATimeReader minReader, + ColumnAtATimeReader maxReader, + ColumnAtATimeReader sumReader, + ColumnAtATimeReader countReader + ) { this.minReader = minReader; this.maxReader = maxReader; this.sumReader = sumReader; @@ -122,23 +127,6 @@ public Block read(BlockFactory factory, Docs docs, int offset, boolean nullsFilt } } - @Override - public void read(int docId, StoredFields storedFields, Builder builder) throws IOException { - var blockBuilder = (AggregateMetricDoubleBuilder) builder; - readSingleRowFromSubblock(docId, storedFields, blockBuilder.min(), minReader); - readSingleRowFromSubblock(docId, storedFields, blockBuilder.max(), maxReader); - readSingleRowFromSubblock(docId, storedFields, blockBuilder.sum(), sumReader); - readSingleRowFromSubblock(docId, storedFields, blockBuilder.count(), countReader); - } - - private void readSingleRowFromSubblock(int docID, StoredFields storedFields, Builder builder, AllReader reader) throws IOException { - if (reader == null) { - builder.appendNull(); - } else { - reader.read(docID, storedFields, builder); - } - } - @Override public boolean canReuse(int startingDocID) { return (minReader == null || minReader.canReuse(startingDocID)) diff --git a/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/mapper/AggregateMetricDoublePartialBlockLoaderTests.java b/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/mapper/AggregateMetricDoublePartialBlockLoaderTests.java index c5116e71c81e7..0c360233e8d21 100644 --- a/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/mapper/AggregateMetricDoublePartialBlockLoaderTests.java +++ b/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/mapper/AggregateMetricDoublePartialBlockLoaderTests.java @@ -207,7 +207,7 @@ private void checkMetric(boolean loadField, String field, HashMap