Skip to content

Commit f16f1c0

Browse files
aalva500-progaaarone90LantaoJinvamsimanoharsongkant-aws
authored
fields Command Enhancement - Advanced Field Selection Features (Calcite) (opensearch-project#3970)
* Add support for space-separated fields in addition to comma-separated Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Byte number should treated as Long in doc values (opensearch-project#3928) Signed-off-by: Lantao Jin <ltjin@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Adding table as alias of the fields command Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Fix create PIT permissions issue (opensearch-project#3921) Signed-off-by: Vamsi Manohar <reddyvam@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Convert like function call to wildcard query for Calcite filter pushdown (opensearch-project#3915) * Convert like function call to wildcard query for Calcite filter pushdown Signed-off-by: Songkan Tang <songkant@amazon.com> * Fix V2 expression like function bug and match its behavior in Calcite Signed-off-by: Songkan Tang <songkant@amazon.com> * Fix like default escape in Calcite Signed-off-by: Songkan Tang <songkant@amazon.com> * Fix tests Signed-off-by: Songkan Tang <songkant@amazon.com> * Fix spotless check Signed-off-by: Songkan Tang <songkant@amazon.com> * Address comments Signed-off-by: Songkan Tang <songkant@amazon.com> * Fix SQL IT correctness Signed-off-by: Songkan Tang <songkant@amazon.com> * Remove test log Signed-off-by: Songkan Tang <songkant@amazon.com> * Minor improve one CalciteLikeQueryIT Signed-off-by: Songkan Tang <songkant@amazon.com> --------- Signed-off-by: Songkan Tang <songkant@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Update commons-lang exclude rule to exclude it everywhere (opensearch-project#3932) * Update commons-lang exclude rule to exclude it everywhere Signed-off-by: Simeon Widdis <sawiddis@amazon.com> * Undo removal in core Signed-off-by: Simeon Widdis <sawiddis@amazon.com> --------- Signed-off-by: Simeon Widdis <sawiddis@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Adding wildcard support to fields command in Calcite Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Mixed delimiter support - Support both space and comma delimiters in the same command for table and fields Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Adding widlcard support to non-Calcite engine and updating documentation with new features Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Fixing formatting issues Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Support function argument coercion with Calcite (opensearch-project#3914) * Change the use of SqlTypeFamily.STRING to SqlTypeFamily.CHARACTER as the string family contains binary, which is not expected for most functions Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Implement basic argument type coercion at RelNode level Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Conform type checkers with their definition in documentation - string as an input is removed if it is not in the document - string as an input is kept if it is in the document, even if it can be implicitly cast - use PPLOperandTypes as much as possible Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Implement type widening for comparator functions - Add COMPARATORS set to BuiltinFunctionName for identifying comparison operators - Implement widenArguments method in CoercionUtils to find widest compatible type - Apply type widening to comparator functions before applying type casting - Add detailed JavaDoc to explain coercion methods Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Update error messages of datetime functions with invalid args Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Simplify datetime-string compare logic with implict coercion Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Refactor resolve with coercion Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Move down argument cast for reduce function Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Merge comparators and their IP variants so that coercion works for IP comparison - when not merging, ip comparing will also pass the type checker of Calcite's comparators Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Refactor ip comparator to comparator Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Revert "Refactor ip comparator to comparator" This reverts commit c539056. Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Revert "Merge comparators and their IP variants so that coercion works for IP comparison" This reverts commit bd9f3bb. Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Rule out ip from built-in comparator via its type checker Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Restrict CompareIP's parameter type Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Revert to previous implementation of CompareIpFunction to temporarily fix ip comparison pushdown problems (udt not correctly serialized; ip comparison is not converted to range query) Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Test argument coercion explain Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Fix error msg in CalcitePPLFunctionTypeTest Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> --------- Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Add missing command in index.rst (opensearch-project#3943) Signed-off-by: Peng Huo <penghuo@gmail.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Append limit operator for QUEERY_SIZE_LIMIT (opensearch-project#3940) * Append limit operator for QUEERY_SIZE_LIMIT Signed-off-by: Heng Qian <qianheng@amazon.com> * Add LogicalSystemLimit Signed-off-by: Heng Qian <qianheng@amazon.com> * Revert part of opensearch-project#3880 Signed-off-by: Heng Qian <qianheng@amazon.com> * Fix IT after merging main Signed-off-by: Heng Qian <qianheng@amazon.com> --------- Signed-off-by: Heng Qian <qianheng@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Performing code cleaning and fixing tests Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Performing code maintenance and adding more test cases Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Doing some code cleaning and maintenance Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Fixing code and implementation logic Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Add issue template specific for PPL commands and queries (opensearch-project#3962) * Add issue template specific for PPL commands and queries Signed-off-by: Anas Alkouz <aalkouz@amazon.com> * Add section for Dataset/schema information, add reminders for the customers to remove any sensitive datas Signed-off-by: Anas Alkouz <aalkouz@amazon.com> --------- Signed-off-by: Anas Alkouz <aalkouz@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Increase the precision of sum return type (opensearch-project#3974) Signed-off-by: Heng Qian <qianheng@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Disable a failed PPL query fallback to v2 by default (opensearch-project#3952) * Disable a failed PPL query fallback to v2 by default Signed-off-by: Lantao Jin <ltjin@amazon.com> * Workaround the permissionIT Signed-off-by: Lantao Jin <ltjin@amazon.com> --------- Signed-off-by: Lantao Jin <ltjin@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Update the maven snapshot publish endpoint and credential (opensearch-project#3806) Co-authored-by: Sayali Gaikawad <gaiksaya@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Add release notes for 3.2.0 (opensearch-project#3985) Signed-off-by: opensearch-ci <opensearch-infra@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Fixing documentation Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Taking care of comments left by Tomo Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Adding full wildcard support functionality Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Increment version to 3.2.0-SNAPSHOT (opensearch-project#3819) Signed-off-by: opensearch-ci-bot <opensearch-infra@amazon.com> Co-authored-by: opensearch-ci-bot <opensearch-infra@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Support `reverse` command with Calcite (opensearch-project#3867) * Implement reverse Signed-off-by: Selina Song <selsong@amazon.com> * Add reverse integ tests and unit tests Signed-off-by: Selina Song <selsong@amazon.com> * Add reverse documentation Signed-off-by: Selina Song <selsong@amazon.com> * Modify reverse test and documentation Signed-off-by: Selina Song <selsong@amazon.com> * Fix limit pushdown bug when reverse comes before head * Revert "Fix limit pushdown bug when reverse comes before head" This reverts commit 087c936. Signed-off-by: Selina Song <selsong@amazon.com> * Fix grammar, naming, and test cases. Pushdown reverted will be in 2nd PR. Signed-off-by: Selina Song <selsong@amazon.com> * Fix reverse tests: update logical plans, format with Spotless - Updated expected logical plans and Spark SQL in reverse tests - Applied Spotless to fix formatting Signed-off-by: Selina Song <selsong@amazon.com> * Fix OS version in build 3.1.0 Signed-off-by: Selina Song <selsong@amazon.com> * Add note on limitation to rst Signed-off-by: Selina Song <selsong@amazon.com> * Move explain IT to correct file, add Anonymizer test Signed-off-by: Selina Song <selsong@amazon.com> * Add reverse to index.rst Signed-off-by: Selina Song <selsong@amazon.com> --------- Signed-off-by: Selina Song <selsong@amazon.com> Co-authored-by: Selina Song <selsong@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Pass JOIN_TIME_OUT value to keepalive (opensearch-project#3826) * Fix JOIN_TIME_OUT Signed-off-by: Kai Huang <ahkcs@amazon.com> * fix style Signed-off-by: Kai Huang <ahkcs@amazon.com> * fix Signed-off-by: Kai Huang <ahkcs@amazon.com> * fix CI Signed-off-by: Kai Huang <ahkcs@amazon.com> * fix Signed-off-by: Kai Huang <ahkcs@amazon.com> * fixes Signed-off-by: Kai Huang <ahkcs@amazon.com> * fixes Signed-off-by: Kai Huang <ahkcs@amazon.com> * fix log-rethrow Signed-off-by: Kai Huang <ahkcs@amazon.com> * Restructure Signed-off-by: Kai Huang <ahkcs@amazon.com> * fix CI Signed-off-by: Kai Huang <ahkcs@amazon.com> * fix format Signed-off-by: Kai Huang <ahkcs@amazon.com> * remove unused PIT Signed-off-by: Kai Huang <ahkcs@amazon.com> * remove reflection, add hintConfig Signed-off-by: Kai Huang <ahkcs@amazon.com> * Added Unit test, restructured to use existing methods Signed-off-by: Kai Huang <ahkcs@amazon.com> * fixes Signed-off-by: Kai Huang <ahkcs@amazon.com> * fix Signed-off-by: Kai Huang <ahkcs@amazon.com> * fixes Signed-off-by: Kai Huang <ahkcs@amazon.com> * add IT tests Signed-off-by: Kai Huang <ahkcs@amazon.com> * formatting Signed-off-by: Kai Huang <ahkcs@amazon.com> * Trim IT Signed-off-by: Kai Huang <ahkcs@amazon.com> * format fix Signed-off-by: Kai Huang <ahkcs@amazon.com> * trim IT Signed-off-by: Kai Huang <ahkcs@amazon.com> * formatting Signed-off-by: Kai Huang <ahkcs@amazon.com> * Update legacy/src/main/java/org/opensearch/sql/legacy/query/planner/physical/node/pointInTime/PointInTime.java Co-authored-by: Louis Chu <lingzhichu.clz@gmail.com> Signed-off-by: Kai Huang <105710027+ahkcs@users.noreply.github.com> * fix Signed-off-by: Kai Huang <ahkcs@amazon.com> * update .gitignore Signed-off-by: Kai Huang <ahkcs@amazon.com> * deletion Signed-off-by: Kai Huang <ahkcs@amazon.com> * restore main PIT Signed-off-by: Kai Huang <ahkcs@amazon.com> --------- Signed-off-by: Kai Huang <ahkcs@amazon.com> Signed-off-by: Kai Huang <105710027+ahkcs@users.noreply.github.com> Co-authored-by: Louis Chu <lingzhichu.clz@gmail.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Changed seenFields to Hashset instead of LinkedHashSet Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Creating a rule only for the fields/table commands to avoid any interference Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * This commit is in response of PR comments left by Tomo and Chen Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Fixing Integration test failure Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Adding anonymizer tests, wildcard unit tests, etc Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Disabling Calcite for enhance fields features Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Disabling automatic de-deduplication when Calcite is disabled Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Adding cross-cluster IT test Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Adding a dedicated Cross-cluster IT test file for Calcite Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Fixing formatting issues Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Improving widlcard logic and exception message Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Addressing comments left by Tomo regarding wildcard logic implementation Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Empty commit Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Add missing udfs in v3 (opensearch-project#3957) * add math udfs Signed-off-by: Xinyu Hao <haoxinyu@amazon.com> * fix decimal bug Signed-off-by: Xinyu Hao <haoxinyu@amazon.com> * make general udf adapter Signed-off-by: Xinyu Hao <haoxinyu@amazon.com> * add math IT Signed-off-by: Xinyu Hao <haoxinyu@amazon.com> * fix Signed-off-by: Xinyu Hao <haoxinyu@amazon.com> * add rst Signed-off-by: Xinyu Hao <haoxinyu@amazon.com> * fix error Signed-off-by: Xinyu Hao <haoxinyu@amazon.com> * change signum IT Signed-off-by: Xinyu Hao <haoxinyu@amazon.com> * add javadoc Signed-off-by: Xinyu Hao <haoxinyu@amazon.com> --------- Signed-off-by: Xinyu Hao <haoxinyu@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * fix snapshot uploading (opensearch-project#4006) * fix snapshot uploading Signed-off-by: Kai Huang <ahkcs@amazon.com> * Add comment Signed-off-by: Kai Huang <ahkcs@amazon.com> --------- Signed-off-by: Kai Huang <ahkcs@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Fix DOUBLE to STRING cast rendering zero values in scientific notation (opensearch-project#3982) * Fix casting double 0.0 to string Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Fix float to string casting precision lost with custom FormatNumberFunction This commit fixes float to string casting by replacing the use of SqlLibraryOperators.FORMAT_NUMBER with a custom FormatNumberFunction implementation. The new implementation converts the number to a BigDecimal before formatting to preserve precision and avoid issues like 6.2 becoming 6.199999809265137. Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Simplify the implementation of fp number to string cast Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Update implementation of NumberToStringFunction Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Cast decimal with NUMBER_TO_STRING function Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Test cast decimal Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> --------- Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Eliminate reliance on assert in Calcite for integration test (opensearch-project#4016) * Move num-of-column check of in subquery ahead from RexSubQuery.java#L78 because assert is disabled in production Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Increase script.context.filter.max_compilations_rate for SQLCorrectnessIT Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Check script.disable_max_compilations_rate before setting context-specific compilations rate Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Refactor: remove some methods in tests to upper level to reduce duplication Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Replace plugin-level setting strings with private test-specific ones Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> --------- Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Prevent aggregation push down when it has inner filter (opensearch-project#4002) * Prevent aggregation push down when it has inner filter Signed-off-by: Heng Qian <qianheng@amazon.com> * Fix IT & Remove log Signed-off-by: Heng Qian <qianheng@amazon.com> * Fix 4009 Signed-off-by: Heng Qian <qianheng@amazon.com> * Fix IT Signed-off-by: Heng Qian <qianheng@amazon.com> --------- Signed-off-by: Heng Qian <qianheng@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Fix span on negative timestamp (opensearch-project#4017) * Fix span on negative timestamp Signed-off-by: Heng Qian <qianheng@amazon.com> * Fix span on negative timestamp Signed-off-by: Heng Qian <qianheng@amazon.com> * typo Signed-off-by: Heng Qian <qianheng@amazon.com> * Refine code Signed-off-by: Heng Qian <qianheng@amazon.com> --------- Signed-off-by: Heng Qian <qianheng@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Skip script encoding when run explain with 'extended' (opensearch-project#3930) * No need to decode script when run explain command Signed-off-by: Lantao Jin <ltjin@amazon.com> * address comment Signed-off-by: Lantao Jin <ltjin@amazon.com> * Do not encoding when explain format is 'extended' Signed-off-by: Lantao Jin <ltjin@amazon.com> * Rename the thread local var Signed-off-by: Lantao Jin <ltjin@amazon.com> * Fix IT after merge main Signed-off-by: Lantao Jin <ltjin@amazon.com> --------- Signed-off-by: Lantao Jin <ltjin@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Implement type checking for aggregation functions with Calcite (opensearch-project#4024) * Remove getTypeChecker from FunctionImp interface Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Refactor registerExternalFunction to registerExternalOperator Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Do not register GEOIP function if got incompatible client Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Create scaffold for type checking of aggregation functions Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Add type checkers for aggregation functions Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Test type checking for aggregation functions Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> --------- Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Allow equal expression as a function argument (opensearch-project#4001) * Remove named function arg from functions other than table functions Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Test eval if function with equal as condition Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> --------- Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Push down IP comparison as range query with Calcite (opensearch-project#3959) * Add reverse op for compare ip to support pushdown Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Pushdown ip comparison Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Refactor CompareIpFunction to use SqlKind directly Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> * Simplify the overriding of reverse() for IP comparators Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> --------- Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * eval sum, avg implementation (opensearch-project#3986) Signed-off-by: Vamsi Manohar <reddyvam@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Fix PPL eval command string concatenation with + operator (opensearch-project#4020) * eval command support Signed-off-by: Kai Huang <ahkcs@amazon.com> * improvment Signed-off-by: Kai Huang <ahkcs@amazon.com> * Refactor Signed-off-by: Kai Huang <ahkcs@amazon.com> * fix CI Signed-off-by: Kai Huang <ahkcs@amazon.com> * fix CI Signed-off-by: Kai Huang <ahkcs@amazon.com> * fix CI Signed-off-by: Kai Huang <ahkcs@amazon.com> * fixes Signed-off-by: Kai Huang <ahkcs@amazon.com> * fix Signed-off-by: Kai Huang <ahkcs@amazon.com> * Add IT Signed-off-by: Kai Huang <ahkcs@amazon.com> * remove redundant tests Signed-off-by: Kai Huang <ahkcs@amazon.com> --------- Signed-off-by: Kai Huang <ahkcs@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Support script push down on text field (opensearch-project#4010) * Support script push down on text field Signed-off-by: Heng Qian <qianheng@amazon.com> * Fix IT Signed-off-by: Heng Qian <qianheng@amazon.com> * Add UT for struct type push down Signed-off-by: Heng Qian <qianheng@amazon.com> --------- Signed-off-by: Heng Qian <qianheng@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Enhance sort command in PPL (opensearch-project#3934) * enhance sort command Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * update failing tests Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * fix formatting Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * add integ tests Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * update documentation Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * fix failing test Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * update default and tests Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * fix tests Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * update analyzer test Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * update reverse sort direction Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * update formatting Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * update docs Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * add javadoc Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * add tests Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * fix failing tests Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * fix failing tests Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * update integ tests for query size limit change Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * add explainit for desc and type cast Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * add tests for desc Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * fix formatting Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * make count optional Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * add cross cluster tests Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * fix tests Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * normalize count in AST node Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * default null count to 0 Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> * update logicalsort default constructor Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> --------- Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Add example for String concat in eval.rst (opensearch-project#4075) * Add example for String concat in eval.rst Signed-off-by: Kai Huang <ahkcs@amazon.com> * mention calcite enabling Signed-off-by: Kai Huang <ahkcs@amazon.com> --------- Signed-off-by: Kai Huang <ahkcs@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Support pushdown dedup with Calcite (opensearch-project#3972) * Support pushdown dedup with Calcite Signed-off-by: Lantao Jin <ltjin@amazon.com> * Fix IT Signed-off-by: Lantao Jin <ltjin@amazon.com> * Address comments Signed-off-by: Lantao Jin <ltjin@amazon.com> * Fix flaky test Signed-off-by: Lantao Jin <ltjin@amazon.com> * Address comment Signed-off-by: Lantao Jin <ltjin@amazon.com> * delete useless codes Signed-off-by: Lantao Jin <ltjin@amazon.com> * Add more ITs Signed-off-by: Lantao Jin <ltjin@amazon.com> --------- Signed-off-by: Lantao Jin <ltjin@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Fix CI failure because of plan having changed (opensearch-project#4077) Signed-off-by: Heng Qian <qianheng@amazon.com> Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Empty commit Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Empty commit Signed-off-by: Aaron Alvarez <aaarone@amazon.com> --------- Signed-off-by: Aaron Alvarez <aaarone@amazon.com> Signed-off-by: Lantao Jin <ltjin@amazon.com> Signed-off-by: Vamsi Manohar <reddyvam@amazon.com> Signed-off-by: Songkan Tang <songkant@amazon.com> Signed-off-by: Simeon Widdis <sawiddis@amazon.com> Signed-off-by: Yuanchun Shen <yuanchu@amazon.com> Signed-off-by: Peng Huo <penghuo@gmail.com> Signed-off-by: Heng Qian <qianheng@amazon.com> Signed-off-by: Anas Alkouz <aalkouz@amazon.com> Signed-off-by: opensearch-ci <opensearch-infra@amazon.com> Signed-off-by: opensearch-ci-bot <opensearch-infra@amazon.com> Signed-off-by: Selina Song <selsong@amazon.com> Signed-off-by: Kai Huang <ahkcs@amazon.com> Signed-off-by: Kai Huang <105710027+ahkcs@users.noreply.github.com> Signed-off-by: Xinyu Hao <haoxinyu@amazon.com> Signed-off-by: Ritvi Bhatt <ribhatt@amazon.com> Signed-off-by: Aaron Alvarez <900908alvarezaaron@gmail.com> Co-authored-by: Aaron Alvarez <aaarone@amazon.com> Co-authored-by: Lantao Jin <ltjin@amazon.com> Co-authored-by: Vamsi Manohar <reddyvam@amazon.com> Co-authored-by: Songkan Tang <songkant@amazon.com> Co-authored-by: Simeon Widdis <sawiddis@gmail.com> Co-authored-by: Yuanchun Shen <yuanchu@amazon.com> Co-authored-by: Peng Huo <penghuo@gmail.com> Co-authored-by: qianheng <qianheng@amazon.com> Co-authored-by: Anas Alkouz <aalkouz@amazon.com> Co-authored-by: Zelin Hao <zelinhao@amazon.com> Co-authored-by: Sayali Gaikawad <gaiksaya@amazon.com> Co-authored-by: opensearch-ci <83309141+opensearch-ci-bot@users.noreply.github.com> Co-authored-by: opensearch-trigger-bot[bot] <98922864+opensearch-trigger-bot[bot]@users.noreply.github.com> Co-authored-by: opensearch-ci-bot <opensearch-infra@amazon.com> Co-authored-by: Selina Song <selinasong6@gmail.com> Co-authored-by: Selina Song <selsong@amazon.com> Co-authored-by: Kai Huang <105710027+ahkcs@users.noreply.github.com> Co-authored-by: Louis Chu <lingzhichu.clz@gmail.com> Co-authored-by: Xinyu Hao <75524174+ishaoxy@users.noreply.github.com> Co-authored-by: ritvibhatt <53196324+ritvibhatt@users.noreply.github.com>
1 parent 0aac72f commit f16f1c0

18 files changed

Lines changed: 2304 additions & 115 deletions

File tree

core/src/main/java/org/opensearch/sql/analysis/Analyzer.java

Lines changed: 91 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.List;
3232
import java.util.Objects;
3333
import java.util.Optional;
34+
import java.util.Set;
3435
import java.util.stream.Collectors;
3536
import java.util.stream.Stream;
3637
import org.apache.commons.lang3.tuple.ImmutablePair;
@@ -284,13 +285,6 @@ public LogicalPlan visitFilter(Filter node, AnalysisContext context) {
284285
return new LogicalFilter(child, optimized);
285286
}
286287

287-
/**
288-
* Ensure NESTED function is not used in GROUP BY, and HAVING clauses. Fallback to legacy engine.
289-
* Can remove when support is added for NESTED function in WHERE, GROUP BY, ORDER BY, and HAVING
290-
* clauses.
291-
*
292-
* @param condition : Filter condition
293-
*/
294288
private void verifySupportsCondition(Expression condition) {
295289
if (condition instanceof FunctionExpression) {
296290
if (((FunctionExpression) condition)
@@ -386,53 +380,106 @@ public LogicalPlan visitRareTopN(RareTopN node, AnalysisContext context) {
386380
public LogicalPlan visitProject(Project node, AnalysisContext context) {
387381
LogicalPlan child = node.getChild().get(0).accept(this, context);
388382

389-
if (node.hasArgument()) {
390-
Argument argument = node.getArgExprList().get(0);
391-
Boolean exclude = (Boolean) argument.getValue().getValue();
392-
if (exclude) {
393-
TypeEnvironment curEnv = context.peek();
394-
List<ReferenceExpression> referenceExpressions =
395-
node.getProjectList().stream()
396-
.map(expr -> (ReferenceExpression) expressionAnalyzer.analyze(expr, context))
397-
.collect(Collectors.toList());
398-
referenceExpressions.forEach(ref -> curEnv.remove(ref));
399-
return new LogicalRemove(child, ImmutableSet.copyOf(referenceExpressions));
400-
}
401-
}
402-
403-
// For each unresolved window function, analyze it by "insert" a window and sort operator
404-
// between project and its child.
405-
for (UnresolvedExpression expr : node.getProjectList()) {
406-
WindowExpressionAnalyzer windowAnalyzer =
407-
new WindowExpressionAnalyzer(expressionAnalyzer, child);
408-
child = windowAnalyzer.analyze(expr, context);
383+
if (isExcludeMode(node)) {
384+
return buildLogicalRemove(node, child, context);
409385
}
410386

411-
for (UnresolvedExpression expr : node.getProjectList()) {
412-
HighlightAnalyzer highlightAnalyzer = new HighlightAnalyzer(expressionAnalyzer, child);
413-
child = highlightAnalyzer.analyze(expr, context);
414-
}
387+
child = processWindowExpressions(node.getProjectList(), child, context);
388+
child = processHighlightExpressions(node.getProjectList(), child, context);
415389

416390
List<NamedExpression> namedExpressions =
417-
selectExpressionAnalyzer.analyze(
418-
node.getProjectList(),
419-
context,
420-
new ExpressionReferenceOptimizer(expressionAnalyzer.getRepository(), child));
421-
422-
for (UnresolvedExpression expr : node.getProjectList()) {
423-
NestedAnalyzer nestedAnalyzer =
424-
new NestedAnalyzer(namedExpressions, expressionAnalyzer, child);
425-
child = nestedAnalyzer.analyze(expr, context);
426-
}
391+
resolveFieldExpressions(node.getProjectList(), child, context);
392+
393+
child = processNestedAnalysis(node.getProjectList(), namedExpressions, child, context);
427394

428-
// new context
429395
context.push();
430396
TypeEnvironment newEnv = context.peek();
431397
namedExpressions.forEach(
432398
expr ->
433399
newEnv.define(new Symbol(Namespace.FIELD_NAME, expr.getNameOrAlias()), expr.type()));
434-
List<NamedExpression> namedParseExpressions = context.getNamedParseExpressions();
435-
return new LogicalProject(child, namedExpressions, namedParseExpressions);
400+
401+
return new LogicalProject(child, namedExpressions, context.getNamedParseExpressions());
402+
}
403+
404+
private boolean isExcludeMode(Project node) {
405+
if (!node.hasArgument()) {
406+
return false;
407+
}
408+
try {
409+
Argument argument = node.getArgExprList().get(0);
410+
Object value = argument.getValue().getValue();
411+
return Boolean.TRUE.equals(value);
412+
} catch (IndexOutOfBoundsException | NullPointerException e) {
413+
return false;
414+
}
415+
}
416+
417+
private LogicalRemove buildLogicalRemove(
418+
Project node, LogicalPlan child, AnalysisContext context) {
419+
TypeEnvironment curEnv = context.peek();
420+
List<ReferenceExpression> referenceExpressions =
421+
collectExclusionFields(node.getProjectList(), context);
422+
423+
Set<String> allFields = curEnv.lookupAllFields(Namespace.FIELD_NAME).keySet();
424+
Set<String> fieldsToExclude =
425+
referenceExpressions.stream().map(ReferenceExpression::getAttr).collect(Collectors.toSet());
426+
427+
if (allFields.equals(fieldsToExclude)) {
428+
throw new IllegalArgumentException(
429+
"Invalid field exclusion: operation would exclude all fields from the result set");
430+
}
431+
432+
referenceExpressions.forEach(curEnv::remove);
433+
return new LogicalRemove(child, ImmutableSet.copyOf(referenceExpressions));
434+
}
435+
436+
private LogicalPlan processWindowExpressions(
437+
List<UnresolvedExpression> projectList, LogicalPlan child, AnalysisContext context) {
438+
for (UnresolvedExpression expr : projectList) {
439+
child = new WindowExpressionAnalyzer(expressionAnalyzer, child).analyze(expr, context);
440+
}
441+
return child;
442+
}
443+
444+
private LogicalPlan processHighlightExpressions(
445+
List<UnresolvedExpression> projectList, LogicalPlan child, AnalysisContext context) {
446+
for (UnresolvedExpression expr : projectList) {
447+
child = new HighlightAnalyzer(expressionAnalyzer, child).analyze(expr, context);
448+
}
449+
return child;
450+
}
451+
452+
private List<NamedExpression> resolveFieldExpressions(
453+
List<UnresolvedExpression> projectList, LogicalPlan child, AnalysisContext context) {
454+
return selectExpressionAnalyzer.analyze(
455+
projectList,
456+
context,
457+
new ExpressionReferenceOptimizer(expressionAnalyzer.getRepository(), child));
458+
}
459+
460+
private LogicalPlan processNestedAnalysis(
461+
List<UnresolvedExpression> projectList,
462+
List<NamedExpression> namedExpressions,
463+
LogicalPlan child,
464+
AnalysisContext context) {
465+
for (UnresolvedExpression expr : projectList) {
466+
child =
467+
new NestedAnalyzer(namedExpressions, expressionAnalyzer, child).analyze(expr, context);
468+
}
469+
return child;
470+
}
471+
472+
private List<ReferenceExpression> collectExclusionFields(
473+
List<UnresolvedExpression> projectList, AnalysisContext context) {
474+
List<NamedExpression> namedExpressions =
475+
projectList.stream()
476+
.map(expr -> expressionAnalyzer.analyze(expr, context))
477+
.map(DSL::named)
478+
.collect(Collectors.toList());
479+
480+
return namedExpressions.stream()
481+
.map(field -> (ReferenceExpression) field.getDelegated())
482+
.collect(Collectors.toList());
436483
}
437484

438485
/** Build {@link LogicalEval}. */
@@ -746,10 +793,6 @@ private LogicalSort buildSort(
746793
return new LogicalSort(child, count, sortList);
747794
}
748795

749-
/**
750-
* The first argument is always "asc", others are optional. Given nullFirst argument, use its
751-
* value. Otherwise just use DEFAULT_ASC/DESC.
752-
*/
753796
private SortOption analyzeSortOption(List<Argument> fieldArgs) {
754797
Boolean asc = (Boolean) fieldArgs.get(0).getValue().getValue();
755798
Optional<Argument> nullFirst =

core/src/main/java/org/opensearch/sql/calcite/CalciteRelNodeVisitor.java

Lines changed: 103 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@
112112
import org.opensearch.sql.calcite.utils.JoinAndLookupUtils;
113113
import org.opensearch.sql.calcite.utils.PlanUtils;
114114
import org.opensearch.sql.calcite.utils.UserDefinedFunctionUtils;
115+
import org.opensearch.sql.calcite.utils.WildcardUtils;
115116
import org.opensearch.sql.common.patterns.PatternUtils;
116117
import org.opensearch.sql.common.utils.StringUtils;
117118
import org.opensearch.sql.exception.CalciteUnsupportedException;
@@ -191,30 +192,118 @@ private boolean containsSubqueryExpression(Node expr) {
191192
@Override
192193
public RelNode visitProject(Project node, CalcitePlanContext context) {
193194
visitChildren(node, context);
194-
List<RexNode> projectList;
195-
if (node.getProjectList().size() == 1
196-
&& node.getProjectList().getFirst() instanceof AllFields allFields) {
197-
tryToRemoveNestedFields(context);
198-
tryToRemoveMetaFields(context, allFields instanceof AllFieldsExcludeMeta);
199-
return context.relBuilder.peek();
200-
} else {
201-
projectList =
202-
node.getProjectList().stream()
203-
.map(expr -> rexVisitor.analyze(expr, context))
204-
.collect(Collectors.toList());
195+
196+
if (isSingleAllFieldsProject(node)) {
197+
return handleAllFieldsProject(node, context);
205198
}
199+
200+
List<String> currentFields = context.relBuilder.peek().getRowType().getFieldNames();
201+
List<RexNode> expandedFields =
202+
expandProjectFields(node.getProjectList(), currentFields, context);
203+
206204
if (node.isExcluded()) {
207-
context.relBuilder.projectExcept(projectList);
205+
validateExclusion(expandedFields, currentFields);
206+
context.relBuilder.projectExcept(expandedFields);
208207
} else {
209-
// Only set when not resolving subquery and it's not projectExcept.
210208
if (!context.isResolvingSubquery()) {
211209
context.setProjectVisited(true);
212210
}
213-
context.relBuilder.project(projectList);
211+
context.relBuilder.project(expandedFields);
212+
}
213+
return context.relBuilder.peek();
214+
}
215+
216+
private boolean isSingleAllFieldsProject(Project node) {
217+
return node.getProjectList().size() == 1
218+
&& node.getProjectList().getFirst() instanceof AllFields;
219+
}
220+
221+
private RelNode handleAllFieldsProject(Project node, CalcitePlanContext context) {
222+
if (node.isExcluded()) {
223+
throw new IllegalArgumentException(
224+
"Invalid field exclusion: operation would exclude all fields from the result set");
214225
}
226+
AllFields allFields = (AllFields) node.getProjectList().getFirst();
227+
tryToRemoveNestedFields(context);
228+
tryToRemoveMetaFields(context, allFields instanceof AllFieldsExcludeMeta);
215229
return context.relBuilder.peek();
216230
}
217231

232+
private List<RexNode> expandProjectFields(
233+
List<UnresolvedExpression> projectList,
234+
List<String> currentFields,
235+
CalcitePlanContext context) {
236+
List<RexNode> expandedFields = new ArrayList<>();
237+
Set<String> addedFields = new HashSet<>();
238+
239+
for (UnresolvedExpression expr : projectList) {
240+
switch (expr) {
241+
case Field field -> {
242+
String fieldName = field.getField().toString();
243+
if (WildcardUtils.containsWildcard(fieldName)) {
244+
List<String> matchingFields =
245+
WildcardUtils.expandWildcardPattern(fieldName, currentFields).stream()
246+
.filter(f -> !isMetadataField(f))
247+
.filter(addedFields::add)
248+
.toList();
249+
if (matchingFields.isEmpty()) {
250+
continue;
251+
}
252+
matchingFields.forEach(f -> expandedFields.add(context.relBuilder.field(f)));
253+
} else if (addedFields.add(fieldName)) {
254+
expandedFields.add(rexVisitor.analyze(field, context));
255+
}
256+
}
257+
case AllFields ignored -> {
258+
currentFields.stream()
259+
.filter(field -> !isMetadataField(field))
260+
.filter(addedFields::add)
261+
.forEach(field -> expandedFields.add(context.relBuilder.field(field)));
262+
}
263+
default -> throw new IllegalStateException(
264+
"Unexpected expression type in project list: " + expr.getClass().getSimpleName());
265+
}
266+
}
267+
268+
if (expandedFields.isEmpty()) {
269+
validateWildcardPatterns(projectList, currentFields);
270+
}
271+
272+
return expandedFields;
273+
}
274+
275+
private void validateExclusion(List<RexNode> fieldsToExclude, List<String> currentFields) {
276+
Set<String> nonMetaFields =
277+
currentFields.stream().filter(field -> !isMetadataField(field)).collect(Collectors.toSet());
278+
279+
if (fieldsToExclude.size() >= nonMetaFields.size()) {
280+
throw new IllegalArgumentException(
281+
"Invalid field exclusion: operation would exclude all fields from the result set");
282+
}
283+
}
284+
285+
private void validateWildcardPatterns(
286+
List<UnresolvedExpression> projectList, List<String> currentFields) {
287+
String firstWildcardPattern =
288+
projectList.stream()
289+
.filter(
290+
expr ->
291+
expr instanceof Field field
292+
&& WildcardUtils.containsWildcard(field.getField().toString()))
293+
.map(expr -> ((Field) expr).getField().toString())
294+
.findFirst()
295+
.orElse(null);
296+
297+
if (firstWildcardPattern != null) {
298+
throw new IllegalArgumentException(
299+
String.format("wildcard pattern [%s] matches no fields", firstWildcardPattern));
300+
}
301+
}
302+
303+
private boolean isMetadataField(String fieldName) {
304+
return OpenSearchConstants.METADATAFIELD_TYPE_MAP.containsKey(fieldName);
305+
}
306+
218307
/** See logic in {@link org.opensearch.sql.analysis.symbol.SymbolTable#lookupAllFields} */
219308
private static void tryToRemoveNestedFields(CalcitePlanContext context) {
220309
Set<String> allFields = new HashSet<>(context.relBuilder.peek().getRowType().getFieldNames());
@@ -499,7 +588,6 @@ public RelNode visitPatterns(Patterns node, CalcitePlanContext context) {
499588
@Override
500589
public RelNode visitEval(Eval node, CalcitePlanContext context) {
501590
visitChildren(node, context);
502-
List<String> originalFieldNames = context.relBuilder.peek().getRowType().getFieldNames();
503591
node.getExpressionList()
504592
.forEach(
505593
expr -> {

0 commit comments

Comments
 (0)