Skip to content

Commit 88832ae

Browse files
committed
in work
1 parent d52804a commit 88832ae

File tree

24 files changed

+366
-195
lines changed

24 files changed

+366
-195
lines changed

packages/cubejs-schema-compiler/src/adapter/BaseQuery.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -631,9 +631,8 @@ export class BaseQuery {
631631

632632
buildSqlAndParamsRust(exportAnnotatedSql) {
633633

634-
635634
const order = this.options.order && R.pipe(
636-
R.map((hash) => (!hash || !hash.id) ? null : hash),
635+
R.map((hash) => (!hash || !hash.id) ? null : hash),
637636
R.reject(R.isNil),
638637
)(this.options.order);
639638

@@ -660,8 +659,14 @@ export class BaseQuery {
660659
return res;
661660
}
662661

662+
allCubeMembers(path) {
663+
const fromPath = this.cubeEvaluator.cubeFromPath(path);
664+
665+
return Object.keys(fromPath.measures).concat(Object.keys(fromPath.dimensions));
666+
}
667+
663668
getAllocatedParams() {
664-
return this.paramAllocator.getParams()
669+
return this.paramAllocator.getParams();
665670
}
666671

667672
// FIXME helper for native generator, maybe should be moved entire to rust

packages/cubejs-schema-compiler/src/compiler/CubeSymbols.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ export class CubeSymbols {
106106
},
107107
set segments(v) {
108108
// Dont allow to modify
109-
}
109+
},
110110
}, cubeDefinition);
111111

112112
if (cubeDefinition.extends) {

packages/cubejs-schema-compiler/test/integration/postgres/sql-generation.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,7 @@ describe('SQL Generation', () => {
561561
}]
562562
});
563563

564-
return dbRunner.testQuery(query.buildSqlAndParams()).then(res => {
564+
return dbRunner.testQuery(query.buildSqlAndParamsTest()).then(res => {
565565
expect(res).toEqual(
566566
[
567567
{

rust/cubesqlplanner/cubesqlplanner/src/cube_bridge/base_tools.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,5 @@ pub trait BaseTools {
4444
date_range: Vec<String>,
4545
) -> Result<Vec<Vec<String>>, CubeError>;
4646
fn get_allocated_params(&self) -> Result<Vec<String>, CubeError>;
47+
fn all_cube_members(&self, path: String) -> Result<Vec<String>, CubeError>;
4748
}

rust/cubesqlplanner/cubesqlplanner/src/cube_bridge/cube_definition.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use super::dimension_definition::DimenstionDefinitionStatic;
2+
use super::measure_definition::MeasureDefinitionStatic;
13
use super::memeber_sql::{MemberSql, NativeMemberSql};
24
use cubenativeutils::wrappers::serializer::{
35
NativeDeserialize, NativeDeserializer, NativeSerialize,
@@ -7,6 +9,7 @@ use cubenativeutils::wrappers::NativeObjectHandle;
79
use cubenativeutils::CubeError;
810
use serde::{Deserialize, Serialize};
911
use std::any::Any;
12+
use std::collections::HashMap;
1013
use std::rc::Rc;
1114

1215
#[derive(Serialize, Deserialize, Debug)]

rust/cubesqlplanner/cubesqlplanner/src/plan/builder/select.rs

Lines changed: 67 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
use crate::plan::{
22
AliasedExpr, Cte, Expr, Filter, From, MemberExpression, OrderBy, Schema, Select,
3+
SingleAliasedSource, SingleSource,
34
};
5+
6+
use crate::planner::sql_evaluator::sql_nodes::SqlNodesFactory;
7+
use crate::planner::sql_evaluator::symbols::MemberSymbol;
48
use crate::planner::{BaseMember, VisitorContext};
9+
use std::collections::HashMap;
510
use std::rc::Rc;
611

712
pub struct SelectBuilder {
@@ -11,16 +16,17 @@ pub struct SelectBuilder {
1116
group_by: Vec<Expr>,
1217
having: Option<Filter>,
1318
order_by: Vec<OrderBy>,
14-
context: Rc<VisitorContext>,
19+
nodes_factory: SqlNodesFactory,
1520
ctes: Vec<Rc<Cte>>,
1621
is_distinct: bool,
1722
limit: Option<usize>,
1823
offset: Option<usize>,
1924
input_schema: Rc<Schema>,
25+
result_schema: Schema,
2026
}
2127

2228
impl SelectBuilder {
23-
pub fn new(from: From, context: VisitorContext) -> Self {
29+
pub fn new(from: From, nodes_factory: SqlNodesFactory) -> Self {
2430
let input_schema = from.schema.clone();
2531
Self {
2632
projection_columns: vec![],
@@ -29,12 +35,13 @@ impl SelectBuilder {
2935
group_by: vec![],
3036
having: None,
3137
order_by: vec![],
32-
context: Rc::new(context),
38+
nodes_factory,
3339
ctes: vec![],
3440
is_distinct: false,
3541
limit: None,
3642
offset: None,
3743
input_schema,
44+
result_schema: Schema::empty(),
3845
}
3946
}
4047

@@ -54,6 +61,7 @@ impl SelectBuilder {
5461
expr,
5562
alias: alias.clone(),
5663
};
64+
self.resolve_render_reference_for_member(&member.member_evaluator());
5765

5866
self.projection_columns.push(aliased_expr);
5967
}
@@ -85,19 +93,73 @@ impl SelectBuilder {
8593
pub fn set_offset(&mut self, offset: Option<usize>) {
8694
self.offset = offset;
8795
}
96+
8897
pub fn set_ctes(&mut self, ctes: Vec<Rc<Cte>>) {
8998
self.ctes = ctes;
9099
}
91100

92-
pub fn build(self) -> Select {
101+
fn resolve_render_reference_for_member(&mut self, member: &Rc<MemberSymbol>) {
102+
let member_name = member.full_name();
103+
if !self
104+
.nodes_factory
105+
.render_references()
106+
.contains_key(&member_name)
107+
{
108+
if let Some(reference) = self
109+
.input_schema
110+
.resolve_member_reference(&member_name, &None)
111+
{
112+
self.nodes_factory
113+
.add_render_reference(member_name, reference);
114+
} else {
115+
for dep in member.get_dependencies() {
116+
self.resolve_render_reference_for_member(&dep);
117+
}
118+
}
119+
}
120+
}
121+
122+
fn make_cube_references(&self) -> HashMap<String, String> {
123+
let mut refs = HashMap::new();
124+
match &self.from.source {
125+
crate::plan::FromSource::Single(source) => {
126+
self.add_cube_reference_if_needed(source, &mut refs)
127+
}
128+
crate::plan::FromSource::Join(join) => {
129+
self.add_cube_reference_if_needed(&join.root, &mut refs);
130+
for join_item in join.joins.iter() {
131+
self.add_cube_reference_if_needed(&join_item.from, &mut refs);
132+
}
133+
}
134+
crate::plan::FromSource::Empty => {}
135+
}
136+
refs
137+
}
138+
139+
fn add_cube_reference_if_needed(
140+
&self,
141+
source: &SingleAliasedSource,
142+
refs: &mut HashMap<String, String>,
143+
) {
144+
match &source.source {
145+
SingleSource::Cube(cube) => {
146+
refs.insert(cube.name().clone(), source.alias.clone());
147+
}
148+
_ => {}
149+
}
150+
}
151+
152+
pub fn build(mut self) -> Select {
153+
let cube_references = self.make_cube_references();
154+
self.nodes_factory.set_cube_name_references(cube_references);
93155
Select {
94156
projection_columns: self.projection_columns,
95157
from: self.from,
96158
filter: self.filter,
97159
group_by: self.group_by,
98160
having: self.having,
99161
order_by: self.order_by,
100-
context: self.context.clone(),
162+
context: Rc::new(VisitorContext::new(&self.nodes_factory)),
101163
ctes: self.ctes,
102164
is_distinct: self.is_distinct,
103165
limit: self.limit,

rust/cubesqlplanner/cubesqlplanner/src/plan/expression.rs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,44 @@ impl MemberExpression {
3131
}
3232
}
3333

34+
#[derive(Clone)]
35+
pub struct ReferenceExpression {
36+
pub reference: String,
37+
pub source: Option<String>,
38+
}
39+
40+
impl ReferenceExpression {
41+
pub fn new(reference: String, source: Option<String>) -> Self {
42+
Self { reference, source }
43+
}
44+
45+
pub fn to_sql(&self, templates: &PlanSqlTemplates) -> Result<String, CubeError> {
46+
templates.column_reference(&self.source, &self.reference)
47+
}
48+
}
49+
3450
#[derive(Clone)]
3551
pub enum Expr {
3652
Member(MemberExpression),
53+
Reference(ReferenceExpression),
3754
}
3855

3956
impl Expr {
57+
pub fn new_member(member: Rc<dyn BaseMember>, source: Option<String>) -> Self {
58+
Self::Member(MemberExpression::new(member, source))
59+
}
60+
pub fn new_reference(reference: String, source: Option<String>) -> Self {
61+
Self::Reference(ReferenceExpression::new(reference, source))
62+
}
4063
pub fn to_sql(
4164
&self,
4265
templates: &PlanSqlTemplates,
4366
context: Rc<VisitorContext>,
4467
schema: Rc<Schema>,
4568
) -> Result<String, CubeError> {
4669
match self {
47-
Expr::Member(member) => member.to_sql(templates, context, schema),
70+
Self::Member(member) => member.to_sql(templates, context, schema),
71+
Self::Reference(reference) => reference.to_sql(templates),
4872
}
4973
}
5074
}

rust/cubesqlplanner/cubesqlplanner/src/plan/from.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,7 @@ impl SingleAliasedSource {
7676
pub fn make_schema(&self) -> Schema {
7777
match &self.source {
7878
SingleSource::Subquery(query) => query.make_schema(Some(self.alias.clone())),
79-
SingleSource::Cube(cube) => {
80-
let mut schema = Schema::empty();
81-
schema.add_cube(SchemaCube::new(cube.name().clone(), self.alias.clone()));
82-
schema
83-
}
79+
SingleSource::Cube(cube) => Schema::empty(), //cube.schema().move_to_source(&self.alias),
8480
SingleSource::TableReference(_, schema) => schema.move_to_source(&self.alias),
8581
}
8682
}

rust/cubesqlplanner/cubesqlplanner/src/plan/schema.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ use std::rc::Rc;
77
pub struct SchemaColumn {
88
pub table_name: Option<String>,
99
pub alias: String,
10-
pub origin_member: String,
10+
pub origin_member: Option<String>,
1111
}
1212

1313
impl SchemaColumn {
14-
pub fn new(table_name: Option<String>, alias: String, origin_member: String) -> Self {
14+
pub fn new(table_name: Option<String>, alias: String, origin_member: Option<String>) -> Self {
1515
Self {
1616
table_name,
1717
alias,
@@ -107,7 +107,11 @@ impl Schema {
107107
if source.is_some() && source != &col.table_name {
108108
return false;
109109
}
110-
&col.origin_member == member_name
110+
if let Some(origin_member) = &col.origin_member {
111+
origin_member == member_name
112+
} else {
113+
false
114+
}
111115
})
112116
}
113117

rust/cubesqlplanner/cubesqlplanner/src/plan/select.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,15 @@ impl Select {
6363
let schema_col = SchemaColumn::new(
6464
self_alias.clone(),
6565
col.alias.clone(),
66-
member.member.full_name(),
66+
Some(member.member.full_name()),
67+
);
68+
schema.add_column(schema_col);
69+
}
70+
Expr::Reference(reference) => {
71+
let schema_col = SchemaColumn::new(
72+
self_alias.clone(),
73+
col.alias.clone(),
74+
None, //"".to_string(), //member.member.full_name(),
6775
);
6876
schema.add_column(schema_col);
6977
}

0 commit comments

Comments
 (0)