|
69 | 69 | import static org.elasticsearch.xpack.esql.type.EsqlDataTypeConverter.dateNanosToLong; |
70 | 70 | import static org.elasticsearch.xpack.esql.type.EsqlDataTypeConverter.dateTimeToLong; |
71 | 71 | import static org.hamcrest.Matchers.equalTo; |
72 | | -import static org.hamcrest.Matchers.greaterThan; |
73 | 72 | import static org.hamcrest.Matchers.is; |
74 | 73 |
|
75 | 74 | //@TestLogging(value = "org.elasticsearch.xpack.esql:TRACE", reason = "debug") |
@@ -540,61 +539,71 @@ public void testRoundToTransformToQueryAndTagsWithCustomizedUpperLimit() { |
540 | 539 | } |
541 | 540 | } |
542 | 541 |
|
543 | | - static String points(int numPoints) { |
| 542 | + static String pointArray(int numPoints) { |
544 | 543 | return IntStream.range(0, numPoints).mapToObj(Integer::toString).collect(Collectors.joining(",")); |
545 | 544 | } |
546 | 545 |
|
| 546 | + static int queryAndTags(PhysicalPlan plan) { |
| 547 | + EsQueryExec esQuery = (EsQueryExec) plan.collectFirstChildren(EsQueryExec.class::isInstance).getFirst(); |
| 548 | + return esQuery.queryBuilderAndTags().size(); |
| 549 | + } |
| 550 | + |
547 | 551 | public void testAdjustThresholdForQueries() { |
548 | 552 | { |
| 553 | + int points = between(2, 127); |
549 | 554 | String q = String.format(Locale.ROOT, """ |
550 | 555 | from test |
551 | 556 | | stats count(*) by x = round_to(integer, %s) |
552 | | - """, points(between(1, 128))); |
| 557 | + """, pointArray(points)); |
553 | 558 | PhysicalPlan plan = plannerOptimizer.plan(q, searchStats, makeAnalyzer("mapping-all-types.json")); |
554 | | - EsQueryExec esQuery = (EsQueryExec) plan.collectFirstChildren(EsQueryExec.class::isInstance).getFirst(); |
555 | | - assertThat(esQuery.queryBuilderAndTags().size(), greaterThan(1)); |
| 559 | + int queryAndTags = queryAndTags(plan); |
| 560 | + assertThat(queryAndTags, equalTo(points + 1)); // include null bucket |
556 | 561 | } |
557 | 562 | { |
| 563 | + int points = between(2, 64); |
558 | 564 | String q = String.format(Locale.ROOT, """ |
559 | 565 | from test |
560 | 566 | | where date >= "2023-10-19" |
561 | 567 | | stats count(*) by x = round_to(integer, %s) |
562 | | - """, points(between(1, 63))); |
563 | | - PhysicalPlan plan = plannerOptimizer.plan(q, searchStats, makeAnalyzer("mapping-all-types.json")); |
564 | | - EsQueryExec esQuery = (EsQueryExec) plan.collectFirstChildren(EsQueryExec.class::isInstance).getFirst(); |
565 | | - assertThat(esQuery.queryBuilderAndTags().size(), greaterThan(1)); |
| 568 | + """, pointArray(points)); |
| 569 | + var plan = plannerOptimizer.plan(q, searchStats, makeAnalyzer("mapping-all-types.json")); |
| 570 | + int queryAndTags = queryAndTags(plan); |
| 571 | + assertThat(queryAndTags, equalTo(points + 1)); // include null bucket |
566 | 572 | } |
567 | 573 | { |
| 574 | + int points = between(65, 128); |
568 | 575 | String q = String.format(Locale.ROOT, """ |
569 | 576 | from test |
570 | 577 | | where date >= "2023-10-19" |
571 | 578 | | stats count(*) by x = round_to(integer, %s) |
572 | | - """, points(between(65, 128))); |
573 | | - PhysicalPlan plan = plannerOptimizer.plan(q, searchStats, makeAnalyzer("mapping-all-types.json")); |
574 | | - EsQueryExec esQuery = (EsQueryExec) plan.collectFirstChildren(EsQueryExec.class::isInstance).getFirst(); |
575 | | - assertThat(esQuery.queryBuilderAndTags().size(), equalTo(1)); |
| 579 | + """, pointArray(points)); |
| 580 | + var plan = plannerOptimizer.plan(q, searchStats, makeAnalyzer("mapping-all-types.json")); |
| 581 | + int queryAndTags = queryAndTags(plan); |
| 582 | + assertThat(queryAndTags, equalTo(1)); // no rewrite |
576 | 583 | } |
577 | 584 | { |
| 585 | + int points = between(2, 19); |
578 | 586 | String q = String.format(Locale.ROOT, """ |
579 | 587 | from test |
580 | 588 | | where date >= "2023-10-19" |
581 | 589 | | where keyword LIKE "w*" |
582 | 590 | | stats count(*) by x = round_to(integer, %s) |
583 | | - """, points(between(1, 19))); |
584 | | - PhysicalPlan plan = plannerOptimizer.plan(q, searchStats, makeAnalyzer("mapping-all-types.json")); |
585 | | - EsQueryExec esQuery = (EsQueryExec) plan.collectFirstChildren(EsQueryExec.class::isInstance).getFirst(); |
586 | | - assertThat(esQuery.queryBuilderAndTags().size(), greaterThan(1)); |
| 591 | + """, pointArray(points)); |
| 592 | + var plan = plannerOptimizer.plan(q, searchStats, makeAnalyzer("mapping-all-types.json")); |
| 593 | + int queryAndTags = queryAndTags(plan); |
| 594 | + assertThat("points=" + points, queryAndTags, equalTo(points + 1)); // include null bucket |
587 | 595 | } |
588 | 596 | { |
| 597 | + int points = between(20, 128); |
589 | 598 | String q = String.format(Locale.ROOT, """ |
590 | 599 | from test |
591 | 600 | | where date >= "2023-10-19" |
592 | 601 | | where keyword LIKE "*w*" |
593 | 602 | | stats count(*) by x = round_to(integer, %s) |
594 | | - """, points(between(20, 128))); |
| 603 | + """, pointArray(points)); |
595 | 604 | PhysicalPlan plan = plannerOptimizer.plan(q, searchStats, makeAnalyzer("mapping-all-types.json")); |
596 | | - EsQueryExec esQuery = (EsQueryExec) plan.collectFirstChildren(EsQueryExec.class::isInstance).getFirst(); |
597 | | - assertThat(esQuery.queryBuilderAndTags().size(), equalTo(1)); |
| 605 | + int queryAndTags = queryAndTags(plan); |
| 606 | + assertThat("points=" + points, queryAndTags, equalTo(1)); // no rewrite |
598 | 607 | } |
599 | 608 | } |
600 | 609 |
|
|
0 commit comments