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