Skip to content

Commit 04ed058

Browse files
authored
[ES|QL] Add more aggregate metric double tests (#132355)
Aggregate Metric Double was missing from a lot of existing tests
1 parent b72792d commit 04ed058

File tree

18 files changed

+574
-41
lines changed

18 files changed

+574
-41
lines changed

x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/data/AggregateMetricDoubleArrayBlock.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import java.io.IOException;
1717
import java.util.List;
18+
import java.util.stream.Collectors;
1819
import java.util.stream.Stream;
1920

2021
public final class AggregateMetricDoubleArrayBlock extends AbstractNonThreadSafeRefCounted implements AggregateMetricDoubleBlock {
@@ -310,4 +311,13 @@ public Block getMetricBlock(int index) {
310311
}
311312
throw new UnsupportedOperationException("Received an index (" + index + ") outside of range for AggregateMetricDoubleBlock.");
312313
}
314+
315+
@Override
316+
public String toString() {
317+
String valuesString = Stream.of(AggregateMetricDoubleBlockBuilder.Metric.values())
318+
.map(metric -> metric.getLabel() + "=" + getMetricBlock(metric.getIndex()))
319+
.collect(Collectors.joining(", ", "[", "]"));
320+
321+
return getClass().getSimpleName() + valuesString;
322+
}
313323
}

x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/data/AggregateMetricDoubleBlockBuilder.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ protected int elementSize() {
5858
throw new UnsupportedOperationException("Not available on aggregate_metric_double");
5959
}
6060

61+
@Override
62+
public long estimatedBytes() {
63+
return minBuilder.estimatedBytes() + maxBuilder.estimatedBytes() + sumBuilder.estimatedBytes() + countBuilder.estimatedBytes();
64+
}
65+
6166
@Override
6267
public AggregateMetricDoubleBlockBuilder copyFrom(Block b, int beginInclusive, int endExclusive) {
6368
Block minBlock;
@@ -83,6 +88,35 @@ public AggregateMetricDoubleBlockBuilder copyFrom(Block b, int beginInclusive, i
8388
return this;
8489
}
8590

91+
public AggregateMetricDoubleBlockBuilder copyFrom(AggregateMetricDoubleBlock block, int position) {
92+
if (block.isNull(position)) {
93+
appendNull();
94+
return this;
95+
}
96+
97+
if (block.minBlock().isNull(position)) {
98+
min().appendNull();
99+
} else {
100+
min().appendDouble(block.minBlock().getDouble(position));
101+
}
102+
if (block.maxBlock().isNull(position)) {
103+
max().appendNull();
104+
} else {
105+
max().appendDouble(block.maxBlock().getDouble(position));
106+
}
107+
if (block.sumBlock().isNull(position)) {
108+
sum().appendNull();
109+
} else {
110+
sum().appendDouble(block.sumBlock().getDouble(position));
111+
}
112+
if (block.countBlock().isNull(position)) {
113+
count().appendNull();
114+
} else {
115+
count().appendInt(block.countBlock().getInt(position));
116+
}
117+
return this;
118+
}
119+
86120
@Override
87121
public AggregateMetricDoubleBlockBuilder appendNull() {
88122
minBuilder.appendNull();

x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/data/BlockFactory.java

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -441,30 +441,46 @@ public final AggregateMetricDoubleBlock newConstantAggregateMetricDoubleBlock(
441441
int positions
442442
) {
443443
try (AggregateMetricDoubleBlockBuilder builder = newAggregateMetricDoubleBlockBuilder(positions)) {
444-
if (value.min() != null) {
445-
builder.min().appendDouble(value.min());
446-
} else {
447-
builder.min().appendNull();
448-
}
449-
if (value.max() != null) {
450-
builder.max().appendDouble(value.max());
451-
} else {
452-
builder.max().appendNull();
453-
}
454-
if (value.sum() != null) {
455-
builder.sum().appendDouble(value.sum());
456-
} else {
457-
builder.sum().appendNull();
458-
}
459-
if (value.count() != null) {
460-
builder.count().appendInt(value.count());
461-
} else {
462-
builder.count().appendNull();
444+
for (int i = 0; i < positions; i++) {
445+
if (value.min() != null) {
446+
builder.min().appendDouble(value.min());
447+
} else {
448+
builder.min().appendNull();
449+
}
450+
if (value.max() != null) {
451+
builder.max().appendDouble(value.max());
452+
} else {
453+
builder.max().appendNull();
454+
}
455+
if (value.sum() != null) {
456+
builder.sum().appendDouble(value.sum());
457+
} else {
458+
builder.sum().appendNull();
459+
}
460+
if (value.count() != null) {
461+
builder.count().appendInt(value.count());
462+
} else {
463+
builder.count().appendNull();
464+
}
463465
}
464466
return builder.build();
465467
}
466468
}
467469

470+
public final AggregateMetricDoubleBlock newAggregateMetricDoubleBlock(
471+
double[] minValues,
472+
double[] maxValues,
473+
double[] sumValues,
474+
int[] countValues,
475+
int positions
476+
) {
477+
DoubleBlock min = newDoubleArrayVector(minValues, positions).asBlock();
478+
DoubleBlock max = newDoubleArrayVector(maxValues, positions).asBlock();
479+
DoubleBlock sum = newDoubleArrayVector(sumValues, positions).asBlock();
480+
IntBlock count = newIntArrayVector(countValues, positions).asBlock();
481+
return new AggregateMetricDoubleArrayBlock(min, max, sum, count);
482+
}
483+
468484
/**
469485
* Returns the maximum number of bytes that a Block should be backed by a primitive array before switching to using BigArrays.
470486
*/

x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/data/AggregateMetricDoubleBlockEqualityTests.java

Lines changed: 212 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ public class AggregateMetricDoubleBlockEqualityTests extends ComputeTestCase {
1717

1818
static final BlockFactory blockFactory = TestBlockFactory.getNonBreakingInstance();
1919

20-
// TODO: Add additional tests
21-
2220
public void testEmptyBlock() {
2321
// all these "empty" blocks should be equivalent
2422
var partialMetricBuilder = blockFactory.newAggregateMetricDoubleBlockBuilder(0);
@@ -54,6 +52,198 @@ public void testEmptyBlock() {
5452
Releasables.close(blocks);
5553
}
5654

55+
public void testBlockEqualityRegularBlocks() {
56+
// all these blocks should be equivalent
57+
AggregateMetricDoubleBlockBuilder builder1 = blockFactory.newAggregateMetricDoubleBlockBuilder(3);
58+
appendValues(builder1, 1.23, 68392.1, 99999.1, 5);
59+
appendValues(builder1, 582.1, 10942, 209301.4, 25);
60+
appendValues(builder1, 8952.564, 30921.23, 18592950.14, 1000);
61+
AggregateMetricDoubleBlockBuilder builder2 = blockFactory.newAggregateMetricDoubleBlockBuilder(6);
62+
appendValues(builder2, 1.23, 68392.1, 99999.1, 5);
63+
appendValues(builder2, 1.23, 68392.1, 99999.1, 10);
64+
appendValues(builder2, 582.1, 10942, 209301.4, 25);
65+
appendValues(builder2, 999.1, 10942, 209301.4, 50);
66+
appendValues(builder2, 10000.564, 30921.23, 18592950.14, 2000);
67+
appendValues(builder2, 8952.564, 30921.23, 18592950.14, 1000);
68+
AggregateMetricDoubleBlockBuilder builder3 = blockFactory.newAggregateMetricDoubleBlockBuilder(5);
69+
builder3.appendNull();
70+
builder3.appendNull();
71+
appendValues(builder3, 1.23, 68392.1, 99999.1, 5);
72+
appendValues(builder3, 582.1, 10942, 209301.4, 25);
73+
appendValues(builder3, 8952.564, 30921.23, 18592950.14, 1000);
74+
builder3.appendNull();
75+
76+
List<AggregateMetricDoubleBlock> blocks = List.of(
77+
builder1.build(),
78+
builder2.build().filter(0, 2, 5),
79+
builder3.build().filter(2, 3, 4)
80+
);
81+
assertAllEquals(blocks);
82+
}
83+
84+
public void testBlockEqualityConstantLikeBlocks() {
85+
// all these blocks should be equivalent
86+
AggregateMetricDoubleBlockBuilder builder1 = blockFactory.newAggregateMetricDoubleBlockBuilder(2);
87+
appendValues(builder1, 12.3, 987.6, 4821.3, 6);
88+
appendValues(builder1, 12.3, 987.6, 4821.3, 6);
89+
AggregateMetricDoubleBlockBuilder builder2 = blockFactory.newAggregateMetricDoubleBlockBuilder(3);
90+
appendValues(builder2, 12.3, 987.6, 4821.3, 6);
91+
appendValues(builder2, 95.2, 10852.2, 20000.5, 5);
92+
appendValues(builder2, 12.3, 987.6, 4821.3, 6);
93+
appendValues(builder2, 1.1, 2.2, 3.3, 2);
94+
DoubleBlock min1 = blockFactory.newDoubleBlockBuilder(4).appendDouble(12.3).appendDouble(12.3).build();
95+
DoubleBlock max1 = blockFactory.newDoubleBlockBuilder(4).appendDouble(987.6).appendDouble(987.6).build();
96+
DoubleBlock sum1 = blockFactory.newDoubleBlockBuilder(4).appendDouble(4821.3).appendDouble(4821.3).build();
97+
IntBlock count1 = blockFactory.newIntBlockBuilder(4).appendInt(6).appendInt(6).build();
98+
CompositeBlock compositeBlock1 = new CompositeBlock(new Block[] { min1, max1, sum1, count1 });
99+
DoubleBlock min2 = blockFactory.newDoubleBlockBuilder(4)
100+
.appendDouble(591.1)
101+
.appendDouble(11.1)
102+
.appendDouble(12.3)
103+
.appendDouble(12.3)
104+
.build();
105+
DoubleBlock max2 = blockFactory.newDoubleBlockBuilder(4)
106+
.appendDouble(198441.1)
107+
.appendDouble(89235982.1)
108+
.appendDouble(987.6)
109+
.appendDouble(987.6)
110+
.build();
111+
DoubleBlock sum2 = blockFactory.newDoubleBlockBuilder(4)
112+
.appendDouble(13498198.2)
113+
.appendDouble(4901245982.1)
114+
.appendDouble(4821.3)
115+
.appendDouble(4821.3)
116+
.build();
117+
IntBlock count2 = blockFactory.newIntBlockBuilder(4).appendInt(100).appendInt(200).appendInt(6).appendInt(6).build();
118+
CompositeBlock compositeBlock2 = new CompositeBlock(new Block[] { min2, max2, sum2, count2 });
119+
120+
List<AggregateMetricDoubleBlock> moreBlocks = List.of(
121+
builder1.build(),
122+
builder2.build().filter(0, 2),
123+
AggregateMetricDoubleArrayBlock.fromCompositeBlock(compositeBlock1),
124+
AggregateMetricDoubleArrayBlock.fromCompositeBlock(compositeBlock2).filter(2, 3),
125+
blockFactory.newConstantAggregateMetricDoubleBlock(
126+
new AggregateMetricDoubleBlockBuilder.AggregateMetricDoubleLiteral(12.3, 987.6, 4821.3, 6),
127+
4
128+
).filter(1, 3),
129+
blockFactory.newConstantAggregateMetricDoubleBlock(
130+
new AggregateMetricDoubleBlockBuilder.AggregateMetricDoubleLiteral(12.3, 987.6, 4821.3, 6),
131+
2
132+
)
133+
);
134+
assertAllEquals(moreBlocks);
135+
}
136+
137+
public void testBlockEqualityPartialSubmetrics() {
138+
// blocks with partial submetrics appended in different orders (column vs row)
139+
AggregateMetricDoubleBlockBuilder builder1 = blockFactory.newAggregateMetricDoubleBlockBuilder(3);
140+
builder1.min().appendDouble(1.23).appendDouble(582.1).appendNull();
141+
builder1.max().appendDouble(68392.1).appendNull();
142+
builder1.max().appendDouble(30921.23);
143+
builder1.sum().appendNull();
144+
builder1.sum().appendDouble(99999.1).appendNull();
145+
builder1.count().appendNull().appendNull();
146+
builder1.count().appendInt(1000);
147+
148+
AggregateMetricDoubleBlockBuilder builder2 = blockFactory.newAggregateMetricDoubleBlockBuilder(6);
149+
builder2.appendNull();
150+
builder2.appendNull();
151+
builder2.min().appendDouble(1.23);
152+
builder2.max().appendDouble(68392.1);
153+
builder2.sum().appendNull();
154+
builder2.count().appendNull();
155+
builder2.min().appendDouble(582.1);
156+
builder2.max().appendNull();
157+
builder2.sum().appendDouble(99999.1);
158+
builder2.count().appendNull();
159+
builder2.appendNull();
160+
builder2.min().appendNull();
161+
builder2.max().appendDouble(30921.23);
162+
builder2.sum().appendNull();
163+
builder2.count().appendInt(1000);
164+
165+
List<AggregateMetricDoubleBlock> evenMoreBlocks = List.of(builder1.build(), builder2.build().filter(2, 3, 5));
166+
assertAllEquals(evenMoreBlocks);
167+
}
168+
169+
public void testBlockInequality() {
170+
// all these blocks should NOT be equivalent
171+
AggregateMetricDoubleBlockBuilder builder1 = blockFactory.newAggregateMetricDoubleBlockBuilder(3);
172+
appendValues(builder1, 1.1, 6.1, 7.2, 2);
173+
builder1.appendNull();
174+
appendValues(builder1, 1.3, 6.3, 11.9, 3);
175+
// same values as builder1, in a different order
176+
AggregateMetricDoubleBlockBuilder builder2 = blockFactory.newAggregateMetricDoubleBlockBuilder(3);
177+
appendValues(builder2, 1.3, 6.3, 11.9, 3);
178+
builder2.appendNull();
179+
appendValues(builder2, 1.1, 6.1, 7.2, 2);
180+
// first 2/3 values match builder1, last 2/3 values match builder2
181+
AggregateMetricDoubleBlockBuilder builder3 = blockFactory.newAggregateMetricDoubleBlockBuilder(3);
182+
appendValues(builder3, 1.1, 6.1, 7.2, 2);
183+
builder3.appendNull();
184+
appendValues(builder3, 1.1, 6.1, 7.2, 2);
185+
// matches the first 2 values of builder1
186+
AggregateMetricDoubleBlockBuilder builder4 = blockFactory.newAggregateMetricDoubleBlockBuilder(2);
187+
appendValues(builder4, 1.1, 6.1, 7.2, 2);
188+
builder4.appendNull();
189+
// like builder1 without null value
190+
AggregateMetricDoubleBlockBuilder builder5 = blockFactory.newAggregateMetricDoubleBlockBuilder(2);
191+
appendValues(builder5, 1.1, 6.1, 7.2, 2);
192+
appendValues(builder5, 1.3, 6.3, 11.9, 3);
193+
// like builder1 but first value's sum is null
194+
AggregateMetricDoubleBlockBuilder builder6 = blockFactory.newAggregateMetricDoubleBlockBuilder(3);
195+
builder6.min().appendDouble(1.1);
196+
builder6.max().appendDouble(6.1);
197+
builder6.sum().appendNull();
198+
builder6.count().appendInt(2);
199+
builder6.appendNull();
200+
appendValues(builder6, 1.3, 6.3, 11.9, 3);
201+
// like builder6 but max and sum are swapped
202+
AggregateMetricDoubleBlockBuilder builder7 = blockFactory.newAggregateMetricDoubleBlockBuilder(3);
203+
builder7.min().appendDouble(1.1);
204+
builder7.max().appendNull();
205+
builder7.sum().appendDouble(6.1);
206+
builder7.count().appendInt(2);
207+
builder7.appendNull();
208+
appendValues(builder7, 1.3, 6.3, 11.9, 3);
209+
210+
List<AggregateMetricDoubleBlock> notEqualBlocks = List.of(
211+
builder1.build(),
212+
builder2.build(),
213+
builder3.build(),
214+
builder4.build(),
215+
builder5.build(),
216+
builder6.build(),
217+
builder7.build(),
218+
blockFactory.newConstantAggregateMetricDoubleBlock(
219+
new AggregateMetricDoubleBlockBuilder.AggregateMetricDoubleLiteral(1.1, 6.1, 7.2, 2),
220+
1
221+
),
222+
blockFactory.newConstantAggregateMetricDoubleBlock(
223+
new AggregateMetricDoubleBlockBuilder.AggregateMetricDoubleLiteral(1.1, 6.1, 7.2, 2),
224+
3
225+
)
226+
);
227+
assertAllNotEquals(notEqualBlocks);
228+
}
229+
230+
public void testSimpleBlockWithSingleNull() {
231+
AggregateMetricDoubleBlockBuilder builder1 = blockFactory.newAggregateMetricDoubleBlockBuilder(3);
232+
appendValues(builder1, 1.1, 6.1, 7.2, 2);
233+
builder1.appendNull();
234+
appendValues(builder1, 1.3, 6.3, 11.9, 3);
235+
AggregateMetricDoubleBlockBuilder builder2 = blockFactory.newAggregateMetricDoubleBlockBuilder(3);
236+
appendValues(builder2, 1.1, 6.1, 7.2, 2);
237+
builder2.appendNull();
238+
appendValues(builder2, 1.3, 6.3, 11.9, 3);
239+
240+
List<AggregateMetricDoubleBlock> blocks = List.of(builder1.build(), builder2.build());
241+
242+
assertEquals(3, blocks.get(0).getPositionCount());
243+
assertTrue(blocks.get(0).isNull(1));
244+
assertAllEquals(blocks);
245+
}
246+
57247
public void testSimpleBlockWithManyNulls() {
58248
int positions = randomIntBetween(1, 256);
59249
boolean grow = randomBoolean();
@@ -86,4 +276,24 @@ static void assertAllEquals(List<?> objs) {
86276
}
87277
}
88278
}
279+
280+
static void assertAllNotEquals(List<?> objs) {
281+
for (Object obj1 : objs) {
282+
for (Object obj2 : objs) {
283+
if (obj1 == obj2) {
284+
continue; // skip self
285+
}
286+
assertNotEquals(obj1, obj2);
287+
assertNotEquals(obj2, obj1);
288+
assertNotEquals(obj1.hashCode(), obj2.hashCode());
289+
}
290+
}
291+
}
292+
293+
static void appendValues(AggregateMetricDoubleBlockBuilder builder, double min, double max, double sum, int count) {
294+
builder.min().appendDouble(min);
295+
builder.max().appendDouble(max);
296+
builder.sum().appendDouble(sum);
297+
builder.count().appendInt(count);
298+
}
89299
}

x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/data/BasicBlockTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ void testEmpty(BlockFactory bf) {
9999
assertZeroPositionsAndRelease(bf.newBooleanBlockBuilder(0).build());
100100
assertZeroPositionsAndRelease(bf.newBooleanArrayVector(new boolean[] {}, 0));
101101
assertZeroPositionsAndRelease(bf.newBooleanVectorBuilder(0).build());
102+
assertZeroPositionsAndRelease(bf.newAggregateMetricDoubleBlockBuilder(0).build());
102103
}
103104

104105
public void testSmallSingleValueDenseGrowthInt() {
@@ -168,6 +169,17 @@ public void testSmallSingleValueDenseGrowthBoolean() {
168169
}
169170
}
170171

172+
public void testSmallSingleValueDenseGrowthAggregateMetricDouble() {
173+
for (int initialSize : List.of(0, 1, 2, 3, 4, 5)) {
174+
try (var blockBuilder = blockFactory.newBooleanBlockBuilder(initialSize)) {
175+
IntStream.range(0, 10).forEach(i -> blockBuilder.appendBoolean(i % 3 == 0));
176+
BooleanBlock block = blockBuilder.build();
177+
assertSingleValueDenseBlock(block);
178+
block.close();
179+
}
180+
}
181+
}
182+
171183
static void assertSingleValueDenseBlock(Block initialBlock) {
172184
final int positionCount = initialBlock.getPositionCount();
173185
int depth = randomIntBetween(1, 5);

0 commit comments

Comments
 (0)