[ASTERIXDB-2488][COMP] Support aggregate window functions - user model changes: yes - storage format changes: no - interface changes: no
Details: - Implement aggregate window functions: agg_func() OVER (frame_var AS)? (PARTITION BY ... ORDER BY ... frame_spec) - Where agg_func is a SQL/SQL++ aggregate function - Fix percent_rank() to always return 0 for the first tuple - Fix ntile() to handle NULL argument - Log query after each rewrite rule in SqlppQueryRewriter - Implement toString() for ADayTimeDuration, fix it for AYearMonthDuration - Add seek() method to RunFileReader Change-Id: If0f71118a04c2dbd3462070673d52e67f076b7e1 Reviewed-on: https://asterix-gerrit.ics.uci.edu/3049 Tested-by: Jenkins <[email protected]> Integration-Tests: Jenkins <[email protected]> Contrib: Jenkins <[email protected]> Reviewed-by: Ali Alsuliman <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/f2c18aa9 Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/f2c18aa9 Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/f2c18aa9 Branch: refs/heads/master Commit: f2c18aa9646238ab2487ce3a964edfe3e61dd6e1 Parents: 1cd58bc Author: Dmitry Lychagin <[email protected]> Authored: Fri Dec 28 21:20:23 2018 -0800 Committer: Dmitry Lychagin <[email protected]> Committed: Thu Jan 3 13:02:44 2019 -0800 ---------------------------------------------------------------------- asterixdb/LICENSE | 32 + .../InjectTypeCastForFunctionArgumentsRule.java | 1 + .../rules/SetAsterixPhysicalOperatorsRule.java | 25 +- .../SweepIllegalNonfunctionalFunctions.java | 33 +- .../subplan/InlineAllNtsInSubplanVisitor.java | 14 +- .../LangExpressionToPlanTranslator.java | 85 +- .../SqlppExpressionToPlanTranslator.java | 530 +- asterixdb/asterix-app/data/tenk.tbl | 10000 +++++++++++++++++ .../app/resource/OperatorResourcesComputer.java | 8 +- .../optimizerts/queries/window/window_02.sqlpp | 39 + .../optimizerts/results/ASTERIXDB-2402.plan | 38 +- .../results/aggregate/constant-gby-agg.plan | 6 +- .../results/aggregate/serial-agg.plan | 6 +- ...n-probe-pidx-with-join-btree-sidx_01_ps.plan | 16 +- ...join-probe-pidx-with-join-btree-sidx_02.plan | 10 +- ...n-probe-pidx-with-join-btree-sidx_02_ps.plan | 20 +- .../btree-index-join/primary-equi-join_04.plan | 4 +- .../secondary-equi-join-multiindex.plan | 2 +- .../secondary-equi-join_02.plan | 2 +- .../secondary-equi-join_03.plan | 2 +- .../secondary-equi-join_04.plan | 8 +- .../secondary-equi-join_05.plan | 2 +- .../secondary-equi-join_06.plan | 8 +- .../results/btree-index/btree-secondary-33.plan | 2 +- .../results/btree-index/btree-secondary-34.plan | 2 +- .../results/btree-index/btree-secondary-35.plan | 2 +- .../results/btree-index/btree-secondary-36.plan | 2 +- .../results/btree-index/btree-secondary-40.plan | 2 +- .../results/btree-index/btree-secondary-42.plan | 2 +- .../results/btree-index/btree-secondary-43.plan | 2 +- .../results/btree-index/btree-secondary-44.plan | 2 +- .../results/btree-index/btree-secondary-45.plan | 2 +- .../results/btree-index/btree-secondary-46.plan | 2 +- .../results/btree-index/btree-secondary-47.plan | 2 +- .../results/btree-index/btree-secondary-48.plan | 2 +- .../results/btree-index/btree-secondary-49.plan | 2 +- .../results/btree-index/btree-secondary-51.plan | 2 +- .../results/btree-index/btree-secondary-52.plan | 2 +- .../results/btree-index/btree-secondary-53.plan | 2 +- .../results/btree-index/btree-secondary-54.plan | 2 +- .../results/btree-index/btree-secondary-55.plan | 2 +- .../results/btree-index/btree-secondary-56.plan | 2 +- .../results/btree-index/btree-secondary-57.plan | 2 +- .../results/btree-index/btree-secondary-58.plan | 2 +- .../results/btree-index/btree-secondary-59.plan | 2 +- .../results/btree-index/btree-secondary-60.plan | 2 +- .../results/btree-index/btree-secondary-61.plan | 2 +- .../results/btree-index/btree-secondary-62.plan | 2 +- .../results/btree-index/btree-secondary-63.plan | 2 +- .../results/btree-index/btree-secondary-68.plan | 8 +- .../btree-index/btree-secondary-68_ps.plan | 12 +- .../btree-sidx-idxonly-01-disable-idxonly.plan | 4 +- ...tree-sidx-idxonly-01-disable-idxonly_ps.plan | 8 +- .../btree-index/btree-sidx-idxonly-01.plan | 4 +- .../btree-index/btree-sidx-idxonly-01_ps.plan | 4 +- .../optimizerts/results/collocated.plan | 2 +- .../optimizerts/results/cust_group_no_agg.plan | 4 +- .../optimizerts/results/denorm-cust-order.plan | 8 +- .../results/disjunction-to-join-delete-3.plan | 2 +- ...rted-btree-search-return-optional-field.plan | 8 +- .../optimizerts/results/fj-dblp-csx-hybrid.plan | 73 +- .../optimizerts/results/fj-dblp-csx-star.plan | 354 +- .../results/gby_partitioning_property_01.plan | 10 +- .../results/group-by/sugar-06-distinct.plan | 14 +- .../results/hints/broadcast_hint_1.plan | 2 +- .../results/hints/broadcast_hint_2.plan | 2 +- .../results/hints/broadcast_hint_3.plan | 6 +- .../insert-and-scan-dataset-with-index.plan | 9 +- .../results/insert-and-scan-dataset.plan | 2 +- .../results/introhashpartitionmerge.plan | 10 +- .../ngram-contains-panic.plan | 2 +- .../ngram-contains-panic_ps.plan | 4 +- .../inverted-index-basic/ngram-contains.plan | 4 +- .../inverted-index-basic/ngram-contains_ps.plan | 8 +- .../ngram-edit-distance-check.plan | 2 +- .../ngram-edit-distance.plan | 2 +- .../ngram-fuzzyeq-edit-distance.plan | 2 +- .../ngram-fuzzyeq-jaccard.plan | 2 +- .../ngram-jaccard-check.plan | 2 +- .../inverted-index-basic/ngram-jaccard.plan | 2 +- .../olist-edit-distance-check-panic.plan | 2 +- .../olist-edit-distance-check-panic_ps.plan | 4 +- .../olist-edit-distance-check.plan | 4 +- .../olist-edit-distance-check_ps.plan | 8 +- .../olist-edit-distance-panic.plan | 2 +- .../olist-edit-distance-panic_ps.plan | 4 +- .../olist-edit-distance.plan | 4 +- .../olist-edit-distance_ps.plan | 8 +- .../olist-fuzzyeq-edit-distance.plan | 4 +- .../olist-fuzzyeq-edit-distance_ps.plan | 8 +- .../olist-fuzzyeq-jaccard.plan | 2 +- .../olist-jaccard-check.plan | 2 +- .../inverted-index-basic/olist-jaccard.plan | 2 +- .../ulist-fuzzyeq-jaccard.plan | 2 +- .../ulist-jaccard-check.plan | 2 +- .../inverted-index-basic/ulist-jaccard.plan | 2 +- .../inverted-index-basic/word-contains.plan | 2 +- .../inverted-index-basic/word-contains_ps.plan | 4 +- .../word-fuzzyeq-jaccard.plan | 2 +- .../word-jaccard-check.plan | 2 +- .../inverted-index-basic/word-jaccard.plan | 2 +- ...dit-distance-check-let-panic-nopanic_01.plan | 2 +- ...dit-distance-check-let-panic-nopanic_02.plan | 2 +- .../ngram-edit-distance-check-let.plan | 2 +- .../ngram-edit-distance-check-substring.plan | 2 +- .../ngram-jaccard-check-let.plan | 2 +- .../ngram-jaccard-check-multi-let.plan | 2 +- .../olist-edit-distance-check-let-panic.plan | 2 +- .../olist-edit-distance-check-let-panic_ps.plan | 4 +- .../olist-edit-distance-check-let.plan | 4 +- .../olist-edit-distance-check-let_ps.plan | 8 +- .../olist-jaccard-check-let.plan | 2 +- .../ulist-jaccard-check-let.plan | 2 +- .../word-jaccard-check-let.plan | 2 +- .../word-jaccard-check-multi-let.plan | 2 +- .../ngram-edit-distance-inline.plan | 2 +- .../ngram-fuzzyeq-edit-distance.plan | 2 +- .../ngram-jaccard-inline.plan | 32 +- .../olist-edit-distance-inline.plan | 2 +- .../olist-jaccard-inline.plan | 2 +- .../ulist-jaccard-inline.plan | 2 +- .../word-jaccard-inline.plan | 32 +- .../results/inverted-index-join/issue741.plan | 36 +- ...dx-with-join-edit-distance-check-idx_01.plan | 14 +- ...with-join-edit-distance-check-idx_01_ps.plan | 28 +- ...obe-pidx-with-join-jaccard-check-idx_01.plan | 38 +- ...-pidx-with-join-jaccard-check-idx_01_ps.plan | 76 +- .../inverted-index-join/ngram-contains_ps.plan | 8 +- .../ngram-edit-distance-check_02.plan | 6 +- .../ngram-edit-distance-check_03.plan | 6 +- .../ngram-edit-distance-check_04.plan | 6 +- .../ngram-edit-distance_02.plan | 6 +- .../ngram-edit-distance_03.plan | 6 +- .../ngram-edit-distance_04.plan | 6 +- .../ngram-fuzzyeq-edit-distance_01.plan | 6 +- .../ngram-fuzzyeq-edit-distance_03.plan | 6 +- .../ngram-fuzzyeq-jaccard_02.plan | 32 +- .../ngram-fuzzyeq-jaccard_03.plan | 32 +- .../ngram-jaccard-check_02.plan | 32 +- .../ngram-jaccard-check_03.plan | 32 +- .../ngram-jaccard-check_04.plan | 32 +- .../inverted-index-join/ngram-jaccard_02.plan | 32 +- .../inverted-index-join/ngram-jaccard_03.plan | 32 +- .../inverted-index-join/ngram-jaccard_04.plan | 32 +- .../olist-edit-distance-check_02.plan | 6 +- .../olist-edit-distance-check_03.plan | 6 +- .../olist-edit-distance-check_04.plan | 6 +- .../olist-edit-distance_02.plan | 6 +- .../olist-edit-distance_03.plan | 6 +- .../olist-edit-distance_04.plan | 6 +- .../olist-fuzzyeq-edit-distance_02.plan | 6 +- .../olist-fuzzyeq-edit-distance_03.plan | 6 +- .../olist-fuzzyeq-jaccard_02.plan | 6 +- .../olist-fuzzyeq-jaccard_03.plan | 6 +- .../olist-jaccard-check_02.plan | 6 +- .../olist-jaccard-check_03.plan | 6 +- .../olist-jaccard-check_04.plan | 6 +- .../inverted-index-join/olist-jaccard_02.plan | 6 +- .../inverted-index-join/olist-jaccard_03.plan | 6 +- .../inverted-index-join/olist-jaccard_04.plan | 6 +- .../ulist-fuzzyeq-jaccard_02.plan | 6 +- .../ulist-fuzzyeq-jaccard_03.plan | 6 +- .../ulist-jaccard-check_02.plan | 6 +- .../ulist-jaccard-check_03.plan | 6 +- .../ulist-jaccard-check_04.plan | 6 +- .../inverted-index-join/ulist-jaccard_02.plan | 6 +- .../inverted-index-join/ulist-jaccard_03.plan | 6 +- .../inverted-index-join/ulist-jaccard_04.plan | 6 +- .../word-fuzzyeq-jaccard_02.plan | 32 +- .../word-fuzzyeq-jaccard_03.plan | 32 +- .../word-jaccard-check-after-btree-access.plan | 32 +- .../word-jaccard-check_02.plan | 32 +- .../word-jaccard-check_03.plan | 32 +- .../word-jaccard-check_04.plan | 32 +- .../inverted-index-join/word-jaccard_02.plan | 32 +- .../inverted-index-join/word-jaccard_03.plan | 32 +- .../inverted-index-join/word-jaccard_04.plan | 32 +- .../optimizerts/results/join-super-key_01.plan | 4 +- .../optimizerts/results/join-super-key_02.plan | 4 +- .../results/joins/nested_query_with_bcast.plan | 12 +- .../resources/optimizerts/results/loj-core.plan | 10 +- .../optimizerts/results/loj-core_ps.plan | 16 +- .../optimizerts/results/loj-sugar.plan | 10 +- .../optimizerts/results/loj-sugar_ps.plan | 16 +- .../optimizerts/results/loj-super-key_01.plan | 10 +- .../optimizerts/results/loj-super-key_02.plan | 8 +- .../results/meta/with_clause_meta.plan | 8 +- .../btree-index-join/ASTERIXDB-2199.plan | 2 +- .../btree-index-join/disjunction-to-join.plan | 25 +- ...n-probe-pidx-with-join-btree-sidx_01_ps.plan | 20 +- ...n-probe-pidx-with-join-btree-sidx_02_ps.plan | 20 +- .../secondary-equi-join_01.plan | 33 +- .../btree-index/btree-secondary-33.plan | 20 +- .../btree-index/btree-secondary-34.plan | 20 +- .../btree-index/btree-secondary-35.plan | 20 +- .../btree-index/btree-secondary-36.plan | 20 +- .../btree-index/btree-secondary-37.plan | 12 +- .../btree-index/btree-secondary-38.plan | 20 +- .../btree-index/btree-secondary-39.plan | 12 +- .../btree-index/btree-secondary-54.plan | 20 +- .../btree-index/btree-secondary-55.plan | 20 +- .../btree-index/btree-secondary-56.plan | 20 +- .../btree-index/btree-secondary-57.plan | 20 +- .../btree-index/btree-secondary-60.plan | 20 +- .../ngram-contains-panic.plan | 10 +- .../ngram-contains-panic_ps.plan | 24 +- .../inverted-index-basic/ngram-contains.plan | 16 +- .../inverted-index-basic/ngram-contains_ps.plan | 36 +- .../ngram-edit-distance-check-panic.plan | 12 +- .../ngram-edit-distance-check.plan | 18 +- .../ngram-edit-distance-panic.plan | 12 +- .../ngram-edit-distance.plan | 18 +- .../ngram-fuzzyeq-edit-distance.plan | 18 +- .../ngram-fuzzyeq-jaccard.plan | 18 +- .../ngram-jaccard-check.plan | 18 +- .../inverted-index-basic/ngram-jaccard.plan | 18 +- .../olist-edit-distance-check-panic.plan | 10 +- .../olist-edit-distance-check-panic_ps.plan | 24 +- .../olist-edit-distance-check.plan | 16 +- .../olist-edit-distance-check_ps.plan | 36 +- .../olist-edit-distance-panic.plan | 10 +- .../olist-edit-distance-panic_ps.plan | 24 +- .../olist-edit-distance.plan | 16 +- .../olist-edit-distance_ps.plan | 36 +- .../olist-fuzzyeq-edit-distance.plan | 16 +- .../olist-fuzzyeq-edit-distance_ps.plan | 36 +- .../olist-fuzzyeq-jaccard.plan | 18 +- .../olist-jaccard-check.plan | 18 +- .../inverted-index-basic/olist-jaccard.plan | 18 +- .../ulist-fuzzyeq-jaccard.plan | 18 +- .../ulist-jaccard-check.plan | 18 +- .../inverted-index-basic/ulist-jaccard.plan | 18 +- .../inverted-index-basic/word-contains.plan | 10 +- .../inverted-index-basic/word-contains_ps.plan | 24 +- .../word-fuzzyeq-jaccard.plan | 18 +- .../word-jaccard-check.plan | 18 +- .../inverted-index-basic/word-jaccard.plan | 18 +- .../ngram-edit-distance-check-let-panic.plan | 12 +- .../ngram-edit-distance-check-let.plan | 18 +- .../ngram-jaccard-check-let.plan | 18 +- .../ngram-jaccard-check-multi-let.plan | 14 +- .../olist-edit-distance-check-let-panic.plan | 10 +- .../olist-edit-distance-check-let-panic_ps.plan | 24 +- .../olist-edit-distance-check-let.plan | 16 +- .../olist-edit-distance-check-let_ps.plan | 36 +- .../olist-jaccard-check-let.plan | 18 +- .../ulist-jaccard-check-let.plan | 18 +- .../word-jaccard-check-let.plan | 18 +- .../word-jaccard-check-multi-let.plan | 14 +- ...with-join-edit-distance-check-idx_01_ps.plan | 28 +- ...-pidx-with-join-jaccard-check-idx_01_ps.plan | 76 +- .../ngram-fuzzyeq-jaccard_01.plan | 32 +- .../ngram-jaccard-check_01.plan | 32 +- .../ngram-jaccard-inline.plan | 52 +- .../inverted-index-join/ngram-jaccard_01.plan | 32 +- .../word-fuzzyeq-jaccard_01.plan | 32 +- .../word-jaccard-check-after-btree-access.plan | 62 +- .../word-jaccard-check_01.plan | 32 +- .../word-jaccard-inline.plan | 52 +- .../inverted-index-join/word-jaccard_01.plan | 32 +- ...n-probe-pidx-with-join-rtree-sidx_01_ps.plan | 20 +- ...n-probe-pidx-with-join-rtree-sidx_02_ps.plan | 20 +- .../spatial-intersect-point_01.plan | 33 +- .../spatial-intersect-point_03.plan | 33 +- .../btree-index-join/disjunction-to-join.plan | 25 +- ...probe-pidx-with-join-btree-sidx_01_1_ps.plan | 20 +- ...probe-pidx-with-join-btree-sidx_01_2_ps.plan | 20 +- ...probe-pidx-with-join-btree-sidx_02_1_ps.plan | 20 +- ...probe-pidx-with-join-btree-sidx_02_2_ps.plan | 20 +- .../01.plan | 2 +- .../02.plan | 2 +- .../03.plan | 10 +- .../04.plan | 10 +- .../05.plan | 10 +- .../06.plan | 6 +- .../07.plan | 6 +- .../secondary-equi-join_01.plan | 33 +- .../secondary-equi-join_02.plan | 33 +- .../secondary-equi-join_03.plan | 33 +- .../secondary-equi-join_04.plan | 33 +- .../btree-index/btree-secondary-33.plan | 20 +- .../btree-index/btree-secondary-34.plan | 20 +- .../btree-index/btree-secondary-35.plan | 20 +- .../btree-index/btree-secondary-36.plan | 20 +- .../btree-index/btree-secondary-37.plan | 12 +- .../btree-index/btree-secondary-38.plan | 20 +- .../btree-index/btree-secondary-39.plan | 12 +- .../btree-index/btree-secondary-54.plan | 20 +- .../btree-index/btree-secondary-55.plan | 20 +- .../btree-index/btree-secondary-56.plan | 20 +- .../btree-index/btree-secondary-57.plan | 20 +- .../btree-index/btree-secondary-60.plan | 20 +- .../non-enforced-composite-key/01.plan | 20 +- .../non-enforced-composite-key/02.plan | 2 +- .../non-enforced-composite-key/03.plan | 31 +- .../non-enforced-composite-key/04.plan | 6 +- .../non-enforced-composite-key/05.plan | 6 +- .../non-enforced-composite-key/06.plan | 6 +- .../non-enforced-composite-key/07.plan | 6 +- .../non-enforced-composite-key/08.plan | 6 +- .../non-enforced-composite-key/09.plan | 6 +- .../non-enforced-composite-key/10.plan | 6 +- .../non-enforced-composite-key/11.plan | 6 +- .../non-enforced-composite-key/12.plan | 8 +- .../ngram-contains-panic.plan | 10 +- .../ngram-contains-panic_ps.plan | 24 +- .../inverted-index-basic/ngram-contains.plan | 16 +- .../inverted-index-basic/ngram-contains_ps.plan | 36 +- .../ngram-edit-distance-check-panic.plan | 12 +- .../ngram-edit-distance-check.plan | 18 +- .../ngram-edit-distance-panic.plan | 12 +- .../ngram-edit-distance.plan | 18 +- .../ngram-fuzzyeq-edit-distance.plan | 18 +- .../ngram-fuzzyeq-jaccard.plan | 18 +- .../ngram-jaccard-check.plan | 18 +- .../inverted-index-basic/ngram-jaccard.plan | 18 +- .../inverted-index-basic/word-contains.plan | 10 +- .../inverted-index-basic/word-contains_ps.plan | 24 +- .../word-fuzzyeq-jaccard.plan | 18 +- .../word-jaccard-check.plan | 18 +- .../inverted-index-basic/word-jaccard.plan | 18 +- .../ngram-edit-distance-check-let-panic.plan | 12 +- .../ngram-edit-distance-check-let.plan | 18 +- .../ngram-jaccard-check-let.plan | 18 +- .../ngram-jaccard-check-multi-let.plan | 14 +- .../word-jaccard-check-let.plan | 18 +- .../word-jaccard-check-multi-let.plan | 14 +- ...with-join-edit-distance-check-idx_01_ps.plan | 28 +- .../ngram-contains_01_ps.plan | 4 +- .../ngram-contains_02_ps.plan | 4 +- .../ngram-contains_03_ps.plan | 8 +- .../ngram-contains_04_ps.plan | 8 +- .../ngram-fuzzyeq-jaccard_01.plan | 32 +- .../ngram-fuzzyeq-jaccard_02.plan | 32 +- .../ngram-fuzzyeq-jaccard_03.plan | 32 +- .../ngram-fuzzyeq-jaccard_04.plan | 32 +- .../ngram-jaccard-check_01.plan | 32 +- .../ngram-jaccard-check_02.plan | 32 +- .../ngram-jaccard-check_03.plan | 32 +- .../ngram-jaccard-check_04.plan | 32 +- .../ngram-jaccard-inline.plan | 52 +- .../inverted-index-join/ngram-jaccard_01.plan | 32 +- .../inverted-index-join/ngram-jaccard_02.plan | 32 +- .../inverted-index-join/ngram-jaccard_03.plan | 32 +- .../inverted-index-join/ngram-jaccard_04.plan | 32 +- .../word-fuzzyeq-jaccard_01.plan | 32 +- .../word-fuzzyeq-jaccard_02.plan | 32 +- .../word-fuzzyeq-jaccard_03.plan | 32 +- .../word-fuzzyeq-jaccard_04.plan | 32 +- .../word-jaccard-check-after-btree-access.plan | 62 +- .../word-jaccard-check_01.plan | 32 +- .../word-jaccard-check_02.plan | 32 +- .../word-jaccard-check_03.plan | 32 +- .../word-jaccard-check_04.plan | 32 +- .../word-jaccard-inline.plan | 52 +- .../inverted-index-join/word-jaccard_01.plan | 32 +- .../inverted-index-join/word-jaccard_02.plan | 32 +- .../inverted-index-join/word-jaccard_03.plan | 32 +- .../inverted-index-join/word-jaccard_04.plan | 32 +- ...n-probe-pidx-with-join-rtree-sidx_01_ps.plan | 20 +- ...n-probe-pidx-with-join-rtree-sidx_02_ps.plan | 20 +- .../spatial-intersect-point_01.plan | 33 +- .../spatial-intersect-point_03.plan | 33 +- .../spatial-intersect-point_04.plan | 33 +- .../optimizerts/results/nested_loj2.plan | 18 +- ...probe-pidx-with-join-btree-sidx_01_1_ps.plan | 20 +- ...probe-pidx-with-join-btree-sidx_01_2_ps.plan | 20 +- ...probe-pidx-with-join-btree-sidx_02_1_ps.plan | 20 +- ...probe-pidx-with-join-btree-sidx_02_2_ps.plan | 20 +- .../ngram-contains-panic_ps.plan | 4 +- .../inverted-index-basic/ngram-contains_ps.plan | 8 +- .../inverted-index-basic/word-contains_ps.plan | 4 +- ...with-join-edit-distance-check-idx_01_ps.plan | 28 +- .../ngram-contains_01_ps.plan | 4 +- .../ngram-contains_02_ps.plan | 8 +- .../ngram-contains_03_ps.plan | 8 +- .../ngram-contains_04_ps.plan | 8 +- ...n-probe-pidx-with-join-rtree-sidx_01_ps.plan | 20 +- ...n-probe-pidx-with-join-rtree-sidx_02_ps.plan | 20 +- .../btree-equi-join-non-enforced-05.plan | 10 +- .../btree-equi-join-non-enforced-05_ps.plan | 16 +- .../btree-equi-join-non-enforced-06.plan | 10 +- .../btree-equi-join-non-enforced-06_ps.plan | 16 +- .../btree-equi-join-non-enforced-07.plan | 10 +- .../btree-equi-join-non-enforced-07_ps.plan | 16 +- .../btree-equi-join-non-enforced-08.plan | 6 +- .../btree-equi-join-non-enforced-08_ps.plan | 8 +- .../btree-equi-join-non-enforced-09.plan | 6 +- .../btree-equi-join-non-enforced-09_ps.plan | 8 +- .../btree-index-non-enforced-04.plan | 6 +- .../btree-index-non-enforced-04_ps.plan | 8 +- .../btree-index-non-enforced-05.plan | 6 +- .../btree-index-non-enforced-05_ps.plan | 8 +- .../btree-index-non-enforced-06.plan | 6 +- .../btree-index-non-enforced-06_ps.plan | 8 +- .../btree-index-non-enforced-07.plan | 6 +- .../btree-index-non-enforced-07_ps.plan | 8 +- .../btree-index-non-enforced-08.plan | 6 +- .../btree-index-non-enforced-08_ps.plan | 8 +- .../btree-index-non-enforced-09.plan | 6 +- .../btree-index-non-enforced-09_ps.plan | 8 +- .../btree-index-non-enforced-10.plan | 6 +- .../btree-index-non-enforced-105.plan | 8 +- .../btree-index-non-enforced-105_ps.plan | 12 +- .../btree-index-non-enforced-10_ps.plan | 8 +- .../btree-index-non-enforced-11.plan | 6 +- .../btree-index-non-enforced-11_ps.plan | 8 +- .../results/orderby-desc-using-gby_ps.plan | 8 +- ...orders-index-search-conjunctive-open_01.plan | 4 +- ...ers-index-search-conjunctive-open_01_ps.plan | 8 +- ...orders-index-search-conjunctive-open_02.plan | 4 +- ...ers-index-search-conjunctive-open_02_ps.plan | 8 +- .../orders-index-search-conjunctive_01.plan | 4 +- .../orders-index-search-conjunctive_01_ps.plan | 8 +- .../orders-index-search-conjunctive_02.plan | 4 +- .../orders-index-search-conjunctive_02_ps.plan | 8 +- .../p_sort_seq_merge/p_sort_seq_merge.plan | 6 +- .../parallel_sort_enabled_disabled.1.plan | 4 +- .../parallel_sort_enabled_disabled.2.plan | 4 +- .../results/pull_select_above_eq_join.plan | 6 +- .../results/push-project-through-group.plan | 12 +- .../q01_pricing_summary_report_nt_ps.plan | 12 +- .../optimizerts/results/q08_group_by.plan | 30 +- .../optimizerts/results/q09_group_by.plan | 18 +- .../results/query-ASTERIXDB-159-3.plan | 8 +- .../results/query-ASTERIXDB-1671.plan | 4 +- .../results/query-ASTERIXDB-1806.plan | 6 +- .../results/query-ASTERIXDB-1806_ps.plan | 12 +- .../results/query-ASTERIXDB-2354.plan | 4 +- .../results/query-ASTERIXDB-2354_ps.plan | 4 +- .../results/query-ASTERIXDB-2408.plan | 10 +- .../results/query-ASTERIXDB-2408_ps.plan | 16 +- .../results/query-ASTERIXDB-810-2.plan | 10 +- .../results/query-ASTERIXDB-810-2_ps.plan | 20 +- .../results/query-ASTERIXDB-810-3.plan | 10 +- .../results/query-ASTERIXDB-810-3_ps.plan | 20 +- .../results/query-ASTERIXDB-810.plan | 10 +- .../results/query-ASTERIXDB-810_ps.plan | 20 +- .../optimizerts/results/query-issue562_ps.plan | 36 +- .../optimizerts/results/query-issue601.plan | 6 +- .../optimizerts/results/query_issue849-2.plan | 4 +- .../optimizerts/results/query_issue849.plan | 4 +- ...n-probe-pidx-with-join-rtree-sidx_01_ps.plan | 16 +- ...join-probe-pidx-with-join-rtree-sidx_02.plan | 10 +- ...n-probe-pidx-with-join-rtree-sidx_02_ps.plan | 20 +- .../spatial-intersect-point_02.plan | 2 +- .../spatial-intersect-point_03.plan | 2 +- .../rtree-sidx-idxonly-01-disable-idxonly.plan | 2 +- .../results/skip-index/skip-ngram-index_ps.plan | 4 +- .../skip-secondary-btree-index-2.plan | 2 +- .../results/split-materialization.plan | 4 +- .../results/split-materialization_ps.plan | 4 +- .../statement-params/statement-params-01.plan | 2 +- .../statement-params/statement-params-02.plan | 2 +- .../statement-params/statement-params-03.plan | 2 +- .../optimizerts/results/subquery/exists.plan | 20 +- .../optimizerts/results/subquery/exists_ps.plan | 40 +- .../optimizerts/results/subquery/in.plan | 10 +- .../results/subquery/in_as_or_1.plan | 6 +- .../results/subquery/in_as_or_1_ps.plan | 8 +- .../results/subquery/in_as_or_2.plan | 12 +- .../results/subquery/in_as_or_2_ps.plan | 24 +- .../results/subquery/in_as_or_3.plan | 6 +- .../results/subquery/in_as_or_3_ps.plan | 8 +- .../results/subquery/in_as_or_4.plan | 12 +- .../results/subquery/in_as_or_4_ps.plan | 24 +- .../results/subquery/in_as_or_5.plan | 6 +- .../results/subquery/in_as_or_5_ps.plan | 8 +- .../results/subquery/in_as_or_6.plan | 12 +- .../results/subquery/in_as_or_6_ps.plan | 24 +- .../results/subquery/in_correlated.plan | 10 +- .../results/subquery/in_correlated_ps.plan | 16 +- .../optimizerts/results/subquery/in_ps.plan | 16 +- .../results/subquery/not_exists.plan | 20 +- .../results/subquery/not_exists_ps.plan | 40 +- .../results/subquery/query-ASTERIXDB-1572.plan | 20 +- .../results/tpcds/query-ASTERIXDB-1580.plan | 28 +- .../tpcds/query-ASTERIXDB-1581-correlated.plan | 64 +- .../results/tpcds/query-ASTERIXDB-1581.plan | 26 +- .../results/tpcds/query-ASTERIXDB-1591.plan | 60 +- .../results/tpcds/query-ASTERIXDB-1596.plan | 10 +- .../results/tpcds/query-ASTERIXDB-1596_ps.plan | 16 +- .../optimizerts/results/tpch/q12_shipping.plan | 12 +- .../results/tpch/q12_shipping_broadcast.plan | 10 +- .../results/tpch/q12_shipping_broadcast_ps.plan | 20 +- .../results/tpch/q12_shipping_ps.plan | 24 +- .../optimizerts/results/window/window_02.plan | 23 + .../window/misc_01/misc_01.3.query.sqlpp | 3 +- .../window/misc_01/misc_01.4.query.sqlpp | 2 +- .../window/misc_01/misc_01.5.query.sqlpp | 2 +- .../window/misc_01/misc_01.6.query.sqlpp | 28 + .../window/ntile_02/ntile_02.1.query.sqlpp | 2 +- .../window/pg_win/pg_win.1.ddl.sqlpp | 75 + .../window/pg_win/pg_win.10.query.sqlpp | 29 + .../window/pg_win/pg_win.100.query.sqlpp | 30 + .../window/pg_win/pg_win.101.query.sqlpp | 30 + .../window/pg_win/pg_win.102.query.sqlpp | 30 + .../window/pg_win/pg_win.103.query.sqlpp | 30 + .../window/pg_win/pg_win.104.query.sqlpp | 32 + .../window/pg_win/pg_win.105.query.sqlpp | 33 + .../window/pg_win/pg_win.106.query.sqlpp | 29 + .../window/pg_win/pg_win.107.query.sqlpp | 30 + .../window/pg_win/pg_win.108.query.sqlpp | 31 + .../window/pg_win/pg_win.109.query.sqlpp | 30 + .../window/pg_win/pg_win.11.query.sqlpp | 29 + .../window/pg_win/pg_win.110.query.sqlpp | 30 + .../window/pg_win/pg_win.111.query.sqlpp | 30 + .../window/pg_win/pg_win.112.query.sqlpp | 30 + .../window/pg_win/pg_win.113.query.sqlpp | 30 + .../window/pg_win/pg_win.114.query.sqlpp | 31 + .../window/pg_win/pg_win.115.query.sqlpp | 30 + .../window/pg_win/pg_win.116.query.sqlpp | 30 + .../window/pg_win/pg_win.117.query.sqlpp | 29 + .../window/pg_win/pg_win.118.query.sqlpp | 32 + .../window/pg_win/pg_win.119.query.sqlpp | 31 + .../window/pg_win/pg_win.12.query.sqlpp | 29 + .../window/pg_win/pg_win.13.query.sqlpp | 29 + .../window/pg_win/pg_win.14.query.sqlpp | 32 + .../window/pg_win/pg_win.15.query.sqlpp | 29 + .../window/pg_win/pg_win.16.query.sqlpp | 30 + .../window/pg_win/pg_win.17.query.sqlpp | 35 + .../window/pg_win/pg_win.18.query.sqlpp | 31 + .../window/pg_win/pg_win.19.query.sqlpp | 30 + .../window/pg_win/pg_win.2.update.sqlpp | 71 + .../window/pg_win/pg_win.20.query.sqlpp | 30 + .../window/pg_win/pg_win.21.query.sqlpp | 30 + .../window/pg_win/pg_win.22.query.sqlpp | 30 + .../window/pg_win/pg_win.23.query.sqlpp | 30 + .../window/pg_win/pg_win.24.query.sqlpp | 32 + .../window/pg_win/pg_win.25.query.sqlpp | 31 + .../window/pg_win/pg_win.26.query.sqlpp | 32 + .../window/pg_win/pg_win.27.query.sqlpp | 32 + .../window/pg_win/pg_win.28.query.sqlpp | 31 + .../window/pg_win/pg_win.29.query.sqlpp | 33 + .../window/pg_win/pg_win.3.query.sqlpp | 28 + .../window/pg_win/pg_win.30.query.sqlpp | 30 + .../window/pg_win/pg_win.31.query.sqlpp | 32 + .../window/pg_win/pg_win.32.query.sqlpp | 31 + .../window/pg_win/pg_win.33.query.sqlpp | 30 + .../window/pg_win/pg_win.34.query.sqlpp | 30 + .../window/pg_win/pg_win.35.query.sqlpp | 31 + .../window/pg_win/pg_win.36.query.sqlpp | 31 + .../window/pg_win/pg_win.37.query.sqlpp | 30 + .../window/pg_win/pg_win.38.query.sqlpp | 31 + .../window/pg_win/pg_win.39.query.sqlpp | 32 + .../window/pg_win/pg_win.4.query.sqlpp | 28 + .../window/pg_win/pg_win.40.query.sqlpp | 32 + .../window/pg_win/pg_win.41.query.sqlpp | 32 + .../window/pg_win/pg_win.42.query.sqlpp | 32 + .../window/pg_win/pg_win.43.query.sqlpp | 31 + .../window/pg_win/pg_win.44.query.sqlpp | 31 + .../window/pg_win/pg_win.45.query.sqlpp | 31 + .../window/pg_win/pg_win.46.query.sqlpp | 29 + .../window/pg_win/pg_win.47.query.sqlpp | 30 + .../window/pg_win/pg_win.48.query.sqlpp | 30 + .../window/pg_win/pg_win.49.query.sqlpp | 30 + .../window/pg_win/pg_win.5.query.sqlpp | 28 + .../window/pg_win/pg_win.50.query.sqlpp | 30 + .../window/pg_win/pg_win.51.query.sqlpp | 30 + .../window/pg_win/pg_win.52.query.sqlpp | 31 + .../window/pg_win/pg_win.53.query.sqlpp | 30 + .../window/pg_win/pg_win.54.query.sqlpp | 31 + .../window/pg_win/pg_win.55.query.sqlpp | 31 + .../window/pg_win/pg_win.56.query.sqlpp | 31 + .../window/pg_win/pg_win.57.query.sqlpp | 31 + .../window/pg_win/pg_win.58.query.sqlpp | 31 + .../window/pg_win/pg_win.59.query.sqlpp | 30 + .../window/pg_win/pg_win.6.query.sqlpp | 29 + .../window/pg_win/pg_win.60.query.sqlpp | 30 + .../window/pg_win/pg_win.61.query.sqlpp | 30 + .../window/pg_win/pg_win.62.query.sqlpp | 30 + .../window/pg_win/pg_win.63.query.sqlpp | 30 + .../window/pg_win/pg_win.64.query.sqlpp | 30 + .../window/pg_win/pg_win.65.query.sqlpp | 32 + .../window/pg_win/pg_win.66.query.sqlpp | 30 + .../window/pg_win/pg_win.67.query.sqlpp | 30 + .../window/pg_win/pg_win.68.query.sqlpp | 31 + .../window/pg_win/pg_win.69.query.sqlpp | 31 + .../window/pg_win/pg_win.7.query.sqlpp | 28 + .../window/pg_win/pg_win.70.query.sqlpp | 31 + .../window/pg_win/pg_win.71.query.sqlpp | 32 + .../window/pg_win/pg_win.72.query.sqlpp | 32 + .../window/pg_win/pg_win.73.query.sqlpp | 32 + .../window/pg_win/pg_win.74.query.sqlpp | 29 + .../window/pg_win/pg_win.75.query.sqlpp | 29 + .../window/pg_win/pg_win.76.query.sqlpp | 29 + .../window/pg_win/pg_win.77.query.sqlpp | 30 + .../window/pg_win/pg_win.78.query.sqlpp | 29 + .../window/pg_win/pg_win.79.query.sqlpp | 29 + .../window/pg_win/pg_win.8.query.sqlpp | 29 + .../window/pg_win/pg_win.80.query.sqlpp | 29 + .../window/pg_win/pg_win.81.query.sqlpp | 29 + .../window/pg_win/pg_win.82.query.sqlpp | 28 + .../window/pg_win/pg_win.83.query.sqlpp | 30 + .../window/pg_win/pg_win.84.query.sqlpp | 31 + .../window/pg_win/pg_win.85.query.sqlpp | 30 + .../window/pg_win/pg_win.86.query.sqlpp | 30 + .../window/pg_win/pg_win.87.query.sqlpp | 30 + .../window/pg_win/pg_win.88.query.sqlpp | 30 + .../window/pg_win/pg_win.89.query.sqlpp | 29 + .../window/pg_win/pg_win.9.query.sqlpp | 29 + .../window/pg_win/pg_win.90.query.sqlpp | 29 + .../window/pg_win/pg_win.91.query.sqlpp | 30 + .../window/pg_win/pg_win.92.query.sqlpp | 31 + .../window/pg_win/pg_win.93.query.sqlpp | 31 + .../window/pg_win/pg_win.94.query.sqlpp | 31 + .../window/pg_win/pg_win.95.query.sqlpp | 32 + .../window/pg_win/pg_win.96.query.sqlpp | 31 + .../window/pg_win/pg_win.97.query.sqlpp | 30 + .../window/pg_win/pg_win.98.query.sqlpp | 31 + .../window/pg_win/pg_win.99.query.sqlpp | 30 + .../count_dataset/count_dataset.1.adm | 18 +- .../aggregate/count_dataset/count_dataset.1.adm | 18 +- .../explain_field_access.1.adm | 42 +- .../explain_field_access_closed.1.adm | 26 +- .../push-limit-to-primary-lookup-select.3.adm | 14 +- .../push-limit-to-primary-lookup-select.5.adm | 24 +- .../push-limit-to-primary-lookup.3.adm | 14 +- .../push-limit-to-primary-lookup.5.adm | 14 +- .../push-limit-to-primary-scan-select.3.adm | 4 +- .../push-limit-to-primary-scan-select.5.adm | 38 +- .../push-limit-to-primary-scan-select.6.adm | 16 +- .../push-limit-to-primary-scan-select.8.adm | 16 +- .../push-limit-to-primary-scan.3.adm | 4 +- .../push-limit-to-primary-scan.5.adm | 4 +- .../enforcing_item_type.1.adm | 8 +- .../single_dataset_with_index.13.adm | 14 +- .../single_dataset_with_index.8.adm | 14 +- .../results/window/misc_01/misc_01.6.adm | 4 + .../results/window/pg_win/pg_win.10.adm | 10 + .../results/window/pg_win/pg_win.100.adm | 10 + .../results/window/pg_win/pg_win.101.adm | 10 + .../results/window/pg_win/pg_win.102.adm | 10 + .../results/window/pg_win/pg_win.103.adm | 10 + .../results/window/pg_win/pg_win.104.adm | 6 + .../results/window/pg_win/pg_win.105.adm | 6 + .../results/window/pg_win/pg_win.106.adm | 3 + .../results/window/pg_win/pg_win.107.adm | 3 + .../results/window/pg_win/pg_win.108.adm | 3 + .../results/window/pg_win/pg_win.109.adm | 3 + .../results/window/pg_win/pg_win.11.adm | 10 + .../results/window/pg_win/pg_win.110.adm | 10 + .../results/window/pg_win/pg_win.111.adm | 10 + .../results/window/pg_win/pg_win.112.adm | 10 + .../results/window/pg_win/pg_win.113.adm | 10 + .../results/window/pg_win/pg_win.114.adm | 10 + .../results/window/pg_win/pg_win.115.adm | 10 + .../results/window/pg_win/pg_win.116.adm | 10 + .../results/window/pg_win/pg_win.117.adm | 20 + .../results/window/pg_win/pg_win.118.adm | 10 + .../results/window/pg_win/pg_win.119.adm | 3 + .../results/window/pg_win/pg_win.12.adm | 2 + .../results/window/pg_win/pg_win.13.adm | 6 + .../results/window/pg_win/pg_win.14.adm | 10 + .../results/window/pg_win/pg_win.15.adm | 10 + .../results/window/pg_win/pg_win.16.adm | 1 + .../results/window/pg_win/pg_win.17.adm | 10 + .../results/window/pg_win/pg_win.18.adm | 10 + .../results/window/pg_win/pg_win.19.adm | 20 + .../results/window/pg_win/pg_win.20.adm | 20 + .../results/window/pg_win/pg_win.21.adm | 20 + .../results/window/pg_win/pg_win.22.adm | 20 + .../results/window/pg_win/pg_win.23.adm | 20 + .../results/window/pg_win/pg_win.24.adm | 10 + .../results/window/pg_win/pg_win.25.adm | 10 + .../results/window/pg_win/pg_win.26.adm | 10 + .../results/window/pg_win/pg_win.27.adm | 10 + .../results/window/pg_win/pg_win.28.adm | 10 + .../results/window/pg_win/pg_win.29.adm | 10 + .../results/window/pg_win/pg_win.3.adm | 10 + .../results/window/pg_win/pg_win.30.adm | 10 + .../results/window/pg_win/pg_win.31.adm | 10 + .../results/window/pg_win/pg_win.32.adm | 10 + .../results/window/pg_win/pg_win.33.adm | 10 + .../results/window/pg_win/pg_win.34.adm | 10 + .../results/window/pg_win/pg_win.35.adm | 10 + .../results/window/pg_win/pg_win.36.adm | 10 + .../results/window/pg_win/pg_win.37.adm | 10 + .../results/window/pg_win/pg_win.38.adm | 10 + .../results/window/pg_win/pg_win.39.adm | 10 + .../results/window/pg_win/pg_win.4.adm | 10 + .../results/window/pg_win/pg_win.40.adm | 10 + .../results/window/pg_win/pg_win.41.adm | 10 + .../results/window/pg_win/pg_win.42.adm | 10 + .../results/window/pg_win/pg_win.43.adm | 10 + .../results/window/pg_win/pg_win.44.adm | 10 + .../results/window/pg_win/pg_win.45.adm | 10 + .../results/window/pg_win/pg_win.46.adm | 10 + .../results/window/pg_win/pg_win.47.adm | 10 + .../results/window/pg_win/pg_win.48.adm | 10 + .../results/window/pg_win/pg_win.49.adm | 10 + .../results/window/pg_win/pg_win.5.adm | 10 + .../results/window/pg_win/pg_win.50.adm | 10 + .../results/window/pg_win/pg_win.51.adm | 10 + .../results/window/pg_win/pg_win.52.adm | 10 + .../results/window/pg_win/pg_win.53.adm | 10 + .../results/window/pg_win/pg_win.54.adm | 10 + .../results/window/pg_win/pg_win.55.adm | 10 + .../results/window/pg_win/pg_win.56.adm | 10 + .../results/window/pg_win/pg_win.57.adm | 10 + .../results/window/pg_win/pg_win.58.adm | 10 + .../results/window/pg_win/pg_win.59.adm | 10 + .../results/window/pg_win/pg_win.6.adm | 10 + .../results/window/pg_win/pg_win.60.adm | 10 + .../results/window/pg_win/pg_win.61.adm | 10 + .../results/window/pg_win/pg_win.62.adm | 10 + .../results/window/pg_win/pg_win.63.adm | 10 + .../results/window/pg_win/pg_win.64.adm | 10 + .../results/window/pg_win/pg_win.65.adm | 10 + .../results/window/pg_win/pg_win.66.adm | 10 + .../results/window/pg_win/pg_win.67.adm | 10 + .../results/window/pg_win/pg_win.68.adm | 18 + .../results/window/pg_win/pg_win.69.adm | 18 + .../results/window/pg_win/pg_win.7.adm | 10 + .../results/window/pg_win/pg_win.70.adm | 18 + .../results/window/pg_win/pg_win.71.adm | 26 + .../results/window/pg_win/pg_win.72.adm | 26 + .../results/window/pg_win/pg_win.73.adm | 26 + .../results/window/pg_win/pg_win.74.adm | 10 + .../results/window/pg_win/pg_win.75.adm | 10 + .../results/window/pg_win/pg_win.76.adm | 10 + .../results/window/pg_win/pg_win.77.adm | 10 + .../results/window/pg_win/pg_win.78.adm | 10 + .../results/window/pg_win/pg_win.79.adm | 10 + .../results/window/pg_win/pg_win.8.adm | 10 + .../results/window/pg_win/pg_win.80.adm | 10 + .../results/window/pg_win/pg_win.81.adm | 10 + .../results/window/pg_win/pg_win.82.adm | 10 + .../results/window/pg_win/pg_win.83.adm | 10 + .../results/window/pg_win/pg_win.84.adm | 20 + .../results/window/pg_win/pg_win.85.adm | 20 + .../results/window/pg_win/pg_win.86.adm | 20 + .../results/window/pg_win/pg_win.87.adm | 20 + .../results/window/pg_win/pg_win.88.adm | 20 + .../results/window/pg_win/pg_win.89.adm | 10 + .../results/window/pg_win/pg_win.9.adm | 10 + .../results/window/pg_win/pg_win.90.adm | 10 + .../results/window/pg_win/pg_win.91.adm | 10 + .../results/window/pg_win/pg_win.92.adm | 10 + .../results/window/pg_win/pg_win.93.adm | 10 + .../results/window/pg_win/pg_win.94.adm | 10 + .../results/window/pg_win/pg_win.95.adm | 10 + .../results/window/pg_win/pg_win.96.adm | 10 + .../results/window/pg_win/pg_win.97.adm | 10 + .../results/window/pg_win/pg_win.98.adm | 10 + .../results/window/pg_win/pg_win.99.adm | 10 + .../window/misc_01/misc_01.1.ast | 7 + .../window/misc_01/misc_01.2.ast | 2 + .../window/misc_01/misc_01.3.ast | 209 + .../window/misc_01/misc_01.4.ast | 45 + .../window/misc_01/misc_01.5.ast | 77 + .../window/misc_01/misc_01.6.ast | 50 + .../resources/runtimets/testsuite_sqlpp.xml | 5 + .../runtimets/testsuite_sqlpp_parser.xml | 7 + .../asterix/common/exceptions/ErrorCode.java | 3 + .../main/resources/asx_errormsg/en.properties | 3 + .../lang/aql/rewrites/AqlQueryRewriter.java | 19 +- .../aql/visitor/AQLToSQLPPPrintVisitor.java | 10 +- .../lang/common/util/ExpressionUtils.java | 6 + .../util/VariableCloneAndSubstitutionUtil.java | 13 +- .../visitor/AbstractInlineUdfsVisitor.java | 80 +- .../CloneAndSubstituteVariablesVisitor.java | 13 +- .../visitor/GatherFunctionCallsVisitor.java | 19 +- .../lang/sqlpp/expression/WindowExpression.java | 301 +- .../rewrites/SqlppFunctionBodyRewriter.java | 6 + .../lang/sqlpp/rewrites/SqlppQueryRewriter.java | 92 +- ...bstractSqlppExpressionExtractionVisitor.java | 149 + .../visitor/Sql92AggregateFunctionVisitor.java | 176 + .../SqlppBuiltinFunctionRewriteVisitor.java | 20 +- .../SqlppGroupByAggregationSugarVisitor.java | 120 +- .../rewrites/visitor/SqlppGroupByVisitor.java | 16 +- .../visitor/SqlppInlineUdfsVisitor.java | 30 +- .../SqlppWindowAggregationSugarVisitor.java | 138 + .../visitor/SqlppWindowRewriteVisitor.java | 97 + .../visitor/VariableCheckAndRewriteVisitor.java | 29 +- .../lang/sqlpp/util/FunctionMapUtil.java | 31 +- .../lang/sqlpp/util/SqlppVariableUtil.java | 43 +- .../visitor/CheckSql92AggregateVisitor.java | 42 +- .../sqlpp/visitor/CheckSubqueryVisitor.java | 72 +- .../lang/sqlpp/visitor/DeepCopyVisitor.java | 59 +- .../lang/sqlpp/visitor/FreeVariableVisitor.java | 31 +- .../sqlpp/visitor/SqlppAstPrintVisitor.java | 86 +- ...SqlppCloneAndSubstituteVariablesVisitor.java | 31 +- .../sqlpp/visitor/SqlppFormatPrintVisitor.java | 30 +- .../AbstractSqlppExpressionScopingVisitor.java | 17 + .../AbstractSqlppSimpleExpressionVisitor.java | 36 +- .../asterix-lang-sqlpp/src/main/javacc/SQLPP.jj | 275 +- .../asterix/om/base/ADayTimeDuration.java | 11 + .../asterix/om/base/AYearMonthDuration.java | 3 +- .../asterix/om/functions/BuiltinFunctions.java | 161 +- .../impl/CollectionMemberResultType.java | 25 +- .../impl/PropagateTypeComputer.java | 14 +- .../LastElementAggregateDescriptor.java | 44 + .../collections/LastElementEvalFactory.java | 86 + .../ATimeConstructorDescriptor.java | 2 +- .../AbstractNumericArithmeticEval.java | 12 +- .../functions/IfSystemNullDescriptor.java | 58 + .../runtime/functions/FunctionCollection.java | 4 + .../AbstractRankRunningAggregateEvaluator.java | 16 +- .../std/NtileRunningAggregateEvaluator.java | 32 +- .../PercentRankRunningAggregateEvaluator.java | 4 +- .../std/RankRunningAggregateEvaluator.java | 2 +- .../licenses/templates/source_only_licenses.ftl | 26 + .../AbstractOperatorWithNestedPlans.java | 34 + .../operators/logical/GroupByOperator.java | 19 +- .../operators/logical/SubplanOperator.java | 21 +- .../operators/logical/WindowOperator.java | 208 +- .../visitors/IsomorphismOperatorVisitor.java | 49 +- .../IsomorphismVariableMappingVisitor.java | 5 +- ...OperatorDeepCopyWithNewVariablesVisitor.java | 15 +- .../visitors/LogicalPropertiesVisitor.java | 14 +- .../visitors/OperatorDeepCopyVisitor.java | 26 +- .../visitors/ProducedVariableVisitor.java | 5 + .../logical/visitors/SchemaVariableVisitor.java | 10 +- .../visitors/SubstituteVariableVisitor.java | 47 +- .../logical/visitors/UsedVariableVisitor.java | 44 +- .../physical/RunningAggregatePOperator.java | 2 +- .../operators/physical/WindowPOperator.java | 144 +- .../LogicalOperatorPrettyPrintVisitor.java | 55 +- .../LogicalOperatorPrettyPrintVisitorJson.java | 53 +- .../algebra/util/OperatorManipulationUtil.java | 31 +- .../core/utils/LogicalOperatorDotVisitor.java | 53 +- .../rules/ExtractCommonExpressionsRule.java | 1 + .../InlineSingleReferenceVariablesRule.java | 4 +- .../rules/IntroduceAggregateCombinerRule.java | 25 + .../subplan/PushSubplanIntoGroupByRule.java | 6 +- ...estedPlansAccumulatingAggregatorFactory.java | 58 +- .../NestedPlansRunningAggregatorFactory.java | 55 +- .../AbstractRunningAggregatePushRuntime.java | 62 +- .../aggrun/AbstractWindowPushRuntime.java | 172 - .../aggrun/MaterializingWindowPushRuntime.java | 152 - .../aggrun/RunningAggregatePushRuntime.java | 9 +- .../aggrun/RunningAggregateRuntimeFactory.java | 27 +- .../aggrun/SimpleWindowPushRuntime.java | 54 - .../operators/aggrun/WindowRuntimeFactory.java | 65 - .../operators/meta/PipelineAssembler.java | 25 + .../win/AbstractWindowPushRuntime.java | 173 + .../win/AbstractWindowRuntimeFactory.java | 50 + .../win/WindowAggregatorDescriptorFactory.java | 118 + .../win/WindowMaterializingPushRuntime.java | 170 + .../win/WindowMaterializingRuntimeFactory.java | 56 + .../win/WindowNestedPlansPushRuntime.java | 358 + .../win/WindowNestedPlansRuntimeFactory.java | 105 + .../operators/win/WindowSimplePushRuntime.java | 57 + .../win/WindowSimpleRuntimeFactory.java | 54 + .../tests/pushruntime/PushRuntimeTest.java | 5 +- .../data/std/primitive/BytePointable.java | 2 +- .../data/std/primitive/DoublePointable.java | 2 +- .../data/std/primitive/FloatPointable.java | 2 +- .../data/std/primitive/IntegerPointable.java | 2 +- .../data/std/primitive/LongPointable.java | 2 +- .../data/std/primitive/ShortPointable.java | 2 +- .../apache/hyracks/data/std/util/DataUtils.java | 18 + .../dataflow/common/io/RunFileReader.java | 11 + .../dataflow/common/utils/TupleUtils.java | 15 + 855 files changed, 23705 insertions(+), 5487 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f2c18aa9/asterixdb/LICENSE ---------------------------------------------------------------------- diff --git a/asterixdb/LICENSE b/asterixdb/LICENSE index 7d7f90a..442228a 100644 --- a/asterixdb/LICENSE +++ b/asterixdb/LICENSE @@ -674,4 +674,36 @@ such warranty or additional liability. END OF TERMS AND CONDITIONS --- + Portions of the AsterixDB tests + located at: + asterix-app/src/test/resources/runtimets/queries_sqlpp/window/pg_win/*, + and + asterix-app/data/tenk.tbl + + are available under PostgreSQL License: +--- + PostgreSQL Database Management System + (formerly known as Postgres, then as Postgres95) + + Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group + + Portions Copyright (c) 1994, The Regents of the University of California + + Permission to use, copy, modify, and distribute this software and its + documentation for any purpose, without fee, and without a written agreement + is hereby granted, provided that the above copyright notice and this + paragraph and the following two paragraphs appear in all copies. + + IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING + LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS + DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO + PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +--- http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f2c18aa9/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/InjectTypeCastForFunctionArgumentsRule.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/InjectTypeCastForFunctionArgumentsRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/InjectTypeCastForFunctionArgumentsRule.java index d0107c0..3678826 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/InjectTypeCastForFunctionArgumentsRule.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/InjectTypeCastForFunctionArgumentsRule.java @@ -59,6 +59,7 @@ public class InjectTypeCastForFunctionArgumentsRule implements IAlgebraicRewrite addFunctionAndArgChecker(BuiltinFunctions.IF_MISSING, null); addFunctionAndArgChecker(BuiltinFunctions.IF_NULL, null); addFunctionAndArgChecker(BuiltinFunctions.IF_MISSING_OR_NULL, null); + addFunctionAndArgChecker(BuiltinFunctions.IF_SYSTEM_NULL, null); } // allows the rule to check other functions in addition to the ones specified here http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f2c18aa9/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetAsterixPhysicalOperatorsRule.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetAsterixPhysicalOperatorsRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetAsterixPhysicalOperatorsRule.java index fdebd14..4d1d532 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetAsterixPhysicalOperatorsRule.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetAsterixPhysicalOperatorsRule.java @@ -363,19 +363,22 @@ public class SetAsterixPhysicalOperatorsRule implements IAlgebraicRewriteRule { LogicalVariable var = ((VariableReferenceExpression) orderExpr).getVariableReference(); orderColumns.add(new OrderColumn(var, p.first.getKind())); } - boolean partitionMaterialization = false; - for (Mutable<ILogicalExpression> exprRef : winOp.getExpressions()) { - ILogicalExpression expr = exprRef.getValue(); - if (expr.getExpressionTag() != LogicalExpressionTag.FUNCTION_CALL) { - throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, winOp.getSourceLocation(), - expr.getExpressionTag()); - } - AbstractFunctionCallExpression callExpr = (AbstractFunctionCallExpression) expr; - if (BuiltinFunctions.windowFunctionRequiresMaterialization(callExpr.getFunctionIdentifier())) { - partitionMaterialization = true; - break; + boolean partitionMaterialization = winOp.hasNestedPlans(); + if (!partitionMaterialization) { + for (Mutable<ILogicalExpression> exprRef : winOp.getExpressions()) { + ILogicalExpression expr = exprRef.getValue(); + if (expr.getExpressionTag() != LogicalExpressionTag.FUNCTION_CALL) { + throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, winOp.getSourceLocation(), + expr.getExpressionTag()); + } + AbstractFunctionCallExpression callExpr = (AbstractFunctionCallExpression) expr; + if (BuiltinFunctions.windowFunctionRequiresMaterialization(callExpr.getFunctionIdentifier())) { + partitionMaterialization = true; + break; + } } } + return new WindowPOperator(partitionColumns, partitionMaterialization, orderColumns); } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f2c18aa9/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SweepIllegalNonfunctionalFunctions.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SweepIllegalNonfunctionalFunctions.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SweepIllegalNonfunctionalFunctions.java index a4250c0..405ff73 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SweepIllegalNonfunctionalFunctions.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SweepIllegalNonfunctionalFunctions.java @@ -322,11 +322,40 @@ public class SweepIllegalNonfunctionalFunctions implements IAlgebraicRewriteRule for (Pair<IOrder, Mutable<ILogicalExpression>> p : op.getOrderExpressions()) { sweepExpression(p.second.getValue(), op); } - for (Mutable<ILogicalExpression> me : op.getExpressions()) { + for (Pair<IOrder, Mutable<ILogicalExpression>> p : op.getFrameValueExpressions()) { + sweepExpression(p.second.getValue(), op); + } + for (Mutable<ILogicalExpression> me : op.getFrameStartExpressions()) { + sweepExpression(me.getValue(), op); + } + for (Mutable<ILogicalExpression> me : op.getFrameEndExpressions()) { + sweepExpression(me.getValue(), op); + } + for (Mutable<ILogicalExpression> me : op.getFrameExcludeExpressions()) { sweepExpression(me.getValue(), op); } + ILogicalExpression frameOffset = op.getFrameOffset().getValue(); + if (frameOffset != null) { + sweepExpression(frameOffset, op); + } + for (Mutable<ILogicalExpression> me : op.getExpressions()) { + ILogicalExpression expr = me.getValue(); + if (isStatefulFunctionCall(expr)) { + for (Mutable<ILogicalExpression> fcallArg : ((AbstractFunctionCallExpression) expr) + .getArguments()) { + sweepExpression(fcallArg.getValue(), op); + } + } else { + throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, op.getSourceLocation()); + } + } return null; } - } + private boolean isStatefulFunctionCall(ILogicalExpression expr) { + return expr.getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL + && ((AbstractFunctionCallExpression) expr) + .getKind() == AbstractFunctionCallExpression.FunctionKind.STATEFUL; + } + } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f2c18aa9/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java index c540bbc..f21eb42 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java @@ -354,7 +354,7 @@ class InlineAllNtsInSubplanVisitor implements IQueryOperatorVisitor<ILogicalOper op.getInputs().clear(); ILogicalOperator currentOp = op; if (!orderingExprs.isEmpty()) { - OrderOperator orderOp = new OrderOperator(cloneOrderingExpression(orderingExprs)); + OrderOperator orderOp = new OrderOperator(OperatorManipulationUtil.cloneOrderExpressions(orderingExprs)); orderOp.setSourceLocation(sourceLoc); op.getInputs().add(new MutableObject<>(orderOp)); currentOp = orderOp; @@ -473,7 +473,7 @@ class InlineAllNtsInSubplanVisitor implements IQueryOperatorVisitor<ILogicalOper } orderingExprs.clear(); - orderingExprs.addAll(cloneOrderingExpression(op.getOrderExpressions())); + orderingExprs.addAll(OperatorManipulationUtil.cloneOrderExpressions(op.getOrderExpressions())); List<Pair<IOrder, Mutable<ILogicalExpression>>> orderExprList = new ArrayList<>(); // Adds keyVars to the prefix of sorting columns. @@ -764,16 +764,6 @@ class InlineAllNtsInSubplanVisitor implements IQueryOperatorVisitor<ILogicalOper } } - private List<Pair<IOrder, Mutable<ILogicalExpression>>> cloneOrderingExpression( - List<Pair<IOrder, Mutable<ILogicalExpression>>> orderExprs) { - List<Pair<IOrder, Mutable<ILogicalExpression>>> clonedOrderExprs = new ArrayList<>(); - for (Pair<IOrder, Mutable<ILogicalExpression>> orderExpr : orderExprs) { - clonedOrderExprs.add( - new Pair<>(orderExpr.first, new MutableObject<>(orderExpr.second.getValue().cloneExpression()))); - } - return clonedOrderExprs; - } - private void addPrimaryKeys(Map<LogicalVariable, LogicalVariable> varMap) { for (Entry<LogicalVariable, LogicalVariable> entry : varMap.entrySet()) { List<LogicalVariable> dependencyVars = context.findPrimaryKey(entry.getKey()); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/f2c18aa9/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java index c320bd3..e3745f7 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java @@ -909,18 +909,9 @@ class LangExpressionToPlanTranslator private AbstractFunctionCallExpression lookupBuiltinFunction(String functionName, int arity, List<Mutable<ILogicalExpression>> args, SourceLocation sourceLoc) { AbstractFunctionCallExpression f; - FunctionIdentifier fi = new FunctionIdentifier(AlgebricksBuiltinFunctions.ALGEBRICKS_NS, functionName, arity); - FunctionInfo afi = BuiltinFunctions.lookupFunction(fi); - FunctionIdentifier builtinAquafi = afi == null ? null : afi.getFunctionIdentifier(); - - if (builtinAquafi != null) { - fi = builtinAquafi; - } else { - fi = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, functionName, arity); - afi = BuiltinFunctions.lookupFunction(fi); - if (afi == null) { - return null; - } + FunctionIdentifier fi = getBuiltinFunctionIdentifier(functionName, arity); + if (fi == null) { + return null; } if (BuiltinFunctions.isBuiltinAggregateFunction(fi)) { f = BuiltinFunctions.makeAggregateFunctionExpression(fi, args); @@ -929,7 +920,7 @@ class LangExpressionToPlanTranslator new UnnestingFunctionCallExpression(FunctionUtil.getFunctionInfo(fi), args); ufce.setReturnsUniqueValues(BuiltinFunctions.returnsUniqueValues(fi)); f = ufce; - } else if (BuiltinFunctions.isBuiltinWindowFunction(fi)) { + } else if (BuiltinFunctions.isWindowFunction(fi)) { f = BuiltinFunctions.makeWindowFunctionExpression(fi, args); } else { f = new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(fi), args); @@ -938,6 +929,23 @@ class LangExpressionToPlanTranslator return f; } + protected FunctionIdentifier getBuiltinFunctionIdentifier(String functionName, int arity) { + FunctionIdentifier fi = new FunctionIdentifier(AlgebricksBuiltinFunctions.ALGEBRICKS_NS, functionName, arity); + FunctionInfo afi = BuiltinFunctions.lookupFunction(fi); + FunctionIdentifier builtinAquafi = afi == null ? null : afi.getFunctionIdentifier(); + + if (builtinAquafi != null) { + fi = builtinAquafi; + } else { + fi = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, functionName, arity); + afi = BuiltinFunctions.lookupFunction(fi); + if (afi == null) { + return null; + } + } + return fi; + } + @Override public Pair<ILogicalOperator, LogicalVariable> visit(FunctionDecl fd, Mutable<ILogicalOperator> tupSource) { throw new IllegalStateException("Function declarations should be inlined at AST rewriting phase."); @@ -950,22 +958,9 @@ class LangExpressionToPlanTranslator Mutable<ILogicalOperator> topOp = tupSource; LogicalVariable groupRecordVar = null; if (gc.hasGroupVar()) { - List<Pair<Expression, Identifier>> groupFieldList = gc.getGroupFieldList(); - List<Mutable<ILogicalExpression>> groupRecordConstructorArgList = new ArrayList<>(); - for (Pair<Expression, Identifier> groupField : groupFieldList) { - ILogicalExpression groupFieldNameExpr = - langExprToAlgExpression(new LiteralExpr(new StringLiteral(groupField.second.getValue())), - topOp).first; - groupRecordConstructorArgList.add(new MutableObject<>(groupFieldNameExpr)); - ILogicalExpression groupFieldExpr = langExprToAlgExpression(groupField.first, topOp).first; - groupRecordConstructorArgList.add(new MutableObject<>(groupFieldExpr)); - } - ScalarFunctionCallExpression groupRecordConstr = new ScalarFunctionCallExpression( - FunctionUtil.getFunctionInfo(BuiltinFunctions.OPEN_RECORD_CONSTRUCTOR), - groupRecordConstructorArgList); - groupRecordConstr.setSourceLocation(sourceLoc); - groupRecordVar = context.newVar(); + AbstractFunctionCallExpression groupRecordConstr = + createRecordConstructor(gc.getGroupFieldList(), topOp, sourceLoc); AssignOperator groupRecordVarAssignOp = new AssignOperator(groupRecordVar, new MutableObject<>(groupRecordConstr)); groupRecordVarAssignOp.getInputs().add(topOp); @@ -981,12 +976,14 @@ class LangExpressionToPlanTranslator gOp.addGbyExpression(v, eo.first); topOp = eo.second; } - for (GbyVariableExpressionPair ve : gc.getDecorPairList()) { - VariableExpr vexpr = ve.getVar(); - LogicalVariable v = vexpr == null ? context.newVar() : context.newVarFromExpression(vexpr); - Pair<ILogicalExpression, Mutable<ILogicalOperator>> eo = langExprToAlgExpression(ve.getExpr(), topOp); - gOp.addDecorExpression(v, eo.first); - topOp = eo.second; + if (gc.hasDecorList()) { + for (GbyVariableExpressionPair ve : gc.getDecorPairList()) { + VariableExpr vexpr = ve.getVar(); + LogicalVariable v = vexpr == null ? context.newVar() : context.newVarFromExpression(vexpr); + Pair<ILogicalExpression, Mutable<ILogicalOperator>> eo = langExprToAlgExpression(ve.getExpr(), topOp); + gOp.addDecorExpression(v, eo.first); + topOp = eo.second; + } } gOp.getInputs().add(topOp); @@ -1026,7 +1023,23 @@ class LangExpressionToPlanTranslator return new Pair<>(gOp, null); } - private ILogicalPlan createNestedPlanWithAggregate(LogicalVariable aggOutputVar, FunctionIdentifier aggFunc, + protected AbstractFunctionCallExpression createRecordConstructor(List<Pair<Expression, Identifier>> fieldList, + Mutable<ILogicalOperator> inputOp, SourceLocation sourceLoc) throws CompilationException { + List<Mutable<ILogicalExpression>> args = new ArrayList<>(); + for (Pair<Expression, Identifier> field : fieldList) { + ILogicalExpression fieldNameExpr = + langExprToAlgExpression(new LiteralExpr(new StringLiteral(field.second.getValue())), inputOp).first; + args.add(new MutableObject<>(fieldNameExpr)); + ILogicalExpression fieldExpr = langExprToAlgExpression(field.first, inputOp).first; + args.add(new MutableObject<>(fieldExpr)); + } + ScalarFunctionCallExpression recordConstr = new ScalarFunctionCallExpression( + FunctionUtil.getFunctionInfo(BuiltinFunctions.OPEN_RECORD_CONSTRUCTOR), args); + recordConstr.setSourceLocation(sourceLoc); + return recordConstr; + } + + protected ILogicalPlan createNestedPlanWithAggregate(LogicalVariable aggOutputVar, FunctionIdentifier aggFunc, ILogicalExpression aggFnInput, Mutable<ILogicalOperator> aggOpInput) { SourceLocation sourceLoc = aggFnInput.getSourceLocation(); AggregateFunctionCallExpression aggFnCall = BuiltinFunctions.makeAggregateFunctionExpression(aggFunc, @@ -1530,7 +1543,7 @@ class LangExpressionToPlanTranslator return createFunctionCallExpression(fid, sourceLoc); } - private static AbstractFunctionCallExpression createFunctionCallExpression(FunctionIdentifier fid, + protected static AbstractFunctionCallExpression createFunctionCallExpression(FunctionIdentifier fid, SourceLocation sourceLoc) { ScalarFunctionCallExpression callExpr = new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(fid)); callExpr.setSourceLocation(sourceLoc);
