diff --git a/docs/changelog/108283.yaml b/docs/changelog/108283.yaml new file mode 100644 index 0000000000000..6341a8775b729 --- /dev/null +++ b/docs/changelog/108283.yaml @@ -0,0 +1,6 @@ +pr: 108283 +summary: Fix `BlockHash` `DirectEncoder` +area: ES|QL +type: bug +issues: + - 108268 diff --git a/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/BatchEncoder.java b/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/BatchEncoder.java index 716f251851d24..4a6f37b6c06f5 100644 --- a/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/BatchEncoder.java +++ b/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/BatchEncoder.java @@ -274,13 +274,13 @@ public final void encodeNextBatch() { @Override public final int positionCount() { - return Math.max(valueCount, 1); + return 1; // always has one position already loaded } @Override public final int valueCount(int positionOffset) { assert positionOffset == 0 : positionOffset; - return positionCount(); + return Math.max(valueCount, 1); } @Override diff --git a/x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/data/BasicBlockTests.java b/x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/data/BasicBlockTests.java index 36c7a3f178282..550a563d285f0 100644 --- a/x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/data/BasicBlockTests.java +++ b/x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/data/BasicBlockTests.java @@ -895,6 +895,7 @@ public static RandomBlock randomBlock( int maxDupsPerPosition ) { List> values = new ArrayList<>(); + Block.MvOrdering mvOrdering = Block.MvOrdering.DEDUPLICATED_AND_SORTED_ASCENDING; try (var builder = elementType.newBlockBuilder(positionCount, blockFactory)) { boolean bytesRefFromPoints = randomBoolean(); Supplier pointSupplier = randomBoolean() ? GeometryTestUtils::randomPoint : ShapeTestUtils::randomPoint; @@ -955,6 +956,19 @@ public static RandomBlock randomBlock( if (valueCount != 1 || dupCount != 0) { builder.endPositionEntry(); } + if (dupCount > 0) { + mvOrdering = Block.MvOrdering.UNORDERED; + } else if (mvOrdering != Block.MvOrdering.UNORDERED) { + List dedupedAndSortedList = valuesAtPosition.stream().sorted().distinct().toList(); + if (dedupedAndSortedList.size() != valuesAtPosition.size()) { + mvOrdering = Block.MvOrdering.UNORDERED; + } else if (dedupedAndSortedList.equals(valuesAtPosition) == false) { + mvOrdering = Block.MvOrdering.DEDUPLICATED_UNORDERD; + } + } + } + if (randomBoolean()) { + builder.mvOrdering(mvOrdering); } return new RandomBlock(values, builder.build()); }