@@ -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}
0 commit comments