Skip to content

Commit d2caa6f

Browse files
aalva500-progaaarone90LantaoJinvamsimanoharsongkant-aws
authored
[Backport 2.19-dev] fields Command Enhancement - Advanced Field Selection Features (Cal… (opensearch-project#4102)
* `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> (cherry picked from commit f16f1c0) * Fixing compatibility issues Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * Fixing JDK compatibility issues Signed-off-by: Aaron Alvarez <aaarone@amazon.com> * fixing java 11 compatibility issues 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 8e0cb53 commit d2caa6f

18 files changed

Lines changed: 2303 additions & 116 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;
@@ -285,13 +286,6 @@ public LogicalPlan visitFilter(Filter node, AnalysisContext context) {
285286
return new LogicalFilter(child, optimized);
286287
}
287288

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

390-
if (node.hasArgument()) {
391-
Argument argument = node.getArgExprList().get(0);
392-
Boolean exclude = (Boolean) argument.getValue().getValue();
393-
if (exclude) {
394-
TypeEnvironment curEnv = context.peek();
395-
List<ReferenceExpression> referenceExpressions =
396-
node.getProjectList().stream()
397-
.map(expr -> (ReferenceExpression) expressionAnalyzer.analyze(expr, context))
398-
.collect(Collectors.toList());
399-
referenceExpressions.forEach(ref -> curEnv.remove(ref));
400-
return new LogicalRemove(child, ImmutableSet.copyOf(referenceExpressions));
401-
}
384+
if (isExcludeMode(node)) {
385+
return buildLogicalRemove(node, child, context);
402386
}
403387

404-
// For each unresolved window function, analyze it by "insert" a window and sort operator
405-
// between project and its child.
406-
for (UnresolvedExpression expr : node.getProjectList()) {
407-
WindowExpressionAnalyzer windowAnalyzer =
408-
new WindowExpressionAnalyzer(expressionAnalyzer, child);
409-
child = windowAnalyzer.analyze(expr, context);
410-
}
411-
412-
for (UnresolvedExpression expr : node.getProjectList()) {
413-
HighlightAnalyzer highlightAnalyzer = new HighlightAnalyzer(expressionAnalyzer, child);
414-
child = highlightAnalyzer.analyze(expr, context);
415-
}
388+
child = processWindowExpressions(node.getProjectList(), child, context);
389+
child = processHighlightExpressions(node.getProjectList(), child, context);
416390

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

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

439486
/** Build {@link LogicalEval}. */
@@ -745,10 +792,6 @@ private LogicalSort buildSort(
745792
return new LogicalSort(child, count, sortList);
746793
}
747794

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

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

Lines changed: 101 additions & 16 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;
@@ -192,31 +193,116 @@ private boolean containsSubqueryExpression(Node expr) {
192193
@Override
193194
public RelNode visitProject(Project node, CalcitePlanContext context) {
194195
visitChildren(node, context);
195-
List<RexNode> projectList;
196-
if (node.getProjectList().size() == 1
197-
&& node.getProjectList().get(0) instanceof AllFields) {
198-
AllFields allFields = (AllFields) node.getProjectList().get(0);
199-
tryToRemoveNestedFields(context);
200-
tryToRemoveMetaFields(context, allFields instanceof AllFieldsExcludeMeta);
201-
return context.relBuilder.peek();
202-
} else {
203-
projectList =
204-
node.getProjectList().stream()
205-
.map(expr -> rexVisitor.analyze(expr, context))
206-
.collect(Collectors.toList());
196+
197+
if (isSingleAllFieldsProject(node)) {
198+
return handleAllFieldsProject(node, context);
207199
}
200+
201+
List<String> currentFields = context.relBuilder.peek().getRowType().getFieldNames();
202+
List<RexNode> expandedFields =
203+
expandProjectFields(node.getProjectList(), currentFields, context);
204+
208205
if (node.isExcluded()) {
209-
context.relBuilder.projectExcept(projectList);
206+
validateExclusion(expandedFields, currentFields);
207+
context.relBuilder.projectExcept(expandedFields);
210208
} else {
211-
// Only set when not resolving subquery and it's not projectExcept.
212209
if (!context.isResolvingSubquery()) {
213210
context.setProjectVisited(true);
214211
}
215-
context.relBuilder.project(projectList);
212+
context.relBuilder.project(expandedFields);
213+
}
214+
return context.relBuilder.peek();
215+
}
216+
217+
private boolean isSingleAllFieldsProject(Project node) {
218+
return node.getProjectList().size() == 1
219+
&& node.getProjectList().get(0) instanceof AllFields;
220+
}
221+
222+
private RelNode handleAllFieldsProject(Project node, CalcitePlanContext context) {
223+
if (node.isExcluded()) {
224+
throw new IllegalArgumentException(
225+
"Invalid field exclusion: operation would exclude all fields from the result set");
216226
}
227+
AllFields allFields = (AllFields) node.getProjectList().get(0);
228+
tryToRemoveNestedFields(context);
229+
tryToRemoveMetaFields(context, allFields instanceof AllFieldsExcludeMeta);
217230
return context.relBuilder.peek();
218231
}
219232

233+
private List<RexNode> expandProjectFields(
234+
List<UnresolvedExpression> projectList,
235+
List<String> currentFields,
236+
CalcitePlanContext context) {
237+
List<RexNode> expandedFields = new ArrayList<>();
238+
Set<String> addedFields = new HashSet<>();
239+
240+
for (UnresolvedExpression expr : projectList) {
241+
if (expr instanceof Field) {
242+
Field field = (Field) expr;
243+
String fieldName = field.getField().toString();
244+
if (WildcardUtils.containsWildcard(fieldName)) {
245+
List<String> matchingFields =
246+
WildcardUtils.expandWildcardPattern(fieldName, currentFields).stream()
247+
.filter(f -> !isMetadataField(f))
248+
.filter(addedFields::add)
249+
.collect(Collectors.toList());
250+
if (matchingFields.isEmpty()) {
251+
continue;
252+
}
253+
matchingFields.forEach(f -> expandedFields.add(context.relBuilder.field(f)));
254+
} else if (addedFields.add(fieldName)) {
255+
expandedFields.add(rexVisitor.analyze(field, context));
256+
}
257+
} else if (expr instanceof AllFields) {
258+
currentFields.stream()
259+
.filter(field -> !isMetadataField(field))
260+
.filter(addedFields::add)
261+
.forEach(field -> expandedFields.add(context.relBuilder.field(field)));
262+
} else {
263+
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(expr -> expr instanceof Field)
290+
.map(expr -> (Field) expr)
291+
.filter(field -> WildcardUtils.containsWildcard(field.getField().toString()))
292+
.map(field -> field.getField().toString())
293+
.findFirst()
294+
.orElse(null);
295+
296+
if (firstWildcardPattern != null) {
297+
throw new IllegalArgumentException(
298+
String.format("wildcard pattern [%s] matches no fields", firstWildcardPattern));
299+
}
300+
}
301+
302+
private boolean isMetadataField(String fieldName) {
303+
return OpenSearchConstants.METADATAFIELD_TYPE_MAP.containsKey(fieldName);
304+
}
305+
220306
/** See logic in {@link org.opensearch.sql.analysis.symbol.SymbolTable#lookupAllFields} */
221307
private static void tryToRemoveNestedFields(CalcitePlanContext context) {
222308
Set<String> allFields = new HashSet<>(context.relBuilder.peek().getRowType().getFieldNames());
@@ -503,7 +589,6 @@ public RelNode visitPatterns(Patterns node, CalcitePlanContext context) {
503589
@Override
504590
public RelNode visitEval(Eval node, CalcitePlanContext context) {
505591
visitChildren(node, context);
506-
List<String> originalFieldNames = context.relBuilder.peek().getRowType().getFieldNames();
507592
node.getExpressionList()
508593
.forEach(
509594
expr -> {

0 commit comments

Comments
 (0)