Skip to content

Commit 46a1c2a

Browse files
committed
feat(tesseract): Basic pre-aggregations support
1 parent b4ced53 commit 46a1c2a

File tree

23 files changed

+604
-8
lines changed

23 files changed

+604
-8
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,7 @@ export class BaseQuery {
638638
}
639639

640640
if (this.useNativeSqlPlanner) {
641-
let isRelatedToPreAggregation = false;
641+
/* let isRelatedToPreAggregation = false;
642642
if (this.options.preAggregationQuery) {
643643
isRelatedToPreAggregation = true;
644644
} else if (!this.options.disableExternalPreAggregations && this.externalQueryClass) {
@@ -658,7 +658,7 @@ export class BaseQuery {
658658
659659
if (isRelatedToPreAggregation) {
660660
return this.newQueryWithoutNative().buildSqlAndParams(exportAnnotatedSql);
661-
}
661+
} */
662662

663663
return this.buildSqlAndParamsRust(exportAnnotatedSql);
664664
}
@@ -698,8 +698,8 @@ export class BaseQuery {
698698
offset: this.options.offset ? this.options.offset.toString() : null,
699699
baseTools: this,
700700
ungrouped: this.options.ungrouped,
701-
exportAnnotatedSql: exportAnnotatedSql === true
702-
701+
exportAnnotatedSql: exportAnnotatedSql === true,
702+
preAggregationQuery: this.options.preAggregationQuery
703703
};
704704

705705
const buildResult = nativeBuildSqlAndParams(queryParams);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,7 @@ export class PreAggregations {
515515
transformedQuery.filterDimensionsSingleValueEqual || {},
516516
)
517517
));
518-
518+
519519
const backAlias = (references) => references.map(r => (
520520
Array.isArray(r) ?
521521
[transformedQuery.allBackAliasMembers[r[0]] || r[0], r[1]] :

packages/cubejs-schema-compiler/src/compiler/CubeEvaluator.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,13 @@ export class CubeEvaluator extends CubeSymbols {
516516
return this.cubeFromPath(path).preAggregations || {};
517517
}
518518

519+
public preAggregationsForCubeAsArray(path: string) {
520+
return Object.entries(this.cubeFromPath(path).preAggregations || {}).map(([name, preAggregation]) => ({
521+
name,
522+
...(preAggregation as Record<string, any>)
523+
}));
524+
}
525+
519526
/**
520527
* Returns pre-aggregations filtered by the specified selector.
521528
*/

packages/cubejs-schema-compiler/test/integration/postgres/pre-aggregations.test.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ describe('PreAggregations', () => {
231231
granularity: 'hour',
232232
partitionGranularity: 'month'
233233
},
234-
countCustomGranularity: {
234+
/* countCustomGranularity: {
235235
measures: [count],
236236
timeDimension: createdAt,
237237
granularity: 'hourTenMinOffset',
@@ -496,7 +496,7 @@ describe('PreAggregations', () => {
496496
});
497497
`);
498498

499-
it('simple pre-aggregation', () => compiler.compile().then(() => {
499+
it('simple pre-aggregation 1', () => compiler.compile().then(() => {
500500
const query = new PostgresQuery({ joinGraph, cubeEvaluator, compiler }, {
501501
measures: [
502502
'visitors.count'
@@ -513,6 +513,13 @@ describe('PreAggregations', () => {
513513
preAggregationsSchema: ''
514514
});
515515

516+
const queryAndParams = query.buildSqlAndParams();
517+
console.log(queryAndParams);
518+
console.log("!!!! pre aggrs", query.preAggregations?.preAggregationForQuery);
519+
console.log("!!!! pre aggrs fun", query.preAggregations?.preAggregationForQuery.preAggregation);
520+
console.log("!!!! pre aggrs fun 2", query.preAggregations?.preAggregationForQuery.preAggregation.dimensionReferences.toString());
521+
expect(query.preAggregations?.preAggregationForQuery?.canUsePreAggregation).toEqual(true);
522+
516523
return dbRunner.evaluateQueryWithPreAggregations(query).then(res => {
517524
expect(res).toEqual(
518525
[

rust/cubesqlplanner/cubesqlplanner/src/cube_bridge/base_query_options.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ pub struct BaseQueryOptionsStatic {
6161
pub ungrouped: Option<bool>,
6262
#[serde(rename = "exportAnnotatedSql")]
6363
pub export_annotated_sql: bool,
64+
#[serde(rename = "preAggregationQuery")]
65+
pub pre_aggregation_query: Option<bool>,
6466
}
6567

6668
#[nativebridge::native_bridge(BaseQueryOptionsStatic)]

rust/cubesqlplanner/cubesqlplanner/src/cube_bridge/evaluator.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@ use super::dimension_definition::{
44
};
55
use super::measure_definition::{MeasureDefinition, NativeMeasureDefinition};
66
use super::member_sql::{MemberSql, NativeMemberSql};
7+
use super::pre_aggregation_description::{
8+
NativePreAggregationDescription, PreAggregationDescription,
9+
};
710
use super::segment_definition::{NativeSegmentDefinition, SegmentDefinition};
811
use cubenativeutils::wrappers::serializer::{
912
NativeDeserialize, NativeDeserializer, NativeSerialize,
1013
};
14+
use cubenativeutils::wrappers::NativeArray;
1115
use cubenativeutils::wrappers::NativeContextHolder;
1216
use cubenativeutils::wrappers::NativeObjectHandle;
1317
use cubenativeutils::CubeError;
@@ -51,4 +55,9 @@ pub trait CubeEvaluator {
5155
sql: Rc<dyn MemberSql>,
5256
) -> Result<Vec<CallDep>, CubeError>;
5357
fn resolve_granularity(&self, path: Vec<String>) -> Result<GranularityDefinition, CubeError>;
58+
#[nbridge(vec)]
59+
fn pre_aggregations_for_cube_as_array(
60+
&self,
61+
cube_name: String,
62+
) -> Result<Vec<Rc<dyn PreAggregationDescription>>, CubeError>;
5463
}

rust/cubesqlplanner/cubesqlplanner/src/cube_bridge/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ pub mod member_expression;
2121
pub mod member_order_by;
2222
pub mod member_sql;
2323
pub mod options_member;
24+
pub mod pre_aggregation_description;
2425
pub mod security_context;
2526
pub mod segment_definition;
2627
pub mod sql_templates_render;
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
use super::member_sql::{MemberSql, NativeMemberSql};
2+
use cubenativeutils::wrappers::serializer::{
3+
NativeDeserialize, NativeDeserializer, NativeSerialize,
4+
};
5+
use cubenativeutils::wrappers::NativeArray;
6+
use cubenativeutils::wrappers::NativeContextHolder;
7+
use cubenativeutils::wrappers::NativeObjectHandle;
8+
use cubenativeutils::CubeError;
9+
use serde::{Deserialize, Serialize};
10+
use std::any::Any;
11+
use std::rc::Rc;
12+
13+
#[derive(Serialize, Deserialize, Debug)]
14+
pub struct PreAggregationDescriptionStatic {
15+
pub name: String,
16+
#[serde(rename = "type")]
17+
pub pre_aggregation_type: String,
18+
pub granularity: Option<String>,
19+
pub external: Option<bool>,
20+
}
21+
22+
#[nativebridge::native_bridge(PreAggregationDescriptionStatic)]
23+
pub trait PreAggregationDescription {
24+
#[nbridge(field, optional)]
25+
fn measure_references(&self) -> Result<Option<Rc<dyn MemberSql>>, CubeError>;
26+
27+
#[nbridge(field, optional)]
28+
fn dimension_references(&self) -> Result<Option<Rc<dyn MemberSql>>, CubeError>;
29+
30+
#[nbridge(field, optional)]
31+
fn time_dimension_reference(&self) -> Result<Option<Rc<dyn MemberSql>>, CubeError>;
32+
}

rust/cubesqlplanner/cubesqlplanner/src/plan/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ pub mod expression;
44
pub mod filter;
55
pub mod from;
66
pub mod join;
7+
pub mod optimizer;
78
pub mod order;
89
pub mod query_plan;
910
pub mod schema;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
mod symbols;
2+
3+
pub use symbols::*;

0 commit comments

Comments
 (0)