@@ -173,6 +173,53 @@ TEST_CASE("aod intersection: half overlap", "[tuple_sketch]") {
173173 REQUIRE (result.get_estimate () == Approx (500 ).margin (0.01 ));
174174}
175175
176+ TEST_CASE (" aod union: number of values" , " [tuple_sketch]" ) {
177+ auto sketch1 = update_array_of_doubles_sketch::builder (1 ).build ();
178+ sketch1.update (1 , std::vector<double >{1 });
179+ auto sketch3 = update_array_of_doubles_sketch::builder (3 ).build ();
180+ sketch3.update (1 , std::vector<double >{1 , 2 , 3 });
181+ sketch3.update (2 , std::vector<double >{4 , 5 , 6 });
182+
183+ // matching number of values: entries for the same key are summed
184+ auto u = array_of_doubles_union::builder (3 ).build ();
185+ u.update (sketch3);
186+ u.update (sketch3.compact ());
187+ auto result = u.get_result ();
188+ REQUIRE (result.get_num_values () == 3 );
189+ REQUIRE (result.get_num_retained () == 2 );
190+ for (const auto & entry: result) {
191+ REQUIRE (entry.second .size () == 3 );
192+ }
193+
194+ // mismatch is rejected whether or not keys overlap, and for update and compact sketches
195+ REQUIRE_THROWS_AS (u.update (sketch1), std::invalid_argument);
196+ REQUIRE_THROWS_AS (u.update (sketch1.compact ()), std::invalid_argument);
197+ auto u1 = array_of_doubles_union::builder (1 ).build ();
198+ REQUIRE_THROWS_AS (u1.update (sketch3), std::invalid_argument);
199+ auto empty3 = update_array_of_doubles_sketch::builder (3 ).build ();
200+ REQUIRE_THROWS_AS (u1.update (empty3), std::invalid_argument);
201+
202+ // a rejected update leaves the union usable
203+ u1.update (sketch1);
204+ REQUIRE (u1.get_result ().get_num_retained () == 1 );
205+ }
206+
207+ TEST_CASE (" aod intersection: number of values" , " [tuple_sketch]" ) {
208+ auto sketch1 = update_array_of_doubles_sketch::builder (1 ).build ();
209+ sketch1.update (1 , std::vector<double >{1 });
210+ auto sketch3 = update_array_of_doubles_sketch::builder (3 ).build ();
211+ sketch3.update (1 , std::vector<double >{1 , 2 , 3 });
212+
213+ array_of_doubles_intersection<default_array_of_doubles_union_policy> intersection (DEFAULT_SEED , 3 );
214+ REQUIRE_THROWS_AS (intersection.update (sketch1), std::invalid_argument);
215+ intersection.update (sketch3);
216+ REQUIRE_THROWS_AS (intersection.update (sketch1.compact ()), std::invalid_argument);
217+ intersection.update (sketch3.compact ());
218+ auto result = intersection.get_result ();
219+ REQUIRE (result.get_num_values () == 3 );
220+ REQUIRE (result.get_num_retained () == 1 );
221+ }
222+
176223TEST_CASE (" aod a-not-b: half overlap" , " [tuple_sketch]" ) {
177224 double a[1 ] = {1 };
178225
0 commit comments