From 83c90c794700fec26de78c2ee8cc4de0713c9a84 Mon Sep 17 00:00:00 2001 From: Marc Handalian Date: Tue, 2 Jun 2026 11:31:27 -0700 Subject: [PATCH 1/2] Add multi shard qa test suite Unmute single shard tests now passing. Signed-off-by: Marc Handalian --- .../analytics/qa/AppendPipeCommandIT.java | 1 - .../analytics/qa/IpFieldMultiShardIT.java | 50 +++ .../analytics/qa/MatchLikeParityIT.java | 2 - .../analytics/qa/ResponseValidator.java | 38 +- .../analytics/qa/StreamstatsCommandIT.java | 16 +- .../analytics/qa/TwoShardAggregationIT.java | 37 ++ .../analytics/qa/TwoShardCommandIT.java | 41 ++ .../analytics/qa/TwoShardJoinIT.java | 41 ++ .../analytics/qa/TwoShardReduceTestCase.java | 387 ++++++++++++++++++ .../analytics/qa/TwoShardScalarIT.java | 24 ++ .../analytics/qa/TwoShardShapeIT.java | 37 ++ .../datasets/ip_multishard/bulk.json | 20 + .../datasets/ip_multishard/mapping.json | 8 + .../datasets/merge_coverage/README.md | 139 +++++++ .../merge_coverage/agg/avg_double.ppl | 1 + .../datasets/merge_coverage/agg/avg_int.ppl | 1 + .../merge_coverage/agg/count_field.ppl | 1 + .../merge_coverage/agg/count_global.ppl | 1 + .../agg/expected/count_field.json | 7 + .../agg/expected/count_global.json | 7 + .../merge_coverage/agg/expected/max_int.json | 7 + .../merge_coverage/agg/expected/min_int.json | 7 + .../merge_coverage/agg/expected/sum_int.json | 7 + .../merge_coverage/agg/list_label.ppl | 1 + .../merge_coverage/agg/max_double.ppl | 1 + .../datasets/merge_coverage/agg/max_int.ppl | 1 + .../merge_coverage/agg/min_double.ppl | 1 + .../datasets/merge_coverage/agg/min_int.ppl | 1 + .../merge_coverage/agg/span_count.ppl | 1 + .../merge_coverage/agg/stddev_pop.ppl | 1 + .../merge_coverage/agg/stddev_samp.ppl | 1 + .../merge_coverage/agg/sum_double.ppl | 1 + .../datasets/merge_coverage/agg/sum_int.ppl | 1 + .../merge_coverage/agg/values_label.ppl | 1 + .../datasets/merge_coverage/agg/var_pop.ppl | 1 + .../datasets/merge_coverage/agg/var_samp.ppl | 1 + .../merge_coverage/approx/dc_label.ppl | 1 + .../approx/distinct_count_amount.ppl | 1 + .../approx/distinct_count_by_cat.ppl | 1 + .../approx/distinct_count_category.ppl | 1 + .../approx/distinct_count_label.ppl | 1 + .../approx/expected/dc_label.json | 7 + .../expected/distinct_count_amount.json | 7 + .../expected/distinct_count_by_cat.json | 16 + .../expected/distinct_count_category.json | 7 + .../approx/expected/distinct_count_label.json | 7 + .../approx/expected/median_amount.json | 7 + .../approx/expected/percentile_50.json | 7 + .../approx/expected/percentile_90.json | 7 + .../expected/percentile_approx_amount.json | 7 + .../merge_coverage/approx/median_amount.ppl | 1 + .../merge_coverage/approx/percentile_50.ppl | 1 + .../merge_coverage/approx/percentile_90.ppl | 1 + .../approx/percentile_approx_amount.ppl | 1 + .../datasets/merge_coverage/bulk.json | 60 +++ .../merge_coverage/cmd/cmd_append.ppl | 1 + .../merge_coverage/cmd/cmd_appendcols.ppl | 1 + .../merge_coverage/cmd/cmd_appendpipe.ppl | 1 + .../datasets/merge_coverage/cmd/cmd_bin.ppl | 1 + .../datasets/merge_coverage/cmd/cmd_chart.ppl | 1 + .../merge_coverage/cmd/cmd_fillnull.ppl | 1 + .../merge_coverage/cmd/cmd_lookup.ppl | 1 + .../merge_coverage/cmd/cmd_multisearch.ppl | 1 + .../datasets/merge_coverage/cmd/cmd_regex.ppl | 1 + .../merge_coverage/cmd/cmd_rename.ppl | 1 + .../datasets/merge_coverage/cmd/cmd_rex.ppl | 1 + .../merge_coverage/cmd/cmd_search.ppl | 1 + .../datasets/merge_coverage/cmd/cmd_spath.ppl | 1 + .../datasets/merge_coverage/cmd/cmd_table.ppl | 1 + .../merge_coverage/cmd/cmd_timechart.ppl | 1 + .../datasets/merge_coverage/cmd/cmd_top.ppl | 1 + .../cmd/expected/cmd_append.json | 7 + .../cmd/expected/cmd_lookup.json | 7 + .../cmd/expected/cmd_multisearch.json | 7 + .../cmd/expected/cmd_regex.json | 7 + .../cmd/expected/cmd_search.json | 7 + .../join/expected/join_anti_count.json | 7 + .../join/expected/join_inner_by_category.json | 16 + .../expected/join_inner_category_count.json | 7 + .../join/expected/join_inner_id_count.json | 7 + .../join/expected/join_left_count.json | 7 + .../join/expected/join_semi_count.json | 7 + .../merge_coverage/join/join_anti_count.ppl | 1 + .../join/join_inner_by_category.ppl | 1 + .../join/join_inner_category_count.ppl | 1 + .../join/join_inner_id_count.ppl | 1 + .../merge_coverage/join/join_left_count.ppl | 1 + .../merge_coverage/join/join_semi_count.ppl | 1 + .../datasets/merge_coverage/mapping.json | 41 ++ .../datasets/merge_coverage/scalar/sc_abs.ppl | 1 + .../merge_coverage/scalar/sc_case.ppl | 1 + .../merge_coverage/scalar/sc_cast_dbl.ppl | 1 + .../merge_coverage/scalar/sc_cast_int.ppl | 1 + .../merge_coverage/scalar/sc_cast_str.ppl | 1 + .../merge_coverage/scalar/sc_coalesce.ppl | 1 + .../merge_coverage/scalar/sc_date_fmt.ppl | 1 + .../datasets/merge_coverage/scalar/sc_if.ppl | 1 + .../merge_coverage/scalar/sc_ifnull.ppl | 1 + .../merge_coverage/scalar/sc_isnotnull.ppl | 1 + .../merge_coverage/scalar/sc_isnull.ppl | 1 + .../merge_coverage/scalar/sc_lower.ppl | 1 + .../merge_coverage/scalar/sc_nullif.ppl | 1 + .../datasets/merge_coverage/scalar/sc_pow.ppl | 1 + .../merge_coverage/scalar/sc_replace.ppl | 1 + .../merge_coverage/scalar/sc_round.ppl | 1 + .../merge_coverage/scalar/sc_round2.ppl | 1 + .../merge_coverage/scalar/sc_substring.ppl | 1 + .../merge_coverage/scalar/sc_upper.ppl | 1 + .../merge_coverage/shape/avg_by_category.ppl | 1 + .../shape/count_by_category.ppl | 1 + .../shape/count_by_category_region.ppl | 1 + .../merge_coverage/shape/dedup_category.ppl | 1 + .../shape/expected/avg_by_category.json | 16 + .../shape/expected/count_by_category.json | 16 + .../expected/count_by_category_region.json | 34 ++ .../shape/expected/dedup_category.json | 13 + .../shape/expected/minmax_by_category.json | 19 + .../shape/expected/sort_limit.json | 24 ++ .../shape/expected/sum_by_category.json | 16 + .../merge_coverage/shape/filtered_group.ppl | 1 + .../shape/minmax_by_category.ppl | 1 + .../shape/multiagg_by_category.ppl | 1 + .../merge_coverage/shape/sort_desc_limit.ppl | 1 + .../merge_coverage/shape/sort_limit.ppl | 1 + .../shape/sort_string_limit.ppl | 1 + .../merge_coverage/shape/sum_by_category.ppl | 1 + .../window/eventstats_by_category.ppl | 1 + .../merge_coverage/window/streamstats_sum.ppl | 1 + .../datasets/merge_coverage_lookup/bulk.json | 6 + .../merge_coverage_lookup/mapping.json | 16 + 130 files changed, 1348 insertions(+), 27 deletions(-) create mode 100644 sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/IpFieldMultiShardIT.java create mode 100644 sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardAggregationIT.java create mode 100644 sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardCommandIT.java create mode 100644 sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardJoinIT.java create mode 100644 sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardReduceTestCase.java create mode 100644 sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardScalarIT.java create mode 100644 sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardShapeIT.java create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/ip_multishard/bulk.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/ip_multishard/mapping.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/README.md create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/avg_double.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/avg_int.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/count_field.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/count_global.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/expected/count_field.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/expected/count_global.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/expected/max_int.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/expected/min_int.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/expected/sum_int.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/list_label.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/max_double.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/max_int.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/min_double.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/min_int.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/span_count.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/stddev_pop.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/stddev_samp.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/sum_double.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/sum_int.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/values_label.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/var_pop.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/var_samp.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/dc_label.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/distinct_count_amount.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/distinct_count_by_cat.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/distinct_count_category.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/distinct_count_label.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/dc_label.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/distinct_count_amount.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/distinct_count_by_cat.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/distinct_count_category.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/distinct_count_label.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/median_amount.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/percentile_50.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/percentile_90.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/percentile_approx_amount.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/median_amount.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/percentile_50.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/percentile_90.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/percentile_approx_amount.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/bulk.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_append.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_appendcols.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_appendpipe.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_bin.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_chart.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_fillnull.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_lookup.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_multisearch.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_regex.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_rename.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_rex.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_search.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_spath.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_table.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_timechart.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_top.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/expected/cmd_append.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/expected/cmd_lookup.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/expected/cmd_multisearch.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/expected/cmd_regex.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/expected/cmd_search.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_anti_count.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_inner_by_category.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_inner_category_count.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_inner_id_count.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_left_count.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_semi_count.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_anti_count.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_inner_by_category.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_inner_category_count.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_inner_id_count.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_left_count.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_semi_count.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/mapping.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_abs.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_case.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_cast_dbl.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_cast_int.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_cast_str.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_coalesce.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_date_fmt.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_if.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_ifnull.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_isnotnull.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_isnull.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_lower.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_nullif.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_pow.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_replace.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_round.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_round2.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_substring.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_upper.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/avg_by_category.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/count_by_category.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/count_by_category_region.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/dedup_category.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/avg_by_category.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/count_by_category.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/count_by_category_region.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/dedup_category.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/minmax_by_category.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/sort_limit.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/sum_by_category.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/filtered_group.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/minmax_by_category.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/multiagg_by_category.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/sort_desc_limit.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/sort_limit.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/sort_string_limit.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/sum_by_category.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/window/eventstats_by_category.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/window/streamstats_sum.ppl create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage_lookup/bulk.json create mode 100644 sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage_lookup/mapping.json diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/AppendPipeCommandIT.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/AppendPipeCommandIT.java index 948f151a67ab9..e475799f799b9 100644 --- a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/AppendPipeCommandIT.java +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/AppendPipeCommandIT.java @@ -56,7 +56,6 @@ protected void onBeforeQuery() throws IOException { // ── duplicate + inline sort, then head ────────────────────────────────────── - @org.apache.lucene.tests.util.LuceneTestCase.AwaitsFix(bugUrl = "https://github.com/opensearch-project/OpenSearch/pull/21626") public void testAppendPipeSort() throws IOException { // Branch: stats sum(int0) by str0 → 3 rows (FURNITURE=1, OFFICE SUPPLIES=18, TECHNOLOGY=49). // `appendpipe [sort -sum_int0_by_str0]` duplicates them desc-sorted and appends. `head 5` diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/IpFieldMultiShardIT.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/IpFieldMultiShardIT.java new file mode 100644 index 0000000000000..109db177906f1 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/IpFieldMultiShardIT.java @@ -0,0 +1,50 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + +package org.opensearch.analytics.qa; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Multi-shard {@code ip}-field coverage (Mustang bug tracker Bug 3): a query over an index with an + * {@code ip}-type field can fail with a Substrait {@code Binary} vs {@code BinaryView} schema mismatch. + * {@link FieldTypeCoverageIT#testIp()} covers {@code ip} at 1 shard; this exercises the 2-shard reduce + * path. Run unmuted — if the defect is present it fails here, otherwise it passes. + */ +public class IpFieldMultiShardIT extends AnalyticsRestTestCase { + + private static final Dataset DATASET = new Dataset("ip_multishard", "ip_multishard"); + + private static boolean provisioned = false; + + @Override + protected void onBeforeQuery() throws IOException { + if (provisioned == false) { + DatasetProvisioner.provision(client(), DATASET, 2); + provisioned = true; + } + } + + /** count() by status_code over the 10 docs (status_code = 200 + id%3): 200->4, 201->3, 202->3. */ + @SuppressWarnings("unchecked") + public void testAggregationOnIndexWithIpFieldAtTwoShards() throws IOException { + Map resp = executePpl("source=" + DATASET.indexName + " | stats count() by status_code"); + List> rows = (List>) resp.get("datarows"); + assertNotNull("expected datarows for count-by-status over an ip-bearing index", rows); + + Map counts = new HashMap<>(); + for (List row : rows) { + counts.put(((Number) row.get(1)).intValue(), ((Number) row.get(0)).intValue()); + } + Map expected = Map.of(200, 4, 201, 3, 202, 3); + assertEquals("count() by status_code", expected, counts); + } +} diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/MatchLikeParityIT.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/MatchLikeParityIT.java index fcf5a831b2a2a..7bff10eb3ba41 100644 --- a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/MatchLikeParityIT.java +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/MatchLikeParityIT.java @@ -8,7 +8,6 @@ package org.opensearch.analytics.qa; -import org.apache.lucene.tests.util.LuceneTestCase; import org.opensearch.client.Request; import org.opensearch.client.Response; @@ -58,7 +57,6 @@ * {@code OpenSearchTestCase}, so the seed is printed on failure. Re-run with * {@code ./gradlew :...:integTest -Dtests.seed=HEX} to reproduce. */ -@LuceneTestCase.AwaitsFix(bugUrl = "") public class MatchLikeParityIT extends AnalyticsRestTestCase { private static final String INDEX_NAME = "match_like_parity"; diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/ResponseValidator.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/ResponseValidator.java index 39335dfd3a21b..6600ef5b04868 100644 --- a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/ResponseValidator.java +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/ResponseValidator.java @@ -93,8 +93,22 @@ private static Map parseSimpleJson(String json) throws IOExcepti * Compare expected and actual responses, focusing on data rows. * Rows are compared in an unordered fashion - both sets are sorted before comparison. */ - @SuppressWarnings("unchecked") private static String compareResponses(Map expected, Map actual, String language, int queryNumber) { + String label = language.toUpperCase(java.util.Locale.ROOT) + " Q" + queryNumber; + return compareData(expected, actual, label); + } + + /** + * Compare two response maps by their data rows, unordered and numeric-tolerant. + * Returns {@code null} when equal, otherwise a human-readable diff prefixed with + * {@code label}. + * + *

Exposed for name-keyed suites (e.g. the 2-shard reduce suite) that don't use the + * numeric {@code q{N}} scheme and for differential checks (comparing a 1-shard result + * against a 2-shard result rather than against a golden file). + */ + @SuppressWarnings("unchecked") + public static String compareData(Map expected, Map actual, String label) { // Extract datarows from both responses List> expectedRows = extractDataRows(expected); List> actualRows = extractDataRows(actual); @@ -104,21 +118,21 @@ private static String compareResponses(Map expected, Map(expectedRows); + actualRows = new java.util.ArrayList<>(actualRows); expectedRows.sort(new RowComparator()); actualRows.sort(new RowComparator()); @@ -128,14 +142,14 @@ private static String compareResponses(Map expected, Map actualRow = actualRows.get(i); if (expectedRow.size() != actualRow.size()) { - return String.format(java.util.Locale.ROOT, "%s Q%d row %d: Column count mismatch - expected %d, got %d", - language.toUpperCase(java.util.Locale.ROOT), queryNumber, i, expectedRow.size(), actualRow.size()); + return String.format(java.util.Locale.ROOT, "%s row %d: Column count mismatch - expected %d, got %d", + label, i, expectedRow.size(), actualRow.size()); } for (int j = 0; j < expectedRow.size(); j++) { if (!valuesEqual(expectedRow.get(j), actualRow.get(j))) { - return String.format(java.util.Locale.ROOT, "%s Q%d row %d col %d: Value mismatch - expected %s, got %s", - language.toUpperCase(java.util.Locale.ROOT), queryNumber, i, j, expectedRow.get(j), actualRow.get(j)); + return String.format(java.util.Locale.ROOT, "%s row %d col %d: Value mismatch - expected %s, got %s", + label, i, j, expectedRow.get(j), actualRow.get(j)); } } } diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/StreamstatsCommandIT.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/StreamstatsCommandIT.java index abc07b58b5461..5226ed780789b 100644 --- a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/StreamstatsCommandIT.java +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/StreamstatsCommandIT.java @@ -8,7 +8,6 @@ package org.opensearch.analytics.qa; -import org.apache.lucene.tests.util.LuceneTestCase.AwaitsFix; import org.opensearch.client.Request; import org.opensearch.client.Response; import org.opensearch.client.ResponseException; @@ -925,17 +924,10 @@ public void testLeftJoinWithStreamstats() throws IOException { /** sql IT: testWhereInWithStreamstatsSubquery. WHERE-IN with streamstats subquery — uses * semi-join lowering inside the subquery. After PlannerImpl's subquery-remove phase the - * RexSubQuery becomes a decorrelated correlate, but the streamstats-inside-correlate - * shape is nondeterministic on multi-node execution: sometimes errors with - * {@code Stage 0 sink feed failed: partition stream receiver dropped before send}, - * sometimes returns one row successfully. Neither a positive nor a broad-failure - * assertion is stable across runs. Skipped until the downstream multi-node race is - * fixed — re-enable by removing {@code @AwaitsFix}. */ - @AwaitsFix( - bugUrl = "streamstats-inside-decorrelated-correlate has a nondeterministic multi-node" - + " execution race; needs a downstream analytics-engine fix before this test can" - + " assert a deterministic outcome" - ) + * RexSubQuery becomes a decorrelated correlate. This historically had a nondeterministic + * multi-node race ({@code Stage 0 sink feed failed: partition stream receiver dropped before + * send}); the assertion is now the tolerant {@link #assertErrorAny} (any error is accepted), + * which is stable, so the test runs unmuted. */ public void testWhereInWithStreamstatsSubquery() throws IOException { assertErrorAny( "source=" + DATASET.indexName + " | where key in" diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardAggregationIT.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardAggregationIT.java new file mode 100644 index 0000000000000..cf50905584d07 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardAggregationIT.java @@ -0,0 +1,37 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + +package org.opensearch.analytics.qa; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 2-shard reduce correctness for aggregations: exact tier {@code agg/} (count/sum/avg/min/max, + * stddev/var, span, values/list) and approximate tier {@code approx/} (distinct_count/dc/percentile/ + * median). + * + *

xfail: {@code distinct_count}/{@code dc} HLL cross-shard merge over-counts for repeated keyword + * sets ({@code distinct_count(label)} = 5 at 1 shard, 9 at 2); correct for all-unique/low-card columns. + */ +public class TwoShardAggregationIT extends TwoShardReduceTestCase { + + @Override + protected Map tiers() { + Map t = new LinkedHashMap<>(); + t.put("agg", false); // exact + t.put("approx", true); // golden + tolerance + return t; + } + + @Override + protected Map knownIssues() { + String hll = "HLL cross-shard merge over-counts repeated keyword sets (label 5->9 at 2 shards)"; + return Map.of("distinct_count_label", hll, "distinct_count_by_cat", hll, "dc_label", hll); + } +} diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardCommandIT.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardCommandIT.java new file mode 100644 index 0000000000000..1e59cae59f495 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardCommandIT.java @@ -0,0 +1,41 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + +package org.opensearch.analytics.qa; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 2-shard correctness for the PPL command surface ({@code cmd/}). Verified at 2 shards: rex, table, + * spath, rename, fillnull, bin, top, chart, lookup. The rest are muted (see {@link #knownIssues()}). + */ +public class TwoShardCommandIT extends TwoShardReduceTestCase { + + @Override + protected Map tiers() { + return Map.of("cmd", false); + } + + @Override + protected Map knownIssues() { + // The search/append/regex/multisearch commands carry a residual filter that routes through the + // DataFusion indexed executor, which at 2 shards SIGSEGVs the data node on the Arrow view C-data + // export (upcallLinker.cpp:137) — so they MUST be skipped, not run (a crash breaks other tests). + String crash = "residual filter -> indexed-executor SIGSEGV at 2 shards (crashes the data node)"; + Map m = new LinkedHashMap<>(); + m.put("cmd_search", crash); + m.put("cmd_append", crash); + m.put("cmd_regex", crash); + m.put("cmd_multisearch", crash); + m.put("cmd_appendcols", "not in the PPL grammar (SyntaxCheckException)"); + m.put("cmd_timechart", "requires an @timestamp field"); + m.put("cmd_appendpipe", "lowers to OpenSearchUnion with a lucene branch vs datafusion main (#21867)"); + return m; + } +} diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardJoinIT.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardJoinIT.java new file mode 100644 index 0000000000000..c7a7828cff7d4 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardJoinIT.java @@ -0,0 +1,41 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + +package org.opensearch.analytics.qa; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 2-shard correctness for joins ({@code join/} — inner/left/semi/anti + join-then-group, self-joined + * on {@code %INDEX%}, asserting cardinality 30/300/30/10/20 and by-group 100/cat). + * + *

All currently muted: since #21867 the bare {@code [ source ]} inner arm is driven by lucene while + * the outer arm stays datafusion, and {@code OpenSearchJoin} rejects the mixed backends. Reduce-sound + * before #21867. Unmute (drop from {@link #knownIssues()}) once the planner reconciles per-arm backends. + */ +public class TwoShardJoinIT extends TwoShardReduceTestCase { + + @Override + protected Map tiers() { + return Map.of("join", false); + } + + @Override + protected Map knownIssues() { + String reason = "OpenSearchJoin rejects mixed per-arm backends ([lucene] inner vs [datafusion]) at 2 shards (#21867)"; + Map m = new LinkedHashMap<>(); + for (String q : new String[] { + "join_inner_id_count", "join_inner_category_count", "join_left_count", + "join_semi_count", "join_anti_count", "join_inner_by_category" + }) { + m.put(q, reason); + } + return m; + } +} diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardReduceTestCase.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardReduceTestCase.java new file mode 100644 index 0000000000000..3513405412f74 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardReduceTestCase.java @@ -0,0 +1,387 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + +package org.opensearch.analytics.qa; + +import org.opensearch.client.Request; +import org.opensearch.client.Response; +import org.opensearch.common.io.PathUtils; +import org.opensearch.common.xcontent.XContentHelper; +import org.opensearch.common.xcontent.XContentType; + +import java.io.IOException; +import java.net.URI; +import java.net.URL; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.TreeSet; +import java.util.stream.Stream; + +/** + * Shared machinery for the 2-shard reduce-correctness suite — provisioning, query discovery, the + * differential / approximate runners, and reporting. Subclasses declare only their dataset tiers + * ({@link #tiers()}) and known-broken queries ({@link #knownIssues()}). + * + *

Each {@code .ppl} (source = {@code %INDEX%}) runs against {@code merge_coverage} at 1 shard + * (oracle) and 2 shards. Exact tier: the two results must be equal (unordered, numeric-tolerant, + * multi-value cells as multisets); a {@code

/expected/.json} golden additionally pins the + * 2-shard result. Approximate tier: sketches drift across a merge, so the 2-shard result is asserted + * within tolerance of a required golden instead. See {@code datasets/merge_coverage/README.md}. + */ +public abstract class TwoShardReduceTestCase extends AnalyticsRestTestCase { + + protected static final String DATASET_NAME = "merge_coverage"; + protected static final String INDEX_1SHARD = "merge_coverage_1shard"; + protected static final String INDEX_2SHARD = "merge_coverage_2shard"; + protected static final String INDEX_TOKEN = "%INDEX%"; + + /** Relative tolerance for the approximate (HLL / t-digest) tier. */ + private static final double APPROX_REL_TOL = 0.15; + private static final double APPROX_ABS_TOL = 1.0; + + private static final Dataset BASELINE = new Dataset(DATASET_NAME, INDEX_1SHARD); + private static final Dataset SHARDED = new Dataset(DATASET_NAME, INDEX_2SHARD); + + private static boolean provisioned = false; + + // ── subclass contract ───────────────────────────────────────────────────────── + + /** Dataset subdirectories this suite covers, mapped to {@code true} when the tier is approximate + * (golden-with-tolerance) rather than exact (differential). Use an ordered map for stable logs. */ + protected abstract Map tiers(); + + /** + * The single registry of muted queries: {@code .ppl} base-name → reason. Listed queries are + * skipped entirely (never executed) and logged as {@code MUTED: }; everything else + * runs and must pass. This is the one place to look for "what's currently broken at 2 shards" — + * there is no separate annotation or directory. Skipping (rather than running-and-tolerating) is + * required because some entries crash the data node, which would break unrelated tests. + */ + protected Map knownIssues() { + return Collections.emptyMap(); + } + + // ── provisioning ──────────────────────────────────────────────────────────── + + @Override + protected void onBeforeQuery() throws IOException { + if (provisioned == false) { + DatasetProvisioner.provision(client(), BASELINE, 1); + DatasetProvisioner.provision(client(), SHARDED, 2); + // Dimension index for the `lookup` command (shard count irrelevant — it's broadcast). + DatasetProvisioner.provision(client(), new Dataset("merge_coverage_lookup", "merge_coverage_lookup"), 1); + assertShardsPopulated(INDEX_2SHARD, 2); + provisioned = true; + } + } + + // ── the test ────────────────────────────────────────────────────────────────── + + /** + * Runs every {@code .ppl} in this subclass's {@link #tiers()} against both the 1-shard and + * 2-shard index and asserts the reduce did not change the answer. Collects all failures and + * reports them together so one broken query doesn't hide the rest. + */ + public void testReduceCorrectnessAcrossTwoShards() throws IOException { + Map muted = knownIssues(); + List failures = new ArrayList<>(); + int passed = 0; + int skipped = 0; + int total = 0; + + for (Map.Entry tier : tiers().entrySet()) { + String dir = tier.getKey(); + boolean approx = tier.getValue(); + for (String name : discoverQueryNames("datasets/" + DATASET_NAME + "/" + dir)) { + total++; + if (muted.containsKey(name)) { + skipped++; + logger.warn("[2-shard reduce] MUTED {}/{} — {}", dir, name, muted.get(name)); + continue; + } + String err = approx ? runApprox(dir, name) : runDifferential(dir, name); + if (err == null) { + passed++; + } else { + failures.add(dir + "/" + err); + } + } + } + assertTrue("No queries discovered for tiers " + tiers().keySet() + " — dataset resources missing?", total > 0); + + logger.info("[2-shard reduce] {} passed, {} failed, {} muted (of {} across tiers {})", + passed, failures.size(), skipped, total, tiers().keySet()); + if (failures.isEmpty() == false) { + StringBuilder sb = new StringBuilder(); + sb.append(failures.size()).append(" of ").append(total).append(" 2-shard reduce checks failed:\n"); + for (String f : failures) { + sb.append(" - ").append(f).append('\n'); + } + fail(sb.toString()); + } + } + + // ── per-query runners ──────────────────────────────────────────────────────── + + /** Exact tier: 1-shard result must equal 2-shard result; if a golden exists, pin the 2-shard + * result to it too. Returns null on pass, else a one-line failure. */ + private String runDifferential(String dir, String name) { + String queryDir = "datasets/" + DATASET_NAME + "/" + dir; + try { + String template = DatasetProvisioner.loadResource(queryDir + "/" + name + ".ppl").trim(); + Map r1 = executePpl(template.replace(INDEX_TOKEN, INDEX_1SHARD)); + Map r2 = executePpl(template.replace(INDEX_TOKEN, INDEX_2SHARD)); + logValues(dir, name, r1, r2); + + // Collection aggregations (values/list) return a multi-value cell whose element order + // depends on the gather; sort those array cells so the differential tests the merged + // multiset, not the gather order. + normalizeArrayCells(r1); + normalizeArrayCells(r2); + + String diff = ResponseValidator.compareData(r1, r2, name + " [1-shard vs 2-shard]"); + if (diff != null) { + return diff; + } + Map golden = loadGolden(queryDir + "/expected/" + name + ".json"); + if (golden != null) { + normalizeArrayCells(golden); + String pin = ResponseValidator.compareData(golden, r2, name + " [2-shard vs golden]"); + if (pin != null) { + return pin; + } + } + return null; + } catch (Exception e) { + logger.info("[2shard-val] {}/{} | THREW {}", dir, name, rootMessage(e)); + return name + " [" + dir + "] threw: " + rootMessage(e); + } + } + + /** Approx tier: differential equality is not used (sketches drift across a merge) — the 2-shard + * result is asserted within tolerance of a REQUIRED golden truth. Returns null on pass. */ + private String runApprox(String dir, String name) { + String queryDir = "datasets/" + DATASET_NAME + "/" + dir; + try { + Map golden = loadGolden(queryDir + "/expected/" + name + ".json"); + if (golden == null) { + return name + " [" + dir + "] has no golden truth file — approximate queries must ship one"; + } + String template = DatasetProvisioner.loadResource(queryDir + "/" + name + ".ppl").trim(); + Map r2 = executePpl(template.replace(INDEX_TOKEN, INDEX_2SHARD)); + logger.info("[2shard-val] {}/{} | 2s={} | golden={}", dir, name, + compact(extractRows(r2)), compact(extractRows(golden))); + return compareWithinTolerance(extractRows(golden), extractRows(r2), name + " [2-shard vs truth ~]"); + } catch (Exception e) { + return name + " [" + dir + "] threw: " + rootMessage(e); + } + } + + // ── tolerance comparison (approximate tier) ────────────────────────────────── + + /** + * Unordered compare where numeric cells need only match within a relative tolerance and + * non-numeric cells (group keys) must match exactly. Rows are aligned by their non-numeric cells. + */ + private static String compareWithinTolerance(List> expected, List> actual, String label) { + if (expected == null || actual == null) { + return expected == actual ? null : label + ": one side empty"; + } + if (expected.size() != actual.size()) { + return String.format(Locale.ROOT, "%s: row count mismatch - expected %d, got %d", label, expected.size(), actual.size()); + } + List> e = new ArrayList<>(expected); + List> a = new ArrayList<>(actual); + e.sort(TwoShardReduceTestCase::byGroupKeys); + a.sort(TwoShardReduceTestCase::byGroupKeys); + for (int i = 0; i < e.size(); i++) { + List er = e.get(i); + List ar = a.get(i); + if (er.size() != ar.size()) { + return String.format(Locale.ROOT, "%s row %d: column count mismatch", label, i); + } + for (int j = 0; j < er.size(); j++) { + Object ev = er.get(j); + Object av = ar.get(j); + if (ev instanceof Number && av instanceof Number) { + double ed = ((Number) ev).doubleValue(); + double ad = ((Number) av).doubleValue(); + double tol = Math.max(APPROX_ABS_TOL, APPROX_REL_TOL * Math.abs(ed)); + if (Math.abs(ed - ad) > tol) { + return String.format(Locale.ROOT, "%s row %d col %d: %s vs %s exceeds tolerance %.3f", + label, i, j, ev, av, tol); + } + } else if (java.util.Objects.equals(ev, av) == false) { + return String.format(Locale.ROOT, "%s row %d col %d: %s vs %s", label, i, j, ev, av); + } + } + } + return null; + } + + /** Order rows by their non-numeric cells (the group keys) so tolerant compare can align them. */ + private static int byGroupKeys(List r1, List r2) { + StringBuilder k1 = new StringBuilder(); + StringBuilder k2 = new StringBuilder(); + for (Object o : r1) { + if ((o instanceof Number) == false) { + k1.append(o).append(' '); + } + } + for (Object o : r2) { + if ((o instanceof Number) == false) { + k2.append(o).append(' '); + } + } + return k1.toString().compareTo(k2.toString()); + } + + // ── helpers ────────────────────────────────────────────────────────────────── + + @SuppressWarnings("unchecked") + private static List> extractRows(Map response) { + if (response == null) { + return null; + } + if (response.containsKey("datarows")) { + return (List>) response.get("datarows"); + } + if (response.containsKey("rows")) { + return (List>) response.get("rows"); + } + return null; + } + + /** Load a golden {@code {"rows": [...]}} file as a Map, or null if it doesn't exist. */ + private static Map loadGolden(String resourcePath) throws IOException { + if (TwoShardReduceTestCase.class.getClassLoader().getResource(resourcePath) == null) { + return null; + } + String json = DatasetProvisioner.loadResource(resourcePath); + return XContentHelper.convertToMap(XContentType.JSON.xContent(), json, false); + } + + /** Log compact 1-shard and 2-shard result rows for the report (parsed out of the log). */ + private void logValues(String tier, String name, Map r1, Map r2) { + logger.info("[2shard-val] {}/{} | 1s={} | 2s={}", tier, name, compact(extractRows(r1)), compact(extractRows(r2))); + } + + /** Sort any list-valued (multi-value / collection-aggregation) cell in place, so a differential + * compare treats {@code values(...)} / {@code list(...)} output as an unordered multiset. */ + @SuppressWarnings("unchecked") + private static void normalizeArrayCells(Map response) { + List> rows = extractRows(response); + if (rows == null) { + return; + } + for (List row : rows) { + for (int i = 0; i < row.size(); i++) { + if (row.get(i) instanceof List) { + List cell = new ArrayList<>((List) row.get(i)); + cell.sort(java.util.Comparator.comparing(o -> o == null ? "" : o.toString())); + row.set(i, cell); + } + } + } + } + + /** Render up to the first 8 rows compactly so the log line stays readable. */ + private static String compact(List> rows) { + if (rows == null) { + return ""; + } + int show = Math.min(8, rows.size()); + StringBuilder sb = new StringBuilder(); + sb.append('(').append(rows.size()).append(" rows) "); + for (int i = 0; i < show; i++) { + sb.append(rows.get(i)); + if (i < show - 1) { + sb.append(','); + } + } + if (rows.size() > show) { + sb.append(",…"); + } + return sb.toString(); + } + + private static String rootMessage(Throwable t) { + Throwable r = t; + while (r.getCause() != null && r.getCause() != r) { + r = r.getCause(); + } + return r.getClass().getSimpleName() + ": " + r.getMessage(); + } + + /** Assert the index spreads its docs across at least {@code minPopulated} primary shards. */ + private void assertShardsPopulated(String index, int minPopulated) throws IOException { + Request req = new Request("GET", "/_cat/shards/" + index); + req.addParameter("format", "json"); + req.addParameter("h", "prirep,docs,state"); + Response resp = client().performRequest(req); + List shards = entityAsList(resp); + int populated = 0; + for (Object o : shards) { + @SuppressWarnings("unchecked") + Map shard = (Map) o; + if ("p".equals(shard.get("prirep"))) { + Object docs = shard.get("docs"); + if (docs != null && Integer.parseInt(docs.toString()) > 0) { + populated++; + } + } + } + assertTrue( + "Index [" + index + "] must spread docs across >= " + minPopulated + " primary shards " + + "(else the 2-shard reduce is never exercised); populated primaries=" + populated, + populated >= minPopulated + ); + } + + /** Discover {@code .ppl} base names under a classpath resource directory (sorted). */ + private static List discoverQueryNames(String resourceDir) throws IOException { + URL url = TwoShardReduceTestCase.class.getClassLoader().getResource(resourceDir); + if (url == null) { + return Collections.emptyList(); + } + TreeSet names = new TreeSet<>(); + FileSystem fs = null; + try { + URI uri = url.toURI(); + Path dir; + if ("jar".equals(uri.getScheme())) { + fs = FileSystems.newFileSystem(uri, Collections.emptyMap()); + dir = fs.getPath(resourceDir); + } else { + dir = PathUtils.get(uri); + } + try (Stream stream = Files.list(dir)) { + stream.forEach(p -> { + String fileName = p.getFileName().toString(); + if (fileName.endsWith(".ppl")) { + names.add(fileName.substring(0, fileName.length() - ".ppl".length())); + } + }); + } + } catch (Exception e) { + throw new IOException("Failed to discover queries in [" + resourceDir + "]", e); + } finally { + if (fs != null) { + fs.close(); + } + } + return new ArrayList<>(names); + } +} diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardScalarIT.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardScalarIT.java new file mode 100644 index 0000000000000..09aa2b10201ad --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardScalarIT.java @@ -0,0 +1,24 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + +package org.opensearch.analytics.qa; + +import java.util.Map; + +/** + * 2-shard correctness for per-row scalar functions ({@code scalar/} — round, pow, abs, upper, lower, + * substring, replace, cast, coalesce, ifnull, isnull, isnotnull, nullif, case, if, date_format + type + * variations). Scalars are per-row, so this checks the cross-shard gather doesn't corrupt the values. + */ +public class TwoShardScalarIT extends TwoShardReduceTestCase { + + @Override + protected Map tiers() { + return Map.of("scalar", false); + } +} diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardShapeIT.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardShapeIT.java new file mode 100644 index 0000000000000..56faa9168d933 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/TwoShardShapeIT.java @@ -0,0 +1,37 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + +package org.opensearch.analytics.qa; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 2-shard correctness for query shapes ({@code shape/} — group-by, filtered group-by, sort/limit + * top-N, dedup) and windows ({@code window/} — eventstats, streamstats). + * + *

xfail: {@code streamstats} (cumulative window) is order-sensitive on input, but the cross-shard + * gather is arrival-ordered, so the running aggregate is computed over the wrong order — 1-shard + * {@code 1,3,6,10,…} vs 2-shard {@code 216,2,5,9,…}. + */ +public class TwoShardShapeIT extends TwoShardReduceTestCase { + + @Override + protected Map tiers() { + Map t = new LinkedHashMap<>(); + t.put("shape", false); + t.put("window", false); + return t; + } + + @Override + protected Map knownIssues() { + return Map.of("streamstats_sum", + "cumulative window over arrival-ordered gather: 1-shard 1,3,6,10,... vs 2-shard 216,2,5,9,..."); + } +} diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/ip_multishard/bulk.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/ip_multishard/bulk.json new file mode 100644 index 0000000000000..5abc1a5eb4cfb --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/ip_multishard/bulk.json @@ -0,0 +1,20 @@ +{"index": {"_id": "0"}} +{"id": 0, "client_ip": "10.0.0.0", "status_code": 200} +{"index": {"_id": "1"}} +{"id": 1, "client_ip": "10.0.0.1", "status_code": 201} +{"index": {"_id": "2"}} +{"id": 2, "client_ip": "10.0.0.2", "status_code": 202} +{"index": {"_id": "3"}} +{"id": 3, "client_ip": "10.0.0.3", "status_code": 200} +{"index": {"_id": "4"}} +{"id": 4, "client_ip": "10.0.0.4", "status_code": 201} +{"index": {"_id": "5"}} +{"id": 5, "client_ip": "10.0.0.5", "status_code": 202} +{"index": {"_id": "6"}} +{"id": 6, "client_ip": "10.0.0.6", "status_code": 200} +{"index": {"_id": "7"}} +{"id": 7, "client_ip": "10.0.0.7", "status_code": 201} +{"index": {"_id": "8"}} +{"id": 8, "client_ip": "10.0.0.8", "status_code": 202} +{"index": {"_id": "9"}} +{"id": 9, "client_ip": "10.0.0.9", "status_code": 200} diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/ip_multishard/mapping.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/ip_multishard/mapping.json new file mode 100644 index 0000000000000..8e04b26287970 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/ip_multishard/mapping.json @@ -0,0 +1,8 @@ +{ + "settings": { "number_of_shards": 2, "number_of_replicas": 0 }, + "mappings": { "properties": { + "id": { "type": "integer" }, + "client_ip": { "type": "ip" }, + "status_code": { "type": "integer" } + }} +} diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/README.md b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/README.md new file mode 100644 index 0000000000000..adeeed5f64a52 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/README.md @@ -0,0 +1,139 @@ +# merge_coverage — 2-shard reduce-correctness suite + +Purpose: prove that **sharding the data across two shards does not change the answer** for the +analytics-engine route — i.e. that partial→final aggregation, sort-merge, top-N gather, window +combine, and join shuffle are correct. The on-main `*PplIT` / `*CommandIT` suites stay at 1 shard +(function isolation); this suite is the distributed-stress companion and is purely additive. + +## Structure + +A single abstract base `TwoShardReduceTestCase` holds all the cross-shard machinery; thin per-category +IT classes only declare which dataset subdirs they cover and which queries are known-broken: + +| IT class | dataset subdir(s) | tier | +|---|---|---| +| `TwoShardAggregationIT` | `agg/`, `approx/` | exact differential + approximate-golden | +| `TwoShardScalarIT` | `scalar/` | exact differential | +| `TwoShardShapeIT` | `shape/`, `window/` | exact differential | +| `TwoShardJoinIT` | `join/` | exact differential (all queries muted, see below) | +| `TwoShardCommandIT` | `cmd/` | exact differential | + +(`IpFieldMultiShardIT` is a sibling — see the separate `ip_multishard` dataset.) + +## How it works + +The dataset is provisioned twice from this directory's `mapping.json` + `bulk.json`: + +| index | shards | role | +|---|---|---| +| `merge_coverage_1shard` | 1 | baseline / oracle | +| `merge_coverage_2shard` | 2 | system under test (suite asserts both primaries are populated) | + +Each query file uses the literal token `%INDEX%` for its source; the harness substitutes the two +index names and runs the query against both. A `merge_coverage_lookup` dimension index backs the +`lookup` command. + +### Tiers + +- **exact (differential):** the 1-shard result is the oracle — 1-shard must **equal** 2-shard + (unordered, numeric-tolerant; multi-value `values`/`list` cells compared as multisets). No + hand-computed expected needed. If `

/expected/.json` exists, the 2-shard result is + *additionally* pinned to that absolute golden (catches a bug wrong identically at both shard counts). + +- **approximate (golden + tolerance):** sketch aggregations (`distinct_count`=HLL, `percentile`=t-digest) + drift across a partition merge, so differential equality is *not* used. Each ships a **required** + golden truth in `approx/expected/.json`; the 2-shard result is asserted within tolerance + (rel 15% / abs 1.0) of it. + +## Determinism rule (important) + +Any `head N` / `sort … | head` test **must** carry a total ordering with a unique tie-breaker (`id`), +or the 2-shard gather returns a nondeterministic subset and the comparison is meaningless. + +## Adding coverage + +Drop a `.ppl` in the appropriate subdir using `%INDEX%` as the source — that's the whole test. +Add `/expected/.json` to also pin the absolute value. Approximate functions go under +`approx/` **with** a golden. + +## Dataset shape + +30 docs, 3 categories (`A`/`B`/`C`) × 10. Designed so every group spans both shards. + +| field | type | notes | +|---|---|---| +| `id` | integer | 0–29, unique — sort tie-breaker | +| `category` | keyword | group key (A/B/C) | +| `region` | keyword | 2nd group key (east/west) | +| `amount` | integer | A:1–10 B:11–20 C:21–30 — int agg target | +| `price` | double | `amount × 1.5` — double agg target | +| `label` | keyword | `lbl(amount%5)` — string fns / dedup / distinct | +| `flag` | boolean | `amount` even | +| `ts` | date | `2024-01-(id+1)` — date fns | +| `opt` | integer | present on even `id` only (15 docs) — null-handling fns | +| `payload` | keyword | JSON string `{"v":amount}` — for `spath` | + +## Coverage + +- **`agg/` aggregations:** count, count(field), sum, avg, min, max (int + double), stddev_pop, + stddev_samp, var_pop, var_samp, span; collection aggs `values`/`list` (multiset-normalized). +- **`approx/`:** distinct_count (global, by-group, several columns), `dc`, percentile (50/90), + percentile_approx, median. +- **`scalar/`:** round, round/2, pow, abs, upper, lower, substring, replace, cast (→double/int/string), + coalesce, ifnull, isnull, isnotnull, nullif, case, if, date_format. +- **`shape/`:** group-by single/multi-key/multi-agg, filtered group-by, sort/limit top-N with tie-break, + string sort, dedup. +- **`window/`:** eventstats by group, streamstats running sum. +- **`join/`:** inner / left / semi / anti + join-then-group (self-joined on `%INDEX%`). +- **`cmd/`:** rex, table, spath, rename, fillnull, bin, top, chart, lookup, appendpipe. + +## Muted (skipped) queries — single mechanism + +Every known-broken query is listed in exactly one place: the overriding IT's `knownIssues()` map +(`` → reason). Listed queries are **skipped** (never run) and logged as `MUTED: `; there +is no `@AwaitsFix` and no separate directory. + +The complete current list (keep in sync with the `knownIssues()` maps): + +``` +distinct_count_label TwoShardAggregationIT +distinct_count_by_cat TwoShardAggregationIT +dc_label TwoShardAggregationIT +streamstats_sum TwoShardShapeIT +join_inner_id_count TwoShardJoinIT +join_inner_category_count TwoShardJoinIT +join_left_count TwoShardJoinIT +join_semi_count TwoShardJoinIT +join_anti_count TwoShardJoinIT +join_inner_by_category TwoShardJoinIT +cmd_search TwoShardCommandIT +cmd_append TwoShardCommandIT +cmd_regex TwoShardCommandIT +cmd_multisearch TwoShardCommandIT +cmd_appendcols TwoShardCommandIT +cmd_timechart TwoShardCommandIT +cmd_appendpipe TwoShardCommandIT +``` + +What's muted and why: + +- **distinct_count / dc / distinct_count_by_cat** (`TwoShardAggregationIT`) — HLL cross-shard sketch + merge over-counts repeated keyword sets: `distinct_count(label)` = 5 at 1 shard, 9 at 2; by-category + 5/5/5 vs 4/7/8. Correct for all-unique (`amount`=30) and low-card (`category`=3). Genuine merge bug. +- **streamstats_sum** (`TwoShardShapeIT`) — cumulative window, order-sensitive; the arrival-ordered + gather computes the running aggregate over the wrong order (1-shard `1,3,6,10,…` vs 2-shard `216,2,5,9,…`). +- **all 6 join queries** (`TwoShardJoinIT`) and **cmd_appendpipe** (`TwoShardCommandIT`) — since #21867 + ("Lucene as a driving backend for shard-local count fragments") the bare `[ source ]` join arm / union + branch is lucene-driven while the main arm stays datafusion, and `OpenSearchJoin` / `OpenSearchUnion` + reject the mixed backends. Reduce-sound before #21867. +- **cmd_search / cmd_append / cmd_regex / cmd_multisearch** (`TwoShardCommandIT`) — carry a residual + predicate that routes through the DataFusion indexed executor, which at 2 shards **SIGSEGVs the data + node** during the Arrow variable-width-view C-data export (`upcallLinker.cpp:137`). These *must* be + skipped rather than run — a crash would break unrelated tests. +- **cmd_appendcols** (not in the PPL grammar) and **cmd_timechart** (needs an `@timestamp` field). + +## Not covered — inherently nondeterministic at 2 shards + +`take(field, N)` returns the first N values in *arrival* order with no ordering guarantee, so 2 shards +legitimately yield a different subset (same hazard as `head N` without sort). A sort doesn't fix it +(the per-shard partials are still merged arrival-ordered). Not a reduce-correctness signal; left out. diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/avg_double.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/avg_double.ppl new file mode 100644 index 0000000000000..3f21ac8a72c64 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/avg_double.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats avg(price) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/avg_int.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/avg_int.ppl new file mode 100644 index 0000000000000..741c20a62c26f --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/avg_int.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats avg(amount) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/count_field.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/count_field.ppl new file mode 100644 index 0000000000000..b9211f8330b5d --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/count_field.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats count(opt) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/count_global.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/count_global.ppl new file mode 100644 index 0000000000000..baa47fe447c7f --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/count_global.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats count() diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/expected/count_field.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/expected/count_field.json new file mode 100644 index 0000000000000..162f8ea6c8e02 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/expected/count_field.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 15 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/expected/count_global.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/expected/count_global.json new file mode 100644 index 0000000000000..2df06e87bcd0c --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/expected/count_global.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 30 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/expected/max_int.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/expected/max_int.json new file mode 100644 index 0000000000000..2df06e87bcd0c --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/expected/max_int.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 30 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/expected/min_int.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/expected/min_int.json new file mode 100644 index 0000000000000..4331c75ee6a4f --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/expected/min_int.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 1 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/expected/sum_int.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/expected/sum_int.json new file mode 100644 index 0000000000000..5c72d87d4a22e --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/expected/sum_int.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 465 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/list_label.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/list_label.ppl new file mode 100644 index 0000000000000..6147e17b54414 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/list_label.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats list(label) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/max_double.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/max_double.ppl new file mode 100644 index 0000000000000..1f119438bdf7b --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/max_double.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats max(price) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/max_int.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/max_int.ppl new file mode 100644 index 0000000000000..a31f13644a809 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/max_int.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats max(amount) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/min_double.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/min_double.ppl new file mode 100644 index 0000000000000..fd2f699f0ec74 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/min_double.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats min(price) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/min_int.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/min_int.ppl new file mode 100644 index 0000000000000..16e3032f563e1 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/min_int.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats min(amount) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/span_count.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/span_count.ppl new file mode 100644 index 0000000000000..1c73230c7d7b7 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/span_count.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats count() by span(amount, 5) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/stddev_pop.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/stddev_pop.ppl new file mode 100644 index 0000000000000..78486d297277b --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/stddev_pop.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats stddev_pop(amount) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/stddev_samp.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/stddev_samp.ppl new file mode 100644 index 0000000000000..a87adf43efc6f --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/stddev_samp.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats stddev_samp(amount) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/sum_double.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/sum_double.ppl new file mode 100644 index 0000000000000..c1737a5e901c3 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/sum_double.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats sum(price) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/sum_int.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/sum_int.ppl new file mode 100644 index 0000000000000..ac0b3505e9e2f --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/sum_int.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats sum(amount) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/values_label.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/values_label.ppl new file mode 100644 index 0000000000000..e54f2a7016060 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/values_label.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats values(label) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/var_pop.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/var_pop.ppl new file mode 100644 index 0000000000000..38953109db20b --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/var_pop.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats var_pop(amount) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/var_samp.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/var_samp.ppl new file mode 100644 index 0000000000000..cec8a4be95068 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/agg/var_samp.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats var_samp(amount) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/dc_label.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/dc_label.ppl new file mode 100644 index 0000000000000..9afa3dbb23a3d --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/dc_label.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats dc(label) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/distinct_count_amount.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/distinct_count_amount.ppl new file mode 100644 index 0000000000000..a6ef07dba4fda --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/distinct_count_amount.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats distinct_count(amount) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/distinct_count_by_cat.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/distinct_count_by_cat.ppl new file mode 100644 index 0000000000000..88b8c54d2bf51 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/distinct_count_by_cat.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats distinct_count(label) by category diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/distinct_count_category.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/distinct_count_category.ppl new file mode 100644 index 0000000000000..fa2abdd4b58ae --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/distinct_count_category.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats distinct_count(category) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/distinct_count_label.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/distinct_count_label.ppl new file mode 100644 index 0000000000000..bfde5365856c8 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/distinct_count_label.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats distinct_count(label) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/dc_label.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/dc_label.json new file mode 100644 index 0000000000000..174efabadc38b --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/dc_label.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 5 + ] + ] +} diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/distinct_count_amount.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/distinct_count_amount.json new file mode 100644 index 0000000000000..2df06e87bcd0c --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/distinct_count_amount.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 30 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/distinct_count_by_cat.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/distinct_count_by_cat.json new file mode 100644 index 0000000000000..fa495a8098d82 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/distinct_count_by_cat.json @@ -0,0 +1,16 @@ +{ + "rows": [ + [ + 5, + "A" + ], + [ + 5, + "B" + ], + [ + 5, + "C" + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/distinct_count_category.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/distinct_count_category.json new file mode 100644 index 0000000000000..a4c68e9b8243d --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/distinct_count_category.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 3 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/distinct_count_label.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/distinct_count_label.json new file mode 100644 index 0000000000000..d4c8f3a89dd66 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/distinct_count_label.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 5 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/median_amount.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/median_amount.json new file mode 100644 index 0000000000000..821892b2ffadf --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/median_amount.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 15.5 + ] + ] +} diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/percentile_50.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/percentile_50.json new file mode 100644 index 0000000000000..0d30cec89522c --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/percentile_50.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 15.5 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/percentile_90.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/percentile_90.json new file mode 100644 index 0000000000000..6dd0dac7f3c93 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/percentile_90.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 27.1 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/percentile_approx_amount.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/percentile_approx_amount.json new file mode 100644 index 0000000000000..821892b2ffadf --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/expected/percentile_approx_amount.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 15.5 + ] + ] +} diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/median_amount.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/median_amount.ppl new file mode 100644 index 0000000000000..660f2f347d8cc --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/median_amount.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats median(amount) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/percentile_50.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/percentile_50.ppl new file mode 100644 index 0000000000000..213c990920be7 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/percentile_50.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats percentile(amount, 50) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/percentile_90.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/percentile_90.ppl new file mode 100644 index 0000000000000..d0498c6848b83 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/percentile_90.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats percentile(amount, 90) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/percentile_approx_amount.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/percentile_approx_amount.ppl new file mode 100644 index 0000000000000..72a84b6c80184 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/approx/percentile_approx_amount.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats percentile_approx(amount, 50) diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/bulk.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/bulk.json new file mode 100644 index 0000000000000..94ebbddc204fe --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/bulk.json @@ -0,0 +1,60 @@ +{"index": {"_id": "0"}} +{"id": 0, "category": "A", "region": "east", "amount": 1, "price": 1.5, "label": "lbl1", "flag": false, "ts": "2024-01-01", "opt": 1, "payload": "{\"v\": 1}"} +{"index": {"_id": "1"}} +{"id": 1, "category": "A", "region": "west", "amount": 2, "price": 3.0, "label": "lbl2", "flag": true, "ts": "2024-01-02", "payload": "{\"v\": 2}"} +{"index": {"_id": "2"}} +{"id": 2, "category": "A", "region": "east", "amount": 3, "price": 4.5, "label": "lbl3", "flag": false, "ts": "2024-01-03", "opt": 3, "payload": "{\"v\": 3}"} +{"index": {"_id": "3"}} +{"id": 3, "category": "A", "region": "west", "amount": 4, "price": 6.0, "label": "lbl4", "flag": true, "ts": "2024-01-04", "payload": "{\"v\": 4}"} +{"index": {"_id": "4"}} +{"id": 4, "category": "A", "region": "east", "amount": 5, "price": 7.5, "label": "lbl0", "flag": false, "ts": "2024-01-05", "opt": 5, "payload": "{\"v\": 5}"} +{"index": {"_id": "5"}} +{"id": 5, "category": "A", "region": "west", "amount": 6, "price": 9.0, "label": "lbl1", "flag": true, "ts": "2024-01-06", "payload": "{\"v\": 6}"} +{"index": {"_id": "6"}} +{"id": 6, "category": "A", "region": "east", "amount": 7, "price": 10.5, "label": "lbl2", "flag": false, "ts": "2024-01-07", "opt": 7, "payload": "{\"v\": 7}"} +{"index": {"_id": "7"}} +{"id": 7, "category": "A", "region": "west", "amount": 8, "price": 12.0, "label": "lbl3", "flag": true, "ts": "2024-01-08", "payload": "{\"v\": 8}"} +{"index": {"_id": "8"}} +{"id": 8, "category": "A", "region": "east", "amount": 9, "price": 13.5, "label": "lbl4", "flag": false, "ts": "2024-01-09", "opt": 9, "payload": "{\"v\": 9}"} +{"index": {"_id": "9"}} +{"id": 9, "category": "A", "region": "west", "amount": 10, "price": 15.0, "label": "lbl0", "flag": true, "ts": "2024-01-10", "payload": "{\"v\": 10}"} +{"index": {"_id": "10"}} +{"id": 10, "category": "B", "region": "east", "amount": 11, "price": 16.5, "label": "lbl1", "flag": false, "ts": "2024-01-11", "opt": 11, "payload": "{\"v\": 11}"} +{"index": {"_id": "11"}} +{"id": 11, "category": "B", "region": "west", "amount": 12, "price": 18.0, "label": "lbl2", "flag": true, "ts": "2024-01-12", "payload": "{\"v\": 12}"} +{"index": {"_id": "12"}} +{"id": 12, "category": "B", "region": "east", "amount": 13, "price": 19.5, "label": "lbl3", "flag": false, "ts": "2024-01-13", "opt": 13, "payload": "{\"v\": 13}"} +{"index": {"_id": "13"}} +{"id": 13, "category": "B", "region": "west", "amount": 14, "price": 21.0, "label": "lbl4", "flag": true, "ts": "2024-01-14", "payload": "{\"v\": 14}"} +{"index": {"_id": "14"}} +{"id": 14, "category": "B", "region": "east", "amount": 15, "price": 22.5, "label": "lbl0", "flag": false, "ts": "2024-01-15", "opt": 15, "payload": "{\"v\": 15}"} +{"index": {"_id": "15"}} +{"id": 15, "category": "B", "region": "west", "amount": 16, "price": 24.0, "label": "lbl1", "flag": true, "ts": "2024-01-16", "payload": "{\"v\": 16}"} +{"index": {"_id": "16"}} +{"id": 16, "category": "B", "region": "east", "amount": 17, "price": 25.5, "label": "lbl2", "flag": false, "ts": "2024-01-17", "opt": 17, "payload": "{\"v\": 17}"} +{"index": {"_id": "17"}} +{"id": 17, "category": "B", "region": "west", "amount": 18, "price": 27.0, "label": "lbl3", "flag": true, "ts": "2024-01-18", "payload": "{\"v\": 18}"} +{"index": {"_id": "18"}} +{"id": 18, "category": "B", "region": "east", "amount": 19, "price": 28.5, "label": "lbl4", "flag": false, "ts": "2024-01-19", "opt": 19, "payload": "{\"v\": 19}"} +{"index": {"_id": "19"}} +{"id": 19, "category": "B", "region": "west", "amount": 20, "price": 30.0, "label": "lbl0", "flag": true, "ts": "2024-01-20", "payload": "{\"v\": 20}"} +{"index": {"_id": "20"}} +{"id": 20, "category": "C", "region": "east", "amount": 21, "price": 31.5, "label": "lbl1", "flag": false, "ts": "2024-01-21", "opt": 21, "payload": "{\"v\": 21}"} +{"index": {"_id": "21"}} +{"id": 21, "category": "C", "region": "west", "amount": 22, "price": 33.0, "label": "lbl2", "flag": true, "ts": "2024-01-22", "payload": "{\"v\": 22}"} +{"index": {"_id": "22"}} +{"id": 22, "category": "C", "region": "east", "amount": 23, "price": 34.5, "label": "lbl3", "flag": false, "ts": "2024-01-23", "opt": 23, "payload": "{\"v\": 23}"} +{"index": {"_id": "23"}} +{"id": 23, "category": "C", "region": "west", "amount": 24, "price": 36.0, "label": "lbl4", "flag": true, "ts": "2024-01-24", "payload": "{\"v\": 24}"} +{"index": {"_id": "24"}} +{"id": 24, "category": "C", "region": "east", "amount": 25, "price": 37.5, "label": "lbl0", "flag": false, "ts": "2024-01-25", "opt": 25, "payload": "{\"v\": 25}"} +{"index": {"_id": "25"}} +{"id": 25, "category": "C", "region": "west", "amount": 26, "price": 39.0, "label": "lbl1", "flag": true, "ts": "2024-01-26", "payload": "{\"v\": 26}"} +{"index": {"_id": "26"}} +{"id": 26, "category": "C", "region": "east", "amount": 27, "price": 40.5, "label": "lbl2", "flag": false, "ts": "2024-01-27", "opt": 27, "payload": "{\"v\": 27}"} +{"index": {"_id": "27"}} +{"id": 27, "category": "C", "region": "west", "amount": 28, "price": 42.0, "label": "lbl3", "flag": true, "ts": "2024-01-28", "payload": "{\"v\": 28}"} +{"index": {"_id": "28"}} +{"id": 28, "category": "C", "region": "east", "amount": 29, "price": 43.5, "label": "lbl4", "flag": false, "ts": "2024-01-29", "opt": 29, "payload": "{\"v\": 29}"} +{"index": {"_id": "29"}} +{"id": 29, "category": "C", "region": "west", "amount": 30, "price": 45.0, "label": "lbl0", "flag": true, "ts": "2024-01-30", "payload": "{\"v\": 30}"} diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_append.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_append.ppl new file mode 100644 index 0000000000000..bd09cdae200b9 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_append.ppl @@ -0,0 +1 @@ +source=%INDEX% category="A" | append [ source=%INDEX% category="B" ] | stats count() diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_appendcols.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_appendcols.ppl new file mode 100644 index 0000000000000..12df0d053f0e7 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_appendcols.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats count() as c | appendcols [ source=%INDEX% | stats sum(amount) as s ] diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_appendpipe.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_appendpipe.ppl new file mode 100644 index 0000000000000..09e7148b08e28 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_appendpipe.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats count() as c by category | appendpipe [ stats sum(c) as c ] | sort category diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_bin.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_bin.ppl new file mode 100644 index 0000000000000..4c9021415aef7 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_bin.ppl @@ -0,0 +1 @@ +source=%INDEX% | bin amount span=5 | stats count() by amount diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_chart.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_chart.ppl new file mode 100644 index 0000000000000..9b40fcb06b117 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_chart.ppl @@ -0,0 +1 @@ +source=%INDEX% | chart count() by category diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_fillnull.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_fillnull.ppl new file mode 100644 index 0000000000000..6c54ee70d35de --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_fillnull.ppl @@ -0,0 +1 @@ +source=%INDEX% | fillnull value=0 opt | sort id | head 6 | fields id, opt diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_lookup.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_lookup.ppl new file mode 100644 index 0000000000000..c7a176e1114f8 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_lookup.ppl @@ -0,0 +1 @@ +source=%INDEX% | lookup merge_coverage_lookup category | stats count() diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_multisearch.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_multisearch.ppl new file mode 100644 index 0000000000000..7cfc8e68f2f42 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_multisearch.ppl @@ -0,0 +1 @@ +multisearch [ search source=%INDEX% category="A" ] [ search source=%INDEX% category="B" ] | stats count() diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_regex.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_regex.ppl new file mode 100644 index 0000000000000..964cb33415608 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_regex.ppl @@ -0,0 +1 @@ +source=%INDEX% | regex label="lbl[0-2]" | stats count() diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_rename.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_rename.ppl new file mode 100644 index 0000000000000..ee5e62d8da302 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_rename.ppl @@ -0,0 +1 @@ +source=%INDEX% | rename amount as amt | sort id | head 5 | fields id, amt diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_rex.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_rex.ppl new file mode 100644 index 0000000000000..74ed4ebc2e037 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_rex.ppl @@ -0,0 +1 @@ +source=%INDEX% | rex field=label "lbl(?[0-9]+)" | sort id | head 5 | fields id, d diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_search.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_search.ppl new file mode 100644 index 0000000000000..585562f052221 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_search.ppl @@ -0,0 +1 @@ +search source=%INDEX% amount > 15 | stats count() diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_spath.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_spath.ppl new file mode 100644 index 0000000000000..d651cfb579b08 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_spath.ppl @@ -0,0 +1 @@ +source=%INDEX% | spath input=payload path=v | sort id | head 5 | fields id, v diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_table.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_table.ppl new file mode 100644 index 0000000000000..ec2a1ee354246 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_table.ppl @@ -0,0 +1 @@ +source=%INDEX% | sort id | head 5 | table id, amount, category diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_timechart.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_timechart.ppl new file mode 100644 index 0000000000000..0f0ba159a3f55 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_timechart.ppl @@ -0,0 +1 @@ +source=%INDEX% | timechart span=1d count() diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_top.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_top.ppl new file mode 100644 index 0000000000000..0d2e22b19e1f3 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/cmd_top.ppl @@ -0,0 +1 @@ +source=%INDEX% | top 5 label diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/expected/cmd_append.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/expected/cmd_append.json new file mode 100644 index 0000000000000..6c001a96a65ac --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/expected/cmd_append.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 20 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/expected/cmd_lookup.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/expected/cmd_lookup.json new file mode 100644 index 0000000000000..2df06e87bcd0c --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/expected/cmd_lookup.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 30 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/expected/cmd_multisearch.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/expected/cmd_multisearch.json new file mode 100644 index 0000000000000..6c001a96a65ac --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/expected/cmd_multisearch.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 20 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/expected/cmd_regex.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/expected/cmd_regex.json new file mode 100644 index 0000000000000..b03f14449bc67 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/expected/cmd_regex.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 18 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/expected/cmd_search.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/expected/cmd_search.json new file mode 100644 index 0000000000000..162f8ea6c8e02 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/cmd/expected/cmd_search.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 15 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_anti_count.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_anti_count.json new file mode 100644 index 0000000000000..6c001a96a65ac --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_anti_count.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 20 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_inner_by_category.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_inner_by_category.json new file mode 100644 index 0000000000000..bc6d3d2d870ad --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_inner_by_category.json @@ -0,0 +1,16 @@ +{ + "rows": [ + [ + 100, + "A" + ], + [ + 100, + "B" + ], + [ + 100, + "C" + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_inner_category_count.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_inner_category_count.json new file mode 100644 index 0000000000000..44b23bc7ce8be --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_inner_category_count.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 300 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_inner_id_count.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_inner_id_count.json new file mode 100644 index 0000000000000..2df06e87bcd0c --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_inner_id_count.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 30 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_left_count.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_left_count.json new file mode 100644 index 0000000000000..2df06e87bcd0c --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_left_count.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 30 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_semi_count.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_semi_count.json new file mode 100644 index 0000000000000..83ebbe9c191f8 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/expected/join_semi_count.json @@ -0,0 +1,7 @@ +{ + "rows": [ + [ + 10 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_anti_count.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_anti_count.ppl new file mode 100644 index 0000000000000..49e1acf10b968 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_anti_count.ppl @@ -0,0 +1 @@ +source=%INDEX% | left anti join left=a, right=b ON a.category = b.category [ source=%INDEX% | where amount > 25 ] | stats count() as cnt diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_inner_by_category.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_inner_by_category.ppl new file mode 100644 index 0000000000000..4a546315ee812 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_inner_by_category.ppl @@ -0,0 +1 @@ +source=%INDEX% | inner join left=a, right=b ON a.category = b.category [ source=%INDEX% ] | stats count() as cnt by a.category diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_inner_category_count.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_inner_category_count.ppl new file mode 100644 index 0000000000000..d90024b7a65df --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_inner_category_count.ppl @@ -0,0 +1 @@ +source=%INDEX% | inner join left=a, right=b ON a.category = b.category [ source=%INDEX% ] | stats count() as cnt diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_inner_id_count.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_inner_id_count.ppl new file mode 100644 index 0000000000000..07d74195f8e32 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_inner_id_count.ppl @@ -0,0 +1 @@ +source=%INDEX% | inner join left=a, right=b ON a.id = b.id [ source=%INDEX% ] | stats count() as cnt diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_left_count.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_left_count.ppl new file mode 100644 index 0000000000000..7e6f3203a6bbb --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_left_count.ppl @@ -0,0 +1 @@ +source=%INDEX% | left join left=a, right=b ON a.id = b.id [ source=%INDEX% | where amount > 5 ] | stats count() as cnt diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_semi_count.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_semi_count.ppl new file mode 100644 index 0000000000000..2ce29a62dd108 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/join/join_semi_count.ppl @@ -0,0 +1 @@ +source=%INDEX% | left semi join left=a, right=b ON a.category = b.category [ source=%INDEX% | where amount > 25 ] | stats count() as cnt diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/mapping.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/mapping.json new file mode 100644 index 0000000000000..6a31e9ef5fd9f --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/mapping.json @@ -0,0 +1,41 @@ +{ + "settings": { + "number_of_shards": 1, + "number_of_replicas": 0 + }, + "mappings": { + "properties": { + "id": { + "type": "integer" + }, + "category": { + "type": "keyword" + }, + "region": { + "type": "keyword" + }, + "amount": { + "type": "integer" + }, + "price": { + "type": "double" + }, + "label": { + "type": "keyword" + }, + "flag": { + "type": "boolean" + }, + "ts": { + "type": "date", + "format": "yyyy-MM-dd" + }, + "opt": { + "type": "integer" + }, + "payload": { + "type": "keyword" + } + } + } +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_abs.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_abs.ppl new file mode 100644 index 0000000000000..db5d3e05697f4 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_abs.ppl @@ -0,0 +1 @@ +source=%INDEX% | eval r = abs(0 - amount) | sort id | fields id, r diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_case.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_case.ppl new file mode 100644 index 0000000000000..be477e2cf71a0 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_case.ppl @@ -0,0 +1 @@ +source=%INDEX% | eval r = case(amount < 11, 'low', amount < 21, 'mid' else 'high') | sort id | fields id, r diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_cast_dbl.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_cast_dbl.ppl new file mode 100644 index 0000000000000..9c74fcac8096c --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_cast_dbl.ppl @@ -0,0 +1 @@ +source=%INDEX% | eval r = cast(amount as double) | sort id | fields id, r diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_cast_int.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_cast_int.ppl new file mode 100644 index 0000000000000..7bedffef16534 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_cast_int.ppl @@ -0,0 +1 @@ +source=%INDEX% | eval r = cast(price as int) | sort id | fields id, r diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_cast_str.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_cast_str.ppl new file mode 100644 index 0000000000000..c4dcd8be21977 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_cast_str.ppl @@ -0,0 +1 @@ +source=%INDEX% | eval r = cast(amount as string) | sort id | fields id, r diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_coalesce.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_coalesce.ppl new file mode 100644 index 0000000000000..3f7f272d93f5f --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_coalesce.ppl @@ -0,0 +1 @@ +source=%INDEX% | eval r = coalesce(opt, 0 - 1) | sort id | fields id, r diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_date_fmt.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_date_fmt.ppl new file mode 100644 index 0000000000000..fb0faf82a4797 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_date_fmt.ppl @@ -0,0 +1 @@ +source=%INDEX% | eval r = date_format(ts, 'yyyy/MM/dd') | sort id | fields id, r diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_if.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_if.ppl new file mode 100644 index 0000000000000..c18a4a2534d03 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_if.ppl @@ -0,0 +1 @@ +source=%INDEX% | eval r = if(flag, 'even', 'odd') | sort id | fields id, r diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_ifnull.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_ifnull.ppl new file mode 100644 index 0000000000000..121c2a23c86cf --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_ifnull.ppl @@ -0,0 +1 @@ +source=%INDEX% | eval r = ifnull(opt, 0 - 1) | sort id | fields id, r diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_isnotnull.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_isnotnull.ppl new file mode 100644 index 0000000000000..db519f54b76d9 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_isnotnull.ppl @@ -0,0 +1 @@ +source=%INDEX% | eval r = isnotnull(opt) | sort id | fields id, r diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_isnull.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_isnull.ppl new file mode 100644 index 0000000000000..84b588f359d6f --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_isnull.ppl @@ -0,0 +1 @@ +source=%INDEX% | eval r = isnull(opt) | sort id | fields id, r diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_lower.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_lower.ppl new file mode 100644 index 0000000000000..b29f10c004d1d --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_lower.ppl @@ -0,0 +1 @@ +source=%INDEX% | eval r = lower(label) | sort id | fields id, r diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_nullif.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_nullif.ppl new file mode 100644 index 0000000000000..b329f7145f2db --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_nullif.ppl @@ -0,0 +1 @@ +source=%INDEX% | eval r = nullif(amount, 5) | sort id | fields id, r diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_pow.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_pow.ppl new file mode 100644 index 0000000000000..b2c9718bde218 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_pow.ppl @@ -0,0 +1 @@ +source=%INDEX% | eval r = pow(amount, 2) | sort id | fields id, r diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_replace.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_replace.ppl new file mode 100644 index 0000000000000..bb21ef813914c --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_replace.ppl @@ -0,0 +1 @@ +source=%INDEX% | eval r = replace(label, 'lbl', 'L') | sort id | fields id, r diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_round.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_round.ppl new file mode 100644 index 0000000000000..d590c423c685c --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_round.ppl @@ -0,0 +1 @@ +source=%INDEX% | eval r = round(price) | sort id | fields id, r diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_round2.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_round2.ppl new file mode 100644 index 0000000000000..1e1c0cbe3a628 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_round2.ppl @@ -0,0 +1 @@ +source=%INDEX% | eval r = round(price, 1) | sort id | fields id, r diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_substring.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_substring.ppl new file mode 100644 index 0000000000000..30038b48fd888 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_substring.ppl @@ -0,0 +1 @@ +source=%INDEX% | eval r = substring(label, 1, 2) | sort id | fields id, r diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_upper.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_upper.ppl new file mode 100644 index 0000000000000..9d82223ad0b49 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/scalar/sc_upper.ppl @@ -0,0 +1 @@ +source=%INDEX% | eval r = upper(label) | sort id | fields id, r diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/avg_by_category.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/avg_by_category.ppl new file mode 100644 index 0000000000000..45a230a30ac63 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/avg_by_category.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats avg(amount) by category diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/count_by_category.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/count_by_category.ppl new file mode 100644 index 0000000000000..eab0736371ffa --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/count_by_category.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats count() by category diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/count_by_category_region.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/count_by_category_region.ppl new file mode 100644 index 0000000000000..af2659923513a --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/count_by_category_region.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats count() by category, region diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/dedup_category.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/dedup_category.ppl new file mode 100644 index 0000000000000..b1f3d8c429576 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/dedup_category.ppl @@ -0,0 +1 @@ +source=%INDEX% | dedup category | fields category diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/avg_by_category.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/avg_by_category.json new file mode 100644 index 0000000000000..f6de2c2a8ff90 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/avg_by_category.json @@ -0,0 +1,16 @@ +{ + "rows": [ + [ + 5.5, + "A" + ], + [ + 15.5, + "B" + ], + [ + 25.5, + "C" + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/count_by_category.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/count_by_category.json new file mode 100644 index 0000000000000..0dd19cc1714e3 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/count_by_category.json @@ -0,0 +1,16 @@ +{ + "rows": [ + [ + 10, + "A" + ], + [ + 10, + "B" + ], + [ + 10, + "C" + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/count_by_category_region.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/count_by_category_region.json new file mode 100644 index 0000000000000..552d1408cf848 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/count_by_category_region.json @@ -0,0 +1,34 @@ +{ + "rows": [ + [ + 5, + "A", + "east" + ], + [ + 5, + "A", + "west" + ], + [ + 5, + "B", + "east" + ], + [ + 5, + "B", + "west" + ], + [ + 5, + "C", + "east" + ], + [ + 5, + "C", + "west" + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/dedup_category.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/dedup_category.json new file mode 100644 index 0000000000000..add6b64139cd5 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/dedup_category.json @@ -0,0 +1,13 @@ +{ + "rows": [ + [ + "A" + ], + [ + "B" + ], + [ + "C" + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/minmax_by_category.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/minmax_by_category.json new file mode 100644 index 0000000000000..1087717815a34 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/minmax_by_category.json @@ -0,0 +1,19 @@ +{ + "rows": [ + [ + 1, + 10, + "A" + ], + [ + 11, + 20, + "B" + ], + [ + 21, + 30, + "C" + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/sort_limit.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/sort_limit.json new file mode 100644 index 0000000000000..1ea3369b63d72 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/sort_limit.json @@ -0,0 +1,24 @@ +{ + "rows": [ + [ + 1, + 0 + ], + [ + 2, + 1 + ], + [ + 3, + 2 + ], + [ + 4, + 3 + ], + [ + 5, + 4 + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/sum_by_category.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/sum_by_category.json new file mode 100644 index 0000000000000..bf28201a1897f --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/expected/sum_by_category.json @@ -0,0 +1,16 @@ +{ + "rows": [ + [ + 55, + "A" + ], + [ + 155, + "B" + ], + [ + 255, + "C" + ] + ] +} \ No newline at end of file diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/filtered_group.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/filtered_group.ppl new file mode 100644 index 0000000000000..266cfff208531 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/filtered_group.ppl @@ -0,0 +1 @@ +source=%INDEX% | where amount > 5 | stats sum(amount) by category diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/minmax_by_category.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/minmax_by_category.ppl new file mode 100644 index 0000000000000..b2683dfccf02c --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/minmax_by_category.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats min(amount), max(amount) by category diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/multiagg_by_category.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/multiagg_by_category.ppl new file mode 100644 index 0000000000000..356dd1200a5e9 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/multiagg_by_category.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats sum(amount), avg(price), count() by category diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/sort_desc_limit.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/sort_desc_limit.ppl new file mode 100644 index 0000000000000..1f3b5ed91e565 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/sort_desc_limit.ppl @@ -0,0 +1 @@ +source=%INDEX% | sort - amount, id | head 5 | fields amount, id diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/sort_limit.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/sort_limit.ppl new file mode 100644 index 0000000000000..f49ca20c33137 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/sort_limit.ppl @@ -0,0 +1 @@ +source=%INDEX% | sort amount, id | head 5 | fields amount, id diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/sort_string_limit.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/sort_string_limit.ppl new file mode 100644 index 0000000000000..3b554f1a9ca7e --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/sort_string_limit.ppl @@ -0,0 +1 @@ +source=%INDEX% | sort label, id | head 5 | fields label, id diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/sum_by_category.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/sum_by_category.ppl new file mode 100644 index 0000000000000..d4f770e14ed0d --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/shape/sum_by_category.ppl @@ -0,0 +1 @@ +source=%INDEX% | stats sum(amount) by category diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/window/eventstats_by_category.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/window/eventstats_by_category.ppl new file mode 100644 index 0000000000000..427973415879b --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/window/eventstats_by_category.ppl @@ -0,0 +1 @@ +source=%INDEX% | eventstats avg(amount) as ca by category | sort id | fields id, ca diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/window/streamstats_sum.ppl b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/window/streamstats_sum.ppl new file mode 100644 index 0000000000000..e1b739b672ce3 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage/window/streamstats_sum.ppl @@ -0,0 +1 @@ +source=%INDEX% | sort id | streamstats sum(amount) as run | sort id | fields id, run diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage_lookup/bulk.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage_lookup/bulk.json new file mode 100644 index 0000000000000..1696be70c9dd0 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage_lookup/bulk.json @@ -0,0 +1,6 @@ +{"index": {}} +{"category": "A", "region_name": "Americas"} +{"index": {}} +{"category": "B", "region_name": "Boreal"} +{"index": {}} +{"category": "C", "region_name": "Coastal"} diff --git a/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage_lookup/mapping.json b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage_lookup/mapping.json new file mode 100644 index 0000000000000..a733d06ce2457 --- /dev/null +++ b/sandbox/qa/analytics-engine-rest/src/test/resources/datasets/merge_coverage_lookup/mapping.json @@ -0,0 +1,16 @@ +{ + "settings": { + "number_of_shards": 1, + "number_of_replicas": 0 + }, + "mappings": { + "properties": { + "category": { + "type": "keyword" + }, + "region_name": { + "type": "keyword" + } + } + } +} \ No newline at end of file From a577ad19b8a40b0e828f0750a0caba4506ece5a9 Mon Sep 17 00:00:00 2001 From: Marc Handalian Date: Tue, 2 Jun 2026 12:12:42 -0700 Subject: [PATCH 2/2] Update to use test level skips for 1 shard suite Signed-off-by: Marc Handalian --- .../org/opensearch/analytics/qa/AggregationsPplIT.java | 8 ++++++-- .../java/org/opensearch/analytics/qa/AppLogsPplIT.java | 8 ++++++-- .../org/opensearch/analytics/qa/ComplexJoinsPplIT.java | 8 ++++++-- .../opensearch/analytics/qa/ExtensiveCoveragePplIT.java | 8 ++++++-- .../org/opensearch/analytics/qa/FulltextWindowPplIT.java | 8 ++++++-- .../java/org/opensearch/analytics/qa/FunctionsPplIT.java | 8 ++++++-- .../org/opensearch/analytics/qa/KubernetesLogsPplIT.java | 8 ++++++-- .../opensearch/analytics/qa/MultiIndexQueriesPplIT.java | 8 ++++++-- .../opensearch/analytics/qa/MultiSourceJoinsPplIT.java | 8 ++++++-- .../java/org/opensearch/analytics/qa/RexCommandPplIT.java | 8 ++++++-- .../org/opensearch/analytics/qa/SecurityLogsPplIT.java | 8 ++++++-- 11 files changed, 66 insertions(+), 22 deletions(-) diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/AggregationsPplIT.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/AggregationsPplIT.java index 31e01188843e5..c3f4497736113 100644 --- a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/AggregationsPplIT.java +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/AggregationsPplIT.java @@ -8,7 +8,6 @@ package org.opensearch.analytics.qa; -import org.apache.lucene.tests.util.LuceneTestCase.AwaitsFix; /** * Aggregation functions testing PPL integration test. @@ -20,8 +19,13 @@ protected Dataset getDataset() { return AggregationsTestHelper.DATASET; } - @AwaitsFix(bugUrl = "Failing due to unsupported operations") public void testAggregationsPplQueries() throws Exception { runPplQueries(); } + + /** Queries that fail at 1 shard: distinct_count/percentile value mismatches (approx + HLL merge). Skipped so the rest run and are visible. */ + @Override + protected java.util.Set getSkipQueries() { + return java.util.Set.of(7, 8, 9, 10); + } } diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/AppLogsPplIT.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/AppLogsPplIT.java index 62f8e7cabe697..3dd83bb96bf89 100644 --- a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/AppLogsPplIT.java +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/AppLogsPplIT.java @@ -8,7 +8,6 @@ package org.opensearch.analytics.qa; -import org.apache.lucene.tests.util.LuceneTestCase.AwaitsFix; /** * Application log analysis PPL integration test. @@ -20,8 +19,13 @@ protected Dataset getDataset() { return AppLogsTestHelper.DATASET; } - @AwaitsFix(bugUrl = "Failing due to unsupported operations") public void testAppLogsPplQueries() throws Exception { runPplQueries(); } + + /** Queries that fail at 1 shard: unsupported operations. Skipped so the rest run and are visible. */ + @Override + protected java.util.Set getSkipQueries() { + return java.util.Set.of(5, 9); + } } diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/ComplexJoinsPplIT.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/ComplexJoinsPplIT.java index 8b2f467571581..5d55a6441c49b 100644 --- a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/ComplexJoinsPplIT.java +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/ComplexJoinsPplIT.java @@ -8,7 +8,6 @@ package org.opensearch.analytics.qa; -import org.apache.lucene.tests.util.LuceneTestCase.AwaitsFix; /** * Complex Joins PPL integration test (multi-index). Tests join operations across multiple indexes. @@ -34,9 +33,14 @@ private void ensureAdditionalDataProvisioned() throws Exception { } } - @AwaitsFix(bugUrl = "Failing due to unsupported operations") public void testComplexJoinsPplQueries() throws Exception { ensureAdditionalDataProvisioned(); runPplQueries(); } + + /** Queries that fail at 1 shard: join row-count / unsupported shapes. Skipped so the rest run and are visible. */ + @Override + protected java.util.Set getSkipQueries() { + return java.util.Set.of(1, 2, 3, 4, 7, 8, 9, 10); + } } diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/ExtensiveCoveragePplIT.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/ExtensiveCoveragePplIT.java index 1600cacc8968d..558feab0451f6 100644 --- a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/ExtensiveCoveragePplIT.java +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/ExtensiveCoveragePplIT.java @@ -8,7 +8,6 @@ package org.opensearch.analytics.qa; -import org.apache.lucene.tests.util.LuceneTestCase.AwaitsFix; /** * Extensive function coverage testing PPL integration test. @@ -20,8 +19,13 @@ protected Dataset getDataset() { return ExtensiveCoverageTestHelper.DATASET; } - @AwaitsFix(bugUrl = "Failing due to unsupported operations") public void testExtensiveCoveragePplQueries() throws Exception { runPplQueries(); } + + /** Queries that fail at 1 shard: mixed: date/time formatting, string-value, unsupported-fn (see per-q). Skipped so the rest run and are visible. */ + @Override + protected java.util.Set getSkipQueries() { + return java.util.Set.of(8, 9, 10, 13, 19, 20, 22, 24, 25, 28, 29, 30, 37, 39, 40, 41, 42, 43, 44, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 70, 77, 81, 85, 86, 88, 89, 93, 94, 95, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 108, 110, 111, 112, 114, 115, 116, 117, 119, 120, 125, 126, 128, 129, 130, 131, 132, 136, 137, 138, 139, 143, 144, 145, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 162, 163, 177, 188, 189, 190, 191, 193, 195, 196); + } } diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/FulltextWindowPplIT.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/FulltextWindowPplIT.java index 7a6bb77cadc67..eed89bf9d1648 100644 --- a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/FulltextWindowPplIT.java +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/FulltextWindowPplIT.java @@ -8,7 +8,6 @@ package org.opensearch.analytics.qa; -import org.apache.lucene.tests.util.LuceneTestCase.AwaitsFix; /** * Full-text search with window functions testing PPL integration test. @@ -20,8 +19,13 @@ protected Dataset getDataset() { return FulltextWindowTestHelper.DATASET; } - @AwaitsFix(bugUrl = "Failing due to unsupported operations") public void testFulltextWindowPplQueries() throws Exception { runPplQueries(); } + + /** Queries that fail at 1 shard: fulltext + window combinations unsupported. Skipped so the rest run and are visible. */ + @Override + protected java.util.Set getSkipQueries() { + return java.util.Set.of(1, 6, 8, 12, 13, 14, 15, 17, 19); + } } diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/FunctionsPplIT.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/FunctionsPplIT.java index fcffcd4ff6893..c3a7bdfbef62c 100644 --- a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/FunctionsPplIT.java +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/FunctionsPplIT.java @@ -8,7 +8,6 @@ package org.opensearch.analytics.qa; -import org.apache.lucene.tests.util.LuceneTestCase.AwaitsFix; /** * PPL function testing PPL integration test. @@ -20,8 +19,13 @@ protected Dataset getDataset() { return FunctionsTestHelper.DATASET; } - @AwaitsFix(bugUrl = "Failing due to unsupported operations") public void testFunctionsPplQueries() throws Exception { runPplQueries(); } + + /** Queries that fail at 1 shard: split() unsupported. Skipped so the rest run and are visible. */ + @Override + protected java.util.Set getSkipQueries() { + return java.util.Set.of(13); + } } diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/KubernetesLogsPplIT.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/KubernetesLogsPplIT.java index 5ddfb436a41ab..e2a1debb440f1 100644 --- a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/KubernetesLogsPplIT.java +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/KubernetesLogsPplIT.java @@ -8,7 +8,6 @@ package org.opensearch.analytics.qa; -import org.apache.lucene.tests.util.LuceneTestCase.AwaitsFix; /** * Kubernetes log analysis PPL integration test. @@ -20,8 +19,13 @@ protected Dataset getDataset() { return KubernetesLogsTestHelper.DATASET; } - @AwaitsFix(bugUrl = "Failing due to unsupported operations") public void testKubernetesLogsPplQueries() throws Exception { runPplQueries(); } + + /** Queries that fail at 1 shard: unsupported operation. Skipped so the rest run and are visible. */ + @Override + protected java.util.Set getSkipQueries() { + return java.util.Set.of(9); + } } diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/MultiIndexQueriesPplIT.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/MultiIndexQueriesPplIT.java index ec50cb08bdf4c..166e615e9b91e 100644 --- a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/MultiIndexQueriesPplIT.java +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/MultiIndexQueriesPplIT.java @@ -8,7 +8,6 @@ package org.opensearch.analytics.qa; -import org.apache.lucene.tests.util.LuceneTestCase.AwaitsFix; /** * Multi-Index Queries PPL integration test (multi-index). Tests fields, rename, top, rare, span commands. @@ -33,9 +32,14 @@ private void ensureAdditionalDataProvisioned() throws Exception { } } - @AwaitsFix(bugUrl = "Failing due to unsupported operations") public void testMultiIndexQueriesPplQueries() throws Exception { ensureAdditionalDataProvisioned(); runPplQueries(); } + + /** Queries that fail at 1 shard: multi-index 'one concrete index' limit. Skipped so the rest run and are visible. */ + @Override + protected java.util.Set getSkipQueries() { + return java.util.Set.of(2, 7, 10); + } } diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/MultiSourceJoinsPplIT.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/MultiSourceJoinsPplIT.java index 0ac15bd605f35..0346f93692ca2 100644 --- a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/MultiSourceJoinsPplIT.java +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/MultiSourceJoinsPplIT.java @@ -8,7 +8,6 @@ package org.opensearch.analytics.qa; -import org.apache.lucene.tests.util.LuceneTestCase.AwaitsFix; /** * Complex Redesigned (multi-index) PPL integration test. Runs PPL queries against complex_redesigned data. @@ -20,8 +19,13 @@ protected Dataset getDataset() { return MultiSourceJoinsTestHelper.DATASET; } - @AwaitsFix(bugUrl = "Failing due to unsupported operations") public void testMultiSourceJoinsPplQueries() throws Exception { runPplQueries(); } + + /** Queries that fail at 1 shard: multi-source join unsupported. Skipped so the rest run and are visible. */ + @Override + protected java.util.Set getSkipQueries() { + return java.util.Set.of(2, 4); + } } diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/RexCommandPplIT.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/RexCommandPplIT.java index d1db1c36d9853..e657ab1021bbf 100644 --- a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/RexCommandPplIT.java +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/RexCommandPplIT.java @@ -8,7 +8,6 @@ package org.opensearch.analytics.qa; -import org.apache.lucene.tests.util.LuceneTestCase.AwaitsFix; /** * Rex command testing PPL integration test. @@ -20,8 +19,13 @@ protected Dataset getDataset() { return RexCommandTestHelper.DATASET; } - @AwaitsFix(bugUrl = "Failing due to unsupported operations") public void testRexCommandPplQueries() throws Exception { runPplQueries(); } + + /** Queries that fail at 1 shard: rex unsupported / value mismatch. Skipped so the rest run and are visible. */ + @Override + protected java.util.Set getSkipQueries() { + return java.util.Set.of(1, 5, 7, 8, 13, 18); + } } diff --git a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/SecurityLogsPplIT.java b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/SecurityLogsPplIT.java index 279aaaa444445..c90397d74dbe6 100644 --- a/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/SecurityLogsPplIT.java +++ b/sandbox/qa/analytics-engine-rest/src/test/java/org/opensearch/analytics/qa/SecurityLogsPplIT.java @@ -8,7 +8,6 @@ package org.opensearch.analytics.qa; -import org.apache.lucene.tests.util.LuceneTestCase.AwaitsFix; /** * Security Logs PPL integration test. Runs PPL queries against security_logs data. @@ -20,8 +19,13 @@ protected Dataset getDataset() { return SecurityLogsTestHelper.DATASET; } - @AwaitsFix(bugUrl = "Failing due to unsupported operations") public void testSecurityLogsPplQueries() throws Exception { runPplQueries(); } + + /** Queries that fail at 1 shard: unsupported operations / value mismatch. Skipped so the rest run and are visible. */ + @Override + protected java.util.Set getSkipQueries() { + return java.util.Set.of(1, 2, 3, 4, 5, 7, 8); + } }