Skip to content

Commit daebda4

Browse files
committed
in work
1 parent 0edbf9a commit daebda4

File tree

16 files changed

+240
-63
lines changed

16 files changed

+240
-63
lines changed

packages/cubejs-backend-native/js/index.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -360,13 +360,10 @@ export const buildSqlAndParams = (cubeEvaluator: any): String => {
360360
const native = loadNative();
361361
const safeCallFn = (fn: Function, thisArg: any, ...args: any[]) => {
362362
try {
363-
console.log("!!!! this: ", thisArg);
364-
console.log("!!!! args: ", args.length);
365363
return {
366364
result: fn.apply(thisArg, args),
367365
};
368366
} catch (e: any) {
369-
console.log("!!! error: ", e);
370367
return {
371368
error: e.toString(),
372369
};

rust/cubesqlplanner/cubesqlplanner/src/cube_bridge/member_sql.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use super::{
22
filter_group::{FilterGroup, NativeFilterGroup},
33
filter_params::{FilterParams, NativeFilterParams},
4-
proxy::CubeDepsCollectorProxyHandler,
4+
proxy::{CubeDepsCollectorProxyHandler, FilterParamsCollectorProxyHandler},
5+
return_string_fn::ReturnStringFn,
56
security_context::{NativeSecurityContext, SecurityContext},
67
sql_utils::{NativeSqlUtils, SqlUtils},
78
};
@@ -44,6 +45,8 @@ pub enum MemberSqlArg {
4445
pub enum MemberSqlArgForResolve {
4546
String(String),
4647
CubeProxy(Rc<CubeDepsCollectorProxyHandler>),
48+
FilterParamsProxy(Rc<FilterParamsCollectorProxyHandler>),
49+
FilterGroupMock(),
4750
ContextSymbol(ContextSymbolArg),
4851
}
4952

@@ -140,6 +143,10 @@ impl<IT: InnerTypes> NativeSerialize<IT> for MemberSqlArgForResolve {
140143
let res = match self {
141144
Self::String(s) => s.to_native(context_holder.clone()),
142145
Self::CubeProxy(proxy) => proxy.to_native(context_holder.clone()),
146+
Self::FilterParamsProxy(proxy) => proxy.to_native(context_holder.clone()),
147+
Self::FilterGroupMock() => {
148+
ReturnStringFn::new(format!("")).to_native(context_holder.clone())
149+
}
143150
Self::ContextSymbol(s) => s.to_native(context_holder.clone()),
144151
}?;
145152
Ok(NativeObjectHandle::new(res.into_object()))

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ pub mod member_order_by;
1919
pub mod member_sql;
2020
pub mod options_member;
2121
pub mod proxy;
22+
pub mod return_string_fn;
2223
pub mod security_context;
2324
pub mod sql_templates_render;
2425
pub mod sql_utils;

rust/cubesqlplanner/cubesqlplanner/src/cube_bridge/proxy/cube_deps_collector.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use cubenativeutils::CubeError;
1212
use std::cell::RefCell;
1313
use std::rc::Rc;
1414

15-
type CubeDepsCollectorRef = Rc<RefCell<CubeDepsCollector>>;
15+
pub type CubeDepsCollectorProxyHandler = ProxyHandlerImpl<CubeDepsCollector>;
1616

1717
pub enum CubeDepsCollectorProp {
1818
Symbol(String),
@@ -182,5 +182,3 @@ impl Drop for CubeDepsCollector {
182182
.drop(self.context_holder_ref.clone());
183183
}
184184
}
185-
186-
pub type CubeDepsCollectorProxyHandler = ProxyHandlerImpl<CubeDepsCollector>;
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
use crate::cube_bridge::base_tools::BaseTools;
2+
use crate::cube_bridge::return_string_fn::ReturnStringFn;
3+
4+
use super::{ProxyCollector, ProxyHandlerImpl};
5+
use cubenativeutils::wrappers::context::NativeFinalize;
6+
use cubenativeutils::wrappers::inner_types::InnerTypes;
7+
use cubenativeutils::wrappers::serializer::NativeSerialize;
8+
use cubenativeutils::wrappers::{
9+
NativeContextHolder, NativeContextHolderRef, NativeObjectHandle, NativeStruct, RootHolder,
10+
Rootable,
11+
};
12+
use cubenativeutils::CubeError;
13+
use std::cell::RefCell;
14+
use std::collections::{HashMap, HashSet};
15+
use std::rc::Rc;
16+
17+
pub type FilterParamsCollectorProxyHandler = ProxyHandlerImpl<FilterParamsCollector>;
18+
pub type FilterParamsCubeFiltersCollectorProxyHandler =
19+
ProxyHandlerImpl<FilterParamsCubeFiltersCollector>;
20+
21+
pub struct FilterParamsCollector {
22+
cube_filter_proxies: Vec<Rc<FilterParamsCubeFiltersCollectorProxyHandler>>,
23+
base_tools_root: Rc<dyn RootHolder<dyn BaseTools>>,
24+
}
25+
26+
pub enum FilterParamsCollectorRes {
27+
CupeFilterProxy(Rc<FilterParamsCubeFiltersCollectorProxyHandler>),
28+
}
29+
30+
impl<IT: InnerTypes> NativeSerialize<IT> for FilterParamsCollectorRes {
31+
fn to_native(
32+
&self,
33+
context: Rc<NativeContextHolder<IT>>,
34+
) -> Result<NativeObjectHandle<IT>, CubeError> {
35+
match self {
36+
FilterParamsCollectorRes::CupeFilterProxy(proxy) => proxy.to_native(context),
37+
}
38+
}
39+
}
40+
41+
impl FilterParamsCollector {
42+
pub fn try_new(base_tools: Rc<dyn BaseTools>) -> Result<Self, CubeError> {
43+
let base_tools_root = base_tools.to_root()?;
44+
Ok(Self {
45+
cube_filter_proxies: vec![],
46+
base_tools_root,
47+
})
48+
}
49+
50+
pub fn collected_result(&self) -> HashMap<String, HashSet<String>> {
51+
let mut result = HashMap::new();
52+
for cb in self.cube_filter_proxies.iter() {
53+
let collector = cb.get_collector();
54+
let entry: &mut HashSet<String> =
55+
result.entry(collector.cube_name.clone()).or_default();
56+
for member in collector.members.iter() {
57+
entry.insert(member.clone());
58+
}
59+
}
60+
println!("!!!! {:?}", result);
61+
result
62+
}
63+
}
64+
65+
impl NativeFinalize for FilterParamsCollector {}
66+
67+
impl ProxyCollector for FilterParamsCollector {
68+
type ResultType = FilterParamsCollectorRes;
69+
70+
fn on_get(
71+
&mut self,
72+
property_name: String,
73+
context_holder_ref: Rc<dyn NativeContextHolderRef>,
74+
) -> Result<Option<Self::ResultType>, CubeError> {
75+
let base_tools = self
76+
.base_tools_root
77+
.clone()
78+
.to_inner(context_holder_ref.clone())?;
79+
let cube_filters_collector = FilterParamsCubeFiltersCollector::new(property_name.clone());
80+
let cube_filters_proxy =
81+
FilterParamsCubeFiltersCollectorProxyHandler::new(cube_filters_collector, base_tools);
82+
self.cube_filter_proxies.push(cube_filters_proxy.clone());
83+
let res = FilterParamsCollectorRes::CupeFilterProxy(cube_filters_proxy);
84+
Ok(Some(res))
85+
}
86+
}
87+
88+
pub struct FilterParamsCubeFiltersCollector {
89+
cube_name: String,
90+
members: Vec<String>,
91+
}
92+
93+
impl FilterParamsCubeFiltersCollector {
94+
pub fn new(cube_name: String) -> Self {
95+
Self {
96+
cube_name,
97+
members: vec![],
98+
}
99+
}
100+
}
101+
102+
impl NativeFinalize for FilterParamsCubeFiltersCollector {}
103+
104+
impl ProxyCollector for FilterParamsCubeFiltersCollector {
105+
type ResultType = FilterParamsCubeFiltersCollectorRes;
106+
107+
fn on_get(
108+
&mut self,
109+
property_name: String,
110+
_context_holder_ref: Rc<dyn NativeContextHolderRef>,
111+
) -> Result<Option<Self::ResultType>, CubeError> {
112+
println!("!!!! prop name: {}", property_name);
113+
self.members.push(property_name);
114+
Ok(Some(FilterParamsCubeFiltersCollectorRes::new()))
115+
}
116+
}
117+
118+
pub struct FilterParamsCubeFiltersCollectorRes {}
119+
120+
impl FilterParamsCubeFiltersCollectorRes {
121+
pub fn new() -> Self {
122+
Self {}
123+
}
124+
}
125+
126+
impl<IT: InnerTypes> NativeSerialize<IT> for FilterParamsCubeFiltersCollectorRes {
127+
fn to_native(
128+
&self,
129+
context: Rc<NativeContextHolder<IT>>,
130+
) -> Result<NativeObjectHandle<IT>, CubeError> {
131+
let res = context.empty_struct()?;
132+
res.set_field(
133+
"filter",
134+
NativeObjectHandle::new_from_type(context.to_string_fn("".to_string())?),
135+
)?;
136+
Ok(NativeObjectHandle::new_from_type(res))
137+
}
138+
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
mod cube_deps_collector;
2+
mod filter_params_collector;
23
mod handler;
34
mod handler_impl;
45
mod proxy;
56

67
pub use cube_deps_collector::{
78
CubeDepsCollector, CubeDepsCollectorProp, CubeDepsCollectorProxyHandler,
89
};
10+
11+
pub use filter_params_collector::{FilterParamsCollector, FilterParamsCollectorProxyHandler};
12+
913
pub use handler::{
1014
NativeProxyHandler, NativeProxyHandlerFunction, ProxyHandler, ProxyHandlerFunction,
1115
};
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
use cubenativeutils::wrappers::inner_types::InnerTypes;
2+
use cubenativeutils::wrappers::serializer::NativeSerialize;
3+
use cubenativeutils::wrappers::NativeContextHolder;
4+
use cubenativeutils::wrappers::NativeObjectHandle;
5+
use cubenativeutils::CubeError;
6+
use std::rc::Rc;
7+
8+
pub struct ReturnStringFn {
9+
value: String,
10+
}
11+
12+
impl ReturnStringFn {
13+
pub fn new(value: String) -> Self {
14+
ReturnStringFn { value }
15+
}
16+
}
17+
18+
impl<IT: InnerTypes> NativeSerialize<IT> for ReturnStringFn {
19+
fn to_native(
20+
&self,
21+
context: Rc<NativeContextHolder<IT>>,
22+
) -> Result<NativeObjectHandle<IT>, CubeError> {
23+
Ok(NativeObjectHandle::new_from_type(
24+
context.to_string_fn(self.value.clone())?,
25+
))
26+
}
27+
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ impl SelectBuilder {
182182
schema
183183
}
184184

185-
pub fn build(self, mut nodes_factory: SqlNodesFactory) -> Select {
185+
pub fn build(self, mut nodes_factory: SqlNodesFactory, all_filters: Option<Filter>) -> Select {
186186
let cube_references = self.make_cube_references();
187187
nodes_factory.set_cube_name_references(cube_references);
188188
let schema = if self.projection_columns.is_empty() {
@@ -197,7 +197,7 @@ impl SelectBuilder {
197197
group_by: self.group_by,
198198
having: self.having,
199199
order_by: self.order_by,
200-
context: Rc::new(VisitorContext::new(&nodes_factory)),
200+
context: Rc::new(VisitorContext::new(&nodes_factory, all_filters)),
201201
ctes: self.ctes,
202202
is_distinct: self.is_distinct,
203203
limit: self.limit,

rust/cubesqlplanner/cubesqlplanner/src/planner/planners/full_key_query_aggregate_planner.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,9 @@ impl FullKeyAggregateQueryPlanner {
161161
let mut context_factory = self.context_factory.clone();
162162
context_factory.set_render_references(render_references);
163163

164-
Ok(Rc::new(select_builder.build(context_factory)))
164+
Ok(Rc::new(select_builder.build(
165+
context_factory,
166+
self.query_properties.all_filters(),
167+
)))
165168
}
166169
}

rust/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/member_query_planner.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use std::rc::Rc;
1919

2020
pub struct MultiStageMemberQueryPlanner {
2121
query_tools: Rc<QueryTools>,
22-
_query_properties: Rc<QueryProperties>,
22+
query_properties: Rc<QueryProperties>,
2323
description: Rc<MultiStageQueryDescription>,
2424
}
2525

@@ -31,7 +31,7 @@ impl MultiStageMemberQueryPlanner {
3131
) -> Self {
3232
Self {
3333
query_tools,
34-
_query_properties: query_properties,
34+
query_properties: query_properties,
3535
description,
3636
}
3737
}
@@ -185,7 +185,7 @@ impl MultiStageMemberQueryPlanner {
185185
select_builder.add_projection_member(&query_member, None);
186186
select_builder.set_group_by(group_by);
187187
select_builder.set_order_by(self.query_order()?);
188-
let select = select_builder.build(context_factory);
188+
let select = select_builder.build(context_factory, self.query_properties.all_filters());
189189

190190
Ok(Rc::new(Cte::new_from_select(
191191
Rc::new(select),
@@ -266,7 +266,7 @@ impl MultiStageMemberQueryPlanner {
266266
if self.description.member().is_ungrupped() {
267267
context_factory.set_ungrouped(true);
268268
}
269-
let select = select_builder.build(context_factory);
269+
let select = select_builder.build(context_factory, None);
270270

271271
Ok(Rc::new(Cte::new_from_select(
272272
Rc::new(select),
@@ -352,7 +352,7 @@ impl MultiStageMemberQueryPlanner {
352352
let mut node_factory = SqlNodesFactory::new();
353353
node_factory.set_render_references(render_references);
354354
Ok(QueryPlan::Select(Rc::new(
355-
select_builder.build(node_factory),
355+
select_builder.build(node_factory, None),
356356
)))
357357
}
358358

0 commit comments

Comments
 (0)