Skip to content

Commit be6e357

Browse files
committed
feat(tesseract): Basic pre-aggregations support
1 parent c1e5128 commit be6e357

File tree

23 files changed

+603
-10
lines changed

23 files changed

+603
-10
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
}
@@ -697,8 +697,8 @@ export class BaseQuery {
697697
rowLimit: this.options.rowLimit ? this.options.rowLimit.toString() : null,
698698
offset: this.options.offset ? this.options.offset.toString() : null,
699699
baseTools: this,
700-
ungrouped: this.options.ungrouped
701-
700+
ungrouped: this.options.ungrouped,
701+
preAggregationQuery: this.options.preAggregationQuery
702702
};
703703
const buildResult = nativeBuildSqlAndParams(queryParams);
704704

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
@@ -489,6 +489,13 @@ export class CubeEvaluator extends CubeSymbols {
489489
return this.cubeFromPath(path).preAggregations || {};
490490
}
491491

492+
public preAggregationsForCubeAsArray(path: string) {
493+
return Object.entries(this.cubeFromPath(path).preAggregations || {}).map(([name, preAggregation]) => ({
494+
name,
495+
...(preAggregation as Record<string, any>)
496+
}));
497+
}
498+
492499
/**
493500
* Returns pre-aggregations filtered by the specified selector.
494501
*/

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,11 +230,11 @@ describe('PreAggregations', () => {
230230
granularity: 'hour',
231231
partitionGranularity: 'month'
232232
},
233-
countCustomGranularity: {
233+
/* countCustomGranularity: {
234234
measures: [count],
235235
timeDimension: createdAt,
236236
granularity: 'hourTenMinOffset'
237-
},
237+
}, */
238238
sourceAndIdRollup: {
239239
measures: [count],
240240
dimensions: [sourceAndId, source],
@@ -517,7 +517,7 @@ describe('PreAggregations', () => {
517517
});
518518
`);
519519

520-
it('simple pre-aggregation', () => compiler.compile().then(() => {
520+
it('simple pre-aggregation 1', () => compiler.compile().then(() => {
521521
const query = new PostgresQuery({ joinGraph, cubeEvaluator, compiler }, {
522522
measures: [
523523
'visitors.count'
@@ -534,6 +534,13 @@ describe('PreAggregations', () => {
534534
preAggregationsSchema: ''
535535
});
536536

537+
const queryAndParams = query.buildSqlAndParams();
538+
console.log(queryAndParams);
539+
console.log("!!!! pre aggrs", query.preAggregations?.preAggregationForQuery);
540+
console.log("!!!! pre aggrs fun", query.preAggregations?.preAggregationForQuery.preAggregation);
541+
console.log("!!!! pre aggrs fun 2", query.preAggregations?.preAggregationForQuery.preAggregation.dimensionReferences.toString());
542+
expect(query.preAggregations?.preAggregationForQuery?.canUsePreAggregation).toEqual(true);
543+
537544
return dbRunner.evaluateQueryWithPreAggregations(query).then(res => {
538545
expect(res).toEqual(
539546
[

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ pub struct BaseQueryOptionsStatic {
5959
pub row_limit: Option<String>,
6060
pub offset: Option<String>,
6161
pub ungrouped: Option<bool>,
62+
#[serde(rename = "preAggregationQuery")]
63+
pub pre_aggregation_query: Option<bool>,
6264
}
6365

6466
#[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)