Skip to content

Commit 0ed925a

Browse files
committed
in work
1 parent 1854ae8 commit 0ed925a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+1168
-892
lines changed

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

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -605,34 +605,9 @@ export class BaseQuery {
605605
}
606606
}
607607

608-
buildSqlAndParamsTest(exportAnnotatedSql) {
609-
if (!this.options.preAggregationQuery && !this.options.disableExternalPreAggregations && this.externalQueryClass) {
610-
if (this.externalPreAggregationQuery()) { // TODO performance
611-
return this.externalQuery().buildSqlAndParams(exportAnnotatedSql);
612-
}
613-
}
614-
const js_res = this.compilers.compiler.withQuery(
615-
this,
616-
() => this.cacheValue(
617-
['buildSqlAndParams', exportAnnotatedSql],
618-
() => this.paramAllocator.buildSqlAndParams(
619-
this.buildParamAnnotatedSql(),
620-
exportAnnotatedSql,
621-
this.shouldReuseParams
622-
),
623-
{ cache: this.queryCache }
624-
)
625-
);
626-
console.log('js result: ', js_res[0]);
627-
const rust = this.buildSqlAndParamsRust(exportAnnotatedSql);
628-
console.log('rust result: ', rust[0]);
629-
return js_res;
630-
}
631-
632608
buildSqlAndParamsRust(exportAnnotatedSql) {
633-
634609
const order = this.options.order && R.pipe(
635-
R.map((hash) => (!hash || !hash.id) ? null : hash),
610+
R.map((hash) => ((!hash || !hash.id) ? null : hash)),
636611
R.reject(R.isNil),
637612
)(this.options.order);
638613

@@ -644,7 +619,7 @@ export class BaseQuery {
644619
joinRoot: this.join.root,
645620
joinGraph: this.joinGraph,
646621
cubeEvaluator: this.cubeEvaluator,
647-
order: order,
622+
order,
648623
filters: this.options.filters,
649624
limit: this.options.limit ? this.options.limit.toString() : null,
650625
rowLimit: this.options.rowLimit ? this.options.rowLimit.toString() : null,
@@ -847,7 +822,6 @@ export class BaseQuery {
847822
} = this.fullKeyQueryAggregateMeasures();
848823

849824
if (!multipliedMeasures.length && !cumulativeMeasures.length && !multiStageMembers.length) {
850-
console.log("!!!!! LLLOOOO!!!!");
851825
return this.simpleQuery();
852826
}
853827

@@ -1061,8 +1035,6 @@ export class BaseQuery {
10611035
const allMemberChildren = this.collectAllMemberChildren(context);
10621036
const memberToIsMultiStage = this.collectAllMultiStageMembers(allMemberChildren);
10631037

1064-
console.log("!!! measure to her ", measureToHierarchy);
1065-
10661038
const hasMultiStageMembers = (m) => {
10671039
if (memberToIsMultiStage[m]) {
10681040
return true;

packages/cubejs-schema-compiler/test/integration/clickhouse/ClickHouseDbRunner.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import type { StartedTestContainer } from 'testcontainers';
55
import { format as formatSql } from 'sqlstring';
66
import { v4 as uuidv4 } from 'uuid';
77
import { ClickHouseQuery } from '../../../src/adapter/ClickHouseQuery';
8-
import { BaseDbRunner } from "../utils/BaseDbRunner";
8+
import { BaseDbRunner } from '../utils/BaseDbRunner';
99

1010
process.env.TZ = 'GMT';
1111

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
@@ -2348,7 +2348,7 @@ describe('SQL Generation', () => {
23482348
]
23492349
));
23502350

2351-
it('rank measure', async () => runQueryTest(
2351+
it('rank measure 1', async () => runQueryTest(
23522352
{
23532353
measures: ['visitors.revenue_rank'],
23542354
},

packages/cubejs-schema-compiler/test/unit/base-query.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1596,7 +1596,7 @@ describe('SQL Generation', () => {
15961596
sql: 'product_id',
15971597
type: 'avg',
15981598
filters: [
1599-
{ sql: `{FILTER_PARAMS.Order.category.filter('category')}` }
1599+
{ sql: '{FILTER_PARAMS.Order.category.filter(\'category\')}' }
16001600
]
16011601
}
16021602
],
@@ -1613,7 +1613,7 @@ describe('SQL Generation', () => {
16131613
},
16141614
{
16151615
name: 'proxied',
1616-
sql: `{FILTER_PARAMS.Order.type.filter("x => type = 'online'")}`,
1616+
sql: '{FILTER_PARAMS.Order.type.filter("x => type = \'online\'")}',
16171617
type: 'boolean',
16181618
}
16191619
]

packages/cubejs-schema-compiler/test/unit/pre-aggregations.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,8 @@ describe('pre-aggregations', () => {
217217
console.log(JSON.stringify(preAggregationsDescription, null, 2));
218218

219219
expect(preAggregationsDescription.length).toEqual(2);
220-
expect(preAggregationsDescription[0].preAggregationId).toEqual("Orders.simple1");
221-
expect(preAggregationsDescription[1].preAggregationId).toEqual("Orders.simple2");
220+
expect(preAggregationsDescription[0].preAggregationId).toEqual('Orders.simple1');
221+
expect(preAggregationsDescription[1].preAggregationId).toEqual('Orders.simple2');
222222
});
223223

224224
// @link https://github.com/cube-js/cube/issues/6623

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use super::dimension_definition::DimenstionDefinitionStatic;
2-
use super::measure_definition::MeasureDefinitionStatic;
31
use super::memeber_sql::{MemberSql, NativeMemberSql};
42
use cubenativeutils::wrappers::serializer::{
53
NativeDeserialize, NativeDeserializer, NativeSerialize,
@@ -9,7 +7,6 @@ use cubenativeutils::wrappers::NativeObjectHandle;
97
use cubenativeutils::CubeError;
108
use serde::{Deserialize, Serialize};
119
use std::any::Any;
12-
use std::collections::HashMap;
1310
use std::rc::Rc;
1411

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

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

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,60 @@
11
use crate::plan::{
2-
AliasedExpr, Cte, Expr, Filter, From, MemberExpression, OrderBy, Schema, Select,
2+
AliasedExpr, Cte, Expr, Filter, From, MemberExpression, OrderBy, Schema, SchemaColumn, Select,
33
SingleAliasedSource, SingleSource,
44
};
55

66
use crate::planner::sql_evaluator::sql_nodes::SqlNodesFactory;
7-
use crate::planner::sql_evaluator::symbols::MemberSymbol;
87
use crate::planner::{BaseMember, VisitorContext};
98
use std::collections::HashMap;
109
use std::rc::Rc;
1110

1211
pub struct SelectBuilder {
1312
projection_columns: Vec<AliasedExpr>,
14-
from: From,
13+
from: Rc<From>,
1514
filter: Option<Filter>,
1615
group_by: Vec<Expr>,
1716
having: Option<Filter>,
1817
order_by: Vec<OrderBy>,
19-
nodes_factory: SqlNodesFactory,
2018
ctes: Vec<Rc<Cte>>,
2119
is_distinct: bool,
2220
limit: Option<usize>,
2321
offset: Option<usize>,
24-
input_schema: Rc<Schema>,
2522
result_schema: Schema,
2623
}
2724

2825
impl SelectBuilder {
29-
pub fn new(from: From, nodes_factory: SqlNodesFactory) -> Self {
30-
let input_schema = from.schema.clone();
26+
pub fn new(from: Rc<From>) -> Self {
3127
Self {
3228
projection_columns: vec![],
3329
from,
3430
filter: None,
3531
group_by: vec![],
3632
having: None,
3733
order_by: vec![],
38-
nodes_factory,
3934
ctes: vec![],
4035
is_distinct: false,
4136
limit: None,
4237
offset: None,
43-
input_schema,
4438
result_schema: Schema::empty(),
4539
}
4640
}
4741

48-
pub fn add_projection_member(
49-
&mut self,
50-
member: &Rc<dyn BaseMember>,
51-
source: Option<String>,
52-
alias: Option<String>,
53-
) {
42+
pub fn add_projection_member(&mut self, member: &Rc<dyn BaseMember>, alias: Option<String>) {
5443
let alias = if let Some(alias) = alias {
5544
alias
5645
} else {
57-
self.input_schema.resolve_member_alias(&member, &source)
46+
member.alias_name()
5847
};
59-
let expr = Expr::Member(MemberExpression::new(member.clone(), source));
48+
49+
let expr = Expr::Member(MemberExpression::new(member.clone()));
6050
let aliased_expr = AliasedExpr {
6151
expr,
6252
alias: alias.clone(),
6353
};
6454

6555
self.projection_columns.push(aliased_expr);
56+
self.result_schema
57+
.add_column(SchemaColumn::new(alias.clone(), Some(member.full_name())));
6658
}
6759

6860
pub fn set_filter(&mut self, filter: Option<Filter>) {
@@ -127,21 +119,43 @@ impl SelectBuilder {
127119
}
128120
}
129121

130-
pub fn build(mut self) -> Select {
122+
fn make_asteriks_schema(&self) -> Rc<Schema> {
123+
let schema = match &self.from.source {
124+
crate::plan::FromSource::Empty => Rc::new(Schema::empty()),
125+
crate::plan::FromSource::Single(source) => source.source.schema(),
126+
crate::plan::FromSource::Join(join) => {
127+
let mut schema = Schema::empty();
128+
schema.merge(join.root.source.schema().as_ref());
129+
for itm in join.joins.iter() {
130+
schema.merge(itm.from.source.schema().as_ref())
131+
}
132+
Rc::new(schema)
133+
}
134+
};
135+
schema
136+
}
137+
138+
pub fn build(self, mut nodes_factory: SqlNodesFactory) -> Select {
131139
let cube_references = self.make_cube_references();
132-
self.nodes_factory.set_cube_name_references(cube_references);
140+
nodes_factory.set_cube_name_references(cube_references);
141+
let schema = if self.projection_columns.is_empty() {
142+
self.make_asteriks_schema()
143+
} else {
144+
Rc::new(self.result_schema)
145+
};
133146
Select {
134147
projection_columns: self.projection_columns,
135148
from: self.from,
136149
filter: self.filter,
137150
group_by: self.group_by,
138151
having: self.having,
139152
order_by: self.order_by,
140-
context: Rc::new(VisitorContext::new(&self.nodes_factory)),
153+
context: Rc::new(VisitorContext::new(&nodes_factory)),
141154
ctes: self.ctes,
142155
is_distinct: self.is_distinct,
143156
limit: self.limit,
144157
offset: self.offset,
158+
schema,
145159
}
146160
}
147161
}

rust/cubesqlplanner/cubesqlplanner/src/plan/cte.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::{QueryPlan, Schema, Select};
1+
use super::{QueryPlan, Select};
22
use crate::planner::sql_templates::PlanSqlTemplates;
33
use cubenativeutils::CubeError;
44

@@ -22,10 +22,6 @@ impl Cte {
2222
}
2323
}
2424

25-
pub fn make_schema(&self) -> Schema {
26-
self.query.make_schema(Some(self.name().clone()))
27-
}
28-
2925
pub fn query(&self) -> &Rc<QueryPlan> {
3026
&self.query
3127
}
Lines changed: 14 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::Schema;
1+
use super::QualifiedColumnName;
22
use crate::planner::sql_templates::PlanSqlTemplates;
33
use crate::planner::{BaseMember, VisitorContext};
44
use cubenativeutils::CubeError;
@@ -7,68 +7,45 @@ use std::rc::Rc;
77
#[derive(Clone)]
88
pub struct MemberExpression {
99
pub member: Rc<dyn BaseMember>,
10-
pub source: Option<String>,
1110
}
1211

1312
impl MemberExpression {
14-
pub fn new(member: Rc<dyn BaseMember>, source: Option<String>) -> Self {
15-
Self { member, source }
13+
pub fn new(member: Rc<dyn BaseMember>) -> Self {
14+
Self { member }
1615
}
1716

1817
pub fn to_sql(
1918
&self,
20-
templates: &PlanSqlTemplates,
19+
_templates: &PlanSqlTemplates,
2120
context: Rc<VisitorContext>,
22-
schema: Rc<Schema>,
2321
) -> Result<String, CubeError> {
24-
if let Some(reference_column) =
25-
schema.find_column_for_member(&self.member.full_name(), &self.source)
26-
{
27-
templates.column_reference(&reference_column.table_name, &reference_column.alias)
28-
} else {
29-
self.member.to_sql(context, schema)
30-
}
31-
}
32-
}
33-
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)
22+
self.member.to_sql(context)
4723
}
4824
}
4925

5026
#[derive(Clone)]
5127
pub enum Expr {
5228
Member(MemberExpression),
53-
Reference(ReferenceExpression),
29+
Reference(QualifiedColumnName),
5430
}
5531

5632
impl Expr {
57-
pub fn new_member(member: Rc<dyn BaseMember>, source: Option<String>) -> Self {
58-
Self::Member(MemberExpression::new(member, source))
33+
pub fn new_member(member: Rc<dyn BaseMember>) -> Self {
34+
Self::Member(MemberExpression::new(member))
5935
}
60-
pub fn new_reference(reference: String, source: Option<String>) -> Self {
61-
Self::Reference(ReferenceExpression::new(reference, source))
36+
pub fn new_reference(source: Option<String>, reference: String) -> Self {
37+
Self::Reference(QualifiedColumnName::new(source, reference))
6238
}
6339
pub fn to_sql(
6440
&self,
6541
templates: &PlanSqlTemplates,
6642
context: Rc<VisitorContext>,
67-
schema: Rc<Schema>,
6843
) -> Result<String, CubeError> {
6944
match self {
70-
Self::Member(member) => member.to_sql(templates, context, schema),
71-
Self::Reference(reference) => reference.to_sql(templates),
45+
Self::Member(member) => member.to_sql(templates, context),
46+
Self::Reference(reference) => {
47+
templates.column_reference(reference.source(), &reference.name())
48+
}
7249
}
7350
}
7451
}

rust/cubesqlplanner/cubesqlplanner/src/plan/filter.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use super::Schema;
21
use crate::planner::filter::BaseFilter;
32
use crate::planner::sql_templates::PlanSqlTemplates;
43
use crate::planner::VisitorContext;
@@ -54,15 +53,14 @@ impl FilterItem {
5453
&self,
5554
templates: &PlanSqlTemplates,
5655
context: Rc<VisitorContext>,
57-
schema: Rc<Schema>,
5856
) -> Result<String, CubeError> {
5957
let res = match self {
6058
FilterItem::Group(group) => {
6159
let operator = format!(" {} ", group.operator.to_string());
6260
let items_sql = group
6361
.items
6462
.iter()
65-
.map(|itm| itm.to_sql(templates, context.clone(), schema.clone()))
63+
.map(|itm| itm.to_sql(templates, context.clone()))
6664
.collect::<Result<Vec<_>, _>>()?
6765
.into_iter()
6866
.filter(|itm| !itm.is_empty())
@@ -75,7 +73,7 @@ impl FilterItem {
7573
}
7674
}
7775
FilterItem::Item(item) => {
78-
let sql = item.to_sql(context.clone(), schema)?;
76+
let sql = item.to_sql(context.clone())?;
7977
format!("({})", sql)
8078
}
8179
};
@@ -88,12 +86,11 @@ impl Filter {
8886
&self,
8987
templates: &PlanSqlTemplates,
9088
context: Rc<VisitorContext>,
91-
schema: Rc<Schema>,
9289
) -> Result<String, CubeError> {
9390
let res = self
9491
.items
9592
.iter()
96-
.map(|itm| itm.to_sql(templates, context.clone(), schema.clone()))
93+
.map(|itm| itm.to_sql(templates, context.clone()))
9794
.collect::<Result<Vec<_>, _>>()?
9895
.join(" AND ");
9996
Ok(res)

0 commit comments

Comments
 (0)