From 9aa99795829ee0bdb29483102326fe36d2a4787b Mon Sep 17 00:00:00 2001 From: Alexandr Romanenko Date: Thu, 16 Jan 2025 23:01:50 +0100 Subject: [PATCH 01/16] feat(tesseract): Subqueries support --- .../postgres/sql-generation-logic.test.ts | 4 +- .../src/cube_bridge/dimension_definition.rs | 4 + .../cubesqlplanner/src/plan/builder/select.rs | 16 ++ .../cubesqlplanner/src/plan/filter.rs | 1 + .../cubesqlplanner/src/plan/order.rs | 1 + .../cubesqlplanner/src/plan/schema/schema.rs | 2 +- .../cubesqlplanner/src/plan/select.rs | 2 + .../src/planner/base_dimension.rs | 25 ++- .../src/planner/base_measure.rs | 76 +++++-- .../cubesqlplanner/src/planner/base_query.rs | 47 +--- .../src/planner/base_time_dimension.rs | 22 +- .../src/planner/planners/common_utils.rs | 6 +- .../planners/dimension_subquery_planner.rs | 203 ++++++++++++++++++ .../full_key_query_aggregate_planner.rs | 6 +- .../src/planner/planners/join_planner.rs | 10 +- .../src/planner/planners/mod.rs | 4 + .../multi_stage/member_query_planner.rs | 2 +- .../multiplied_measures_query_planner.rs | 88 ++++++-- .../src/planner/planners/query_planner.rs | 70 ++++++ .../planner/planners/simple_query_planer.rs | 37 ++-- .../collectors/cube_names_collector.rs | 9 + .../collectors/join_hints_collector.rs | 9 + .../planner/sql_evaluator/collectors/mod.rs | 4 + .../collectors/sub_query_dimensions.rs | 79 +++++++ .../src/planner/sql_evaluator/mod.rs | 2 +- .../src/planner/sql_evaluator/sql_call.rs | 12 ++ .../sql_evaluator/sql_nodes/evaluate_sql.rs | 15 ++ .../sql_evaluator/sql_nodes/factory.rs | 13 -- .../sql_nodes/leaf_time_dimension.rs | 55 ----- .../planner/sql_evaluator/sql_nodes/mod.rs | 1 - .../sql_evaluator/symbols/dimension_symbol.rs | 13 ++ .../sql_evaluator/symbols/member_symbol.rs | 21 +- .../src/planner/sql_evaluator/symbols/mod.rs | 3 + .../symbols/time_dimension_symbol.rs | 44 ++++ 34 files changed, 721 insertions(+), 185 deletions(-) create mode 100644 rust/cubesqlplanner/cubesqlplanner/src/planner/planners/dimension_subquery_planner.rs create mode 100644 rust/cubesqlplanner/cubesqlplanner/src/planner/planners/query_planner.rs create mode 100644 rust/cubesqlplanner/cubesqlplanner/src/planner/sql_evaluator/collectors/sub_query_dimensions.rs delete mode 100644 rust/cubesqlplanner/cubesqlplanner/src/planner/sql_evaluator/sql_nodes/leaf_time_dimension.rs create mode 100644 rust/cubesqlplanner/cubesqlplanner/src/planner/sql_evaluator/symbols/time_dimension_symbol.rs diff --git a/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation-logic.test.ts b/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation-logic.test.ts index c902b7d1faf37..e8d6d6e4b2aac 100644 --- a/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation-logic.test.ts +++ b/packages/cubejs-schema-compiler/test/integration/postgres/sql-generation-logic.test.ts @@ -453,7 +453,7 @@ describe('SQL Generation', () => { } }); - it('having filter with operator OR 1', async () => { + it('having filter with operator OR', async () => { await compiler.compile(); const query = new PostgresQuery({ joinGraph, cubeEvaluator, compiler }, { @@ -648,7 +648,7 @@ describe('SQL Generation', () => { }); }); - it('where filter with operators OR & AND 1', async () => { + it('where filter with operators OR & AND', async () => { await compiler.compile(); const query = new PostgresQuery({ joinGraph, cubeEvaluator, compiler }, { diff --git a/rust/cubesqlplanner/cubesqlplanner/src/cube_bridge/dimension_definition.rs b/rust/cubesqlplanner/cubesqlplanner/src/cube_bridge/dimension_definition.rs index c4936c31259ac..ed99896573500 100644 --- a/rust/cubesqlplanner/cubesqlplanner/src/cube_bridge/dimension_definition.rs +++ b/rust/cubesqlplanner/cubesqlplanner/src/cube_bridge/dimension_definition.rs @@ -17,6 +17,10 @@ pub struct DimenstionDefinitionStatic { pub owned_by_cube: Option, #[serde(rename = "multiStage")] pub multi_stage: Option, + #[serde(rename = "subQuery")] + pub sub_query: Option, + #[serde(rename = "propagateFiltersToSubQuery")] + pub propagate_filters_to_sub_query: Option, } #[nativebridge::native_bridge(DimenstionDefinitionStatic)] diff --git a/rust/cubesqlplanner/cubesqlplanner/src/plan/builder/select.rs b/rust/cubesqlplanner/cubesqlplanner/src/plan/builder/select.rs index 1a9482f68715f..0631a868cec13 100644 --- a/rust/cubesqlplanner/cubesqlplanner/src/plan/builder/select.rs +++ b/rust/cubesqlplanner/cubesqlplanner/src/plan/builder/select.rs @@ -40,6 +40,22 @@ impl SelectBuilder { } } + pub fn new_from_select(select: Rc