@@ -224,6 +224,20 @@ public void testVerify_incompatibleAggregation() {
224224 );
225225 }
226226
227+ public void testCountPlan_noData () throws Exception {
228+ TestRunner runner = new TestRunner (0 , 0 );
229+ Approximate approximate = createApproximate ("FROM test | STATS SUM(emp_no)" , runner );
230+ approximate .approximate (TestRunner .resultCloser );
231+ // This plan needs three passes:
232+ // - one pass to check whether it's an ES stats query (always no for the test runner)
233+ // - one pass to get the total number of rows (which is zero)
234+ // - one pass to execute the original query
235+ assertThat (runner .invocations , hasSize (3 ));
236+ assertThat (runner .invocations .get (0 ), allOf (not (hasSample ())));
237+ assertThat (runner .invocations .get (1 ), allOf (not (hasSample ())));
238+ assertThat (runner .invocations .get (2 ), allOf (not (hasSample ())));
239+ }
240+
227241 public void testCountPlan_largeDataNoFilters () throws Exception {
228242 TestRunner runner = new TestRunner (1_000_000_000 , 1_000_000_000 );
229243 Approximate approximate = createApproximate ("FROM test | STATS SUM(emp_no)" , runner );
@@ -264,8 +278,8 @@ public void testCountPlan_largeDataAfterFiltering() throws Exception {
264278 assertThat (runner .invocations , hasSize (5 ));
265279 assertThat (runner .invocations .get (0 ), allOf (hasFilter ("emp_no" ), not (hasSample ())));
266280 assertThat (runner .invocations .get (1 ), allOf (not (hasFilter ("emp_no" )), not (hasSample ())));
267- assertThat (runner .invocations .get (2 ), allOf (hasFilter ("emp_no" ), hasSample (1e-7 )));
268- assertThat (runner .invocations .get (3 ), allOf (hasFilter ("emp_no" ), hasSample (1e-4 )));
281+ assertThat (runner .invocations .get (2 ), allOf (hasFilter ("emp_no" ), hasSample (1e-8 )));
282+ assertThat (runner .invocations .get (3 ), allOf (hasFilter ("emp_no" ), hasSample (1e-5 )));
269283 assertThat (runner .invocations .get (4 ), allOf (hasFilter ("emp_no" ), hasSample (1e-4 )));
270284 }
271285
@@ -278,13 +292,15 @@ public void testCountPlan_smallDataAfterFiltering() throws Exception {
278292 // - one pass to get the total number of rows
279293 // - three passes to get the number of filtered rows (which is small)
280294 // - one pass to execute the original query
281- assertThat (runner .invocations , hasSize (6 ));
295+ assertThat (runner .invocations , hasSize (8 ));
282296 assertThat (runner .invocations .get (0 ), allOf (hasFilter ("emp_no" ), not (hasSample ())));
283297 assertThat (runner .invocations .get (1 ), allOf (not (hasFilter ("emp_no" )), not (hasSample ())));
284- assertThat (runner .invocations .get (2 ), allOf (hasFilter ("emp_no" ), hasSample (1e-13 )));
285- assertThat (runner .invocations .get (3 ), allOf (hasFilter ("emp_no" ), hasSample (1e-8 )));
286- assertThat (runner .invocations .get (4 ), allOf (hasFilter ("emp_no" ), hasSample (1e-3 )));
287- assertThat (runner .invocations .get (5 ), allOf (hasFilter ("emp_no" ), not (hasSample ())));
298+ assertThat (runner .invocations .get (2 ), allOf (hasFilter ("emp_no" ), hasSample (1e-14 )));
299+ assertThat (runner .invocations .get (3 ), allOf (hasFilter ("emp_no" ), hasSample (1e-10 )));
300+ assertThat (runner .invocations .get (4 ), allOf (hasFilter ("emp_no" ), hasSample (1e-6 )));
301+ assertThat (runner .invocations .get (5 ), allOf (hasFilter ("emp_no" ), hasSample (1e-2 )));
302+ assertThat (runner .invocations .get (6 ), allOf (hasFilter ("emp_no" ), not (hasSample ())));
303+ assertThat (runner .invocations .get (7 ), allOf (hasFilter ("emp_no" ), not (hasSample ())));
288304 }
289305
290306 public void testCountPlan_smallDataBeforeFiltering () throws Exception {
@@ -345,7 +361,7 @@ public void testCountPlan_largeDataBeforeMvExpanding() throws Exception {
345361 assertThat (runner .invocations , hasSize (4 ));
346362 assertThat (runner .invocations .get (0 ), allOf (hasMvExpand ("emp_no" )));
347363 assertThat (runner .invocations .get (1 ), allOf (not (hasMvExpand ("emp_no" )), not (hasSample ())));
348- assertThat (runner .invocations .get (2 ), allOf (hasMvExpand ("emp_no" ), hasSample (1e-4 )));
364+ assertThat (runner .invocations .get (2 ), allOf (hasMvExpand ("emp_no" ), hasSample (1e-5 )));
349365 assertThat (runner .invocations .get (3 ), allOf (hasMvExpand ("emp_no" ), hasSample (1e-7 )));
350366 }
351367
@@ -372,12 +388,13 @@ public void testCountPlan_sampleProbabilityThreshold_withFilter() throws Excepti
372388 // - one pass to get the total number of rows
373389 // - two passes to get the number of filtered rows (which determines the sample probability)
374390 // - one pass to execute the original query (because the sample probability is 50%)
375- assertThat (runner .invocations , hasSize (5 ));
391+ assertThat (runner .invocations , hasSize (6 ));
376392 assertThat (runner .invocations .get (0 ), allOf (not (hasSample ()), hasFilter ("emp_no" )));
377393 assertThat (runner .invocations .get (1 ), allOf (not (hasSample ()), not (hasFilter ("emp_no" ))));
378- assertThat (runner .invocations .get (2 ), allOf (hasSample (1e-7 ), hasFilter ("emp_no" )));
379- assertThat (runner .invocations .get (3 ), allOf (hasSample (1e-2 ), hasFilter ("emp_no" )));
380- assertThat (runner .invocations .get (4 ), allOf (not (hasSample ()), hasFilter ("emp_no" )));
394+ assertThat (runner .invocations .get (2 ), allOf (hasSample (1e-8 ), hasFilter ("emp_no" )));
395+ assertThat (runner .invocations .get (3 ), allOf (hasSample (1e-4 ), hasFilter ("emp_no" )));
396+ assertThat (runner .invocations .get (4 ), allOf (hasSample (0.05 ), hasFilter ("emp_no" )));
397+ assertThat (runner .invocations .get (5 ), allOf (not (hasSample ()), hasFilter ("emp_no" )));
381398 }
382399
383400 public void testApproximatePlan_createsConfidenceInterval_withoutGrouping () throws Exception {
0 commit comments