Skip to content

Commit eb0f799

Browse files
committed
another fix in deserialization
1 parent d30c289 commit eb0f799

File tree

3 files changed

+51
-54
lines changed

3 files changed

+51
-54
lines changed

packages/cubejs-backend-native/src/node_obj_deserializer.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,18 @@ impl<'de, 'a, 'b> Deserializer<'de> for JsValueDeserializer<'a, 'b> {
130130
|| self.value.is_a::<JsUndefined, _>(self.cx)
131131
{
132132
visitor.visit_none()
133+
} else if self.value.is_a::<JsFunction, _>(self.cx)
134+
{
135+
// We can do nothing with the JS functions in native
136+
// so let's save them as string for potential usage later
137+
// in JS side if needed
138+
let value = self
139+
.value
140+
.downcast::<JsFunction, _>(self.cx)
141+
.or_throw(self.cx)?
142+
.to_string(self.cx)?
143+
.value(self.cx);
144+
visitor.visit_string(value)
133145
} else {
134146
Err(JsDeserializationError(
135147
"Unsupported type for deserialization".to_string(),

rust/cubeorchestrator/src/query_result_transform.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use crate::{
22
query_message_parser::QueryResult,
33
transport::{
4-
AnnotatedConfigItem, ConfigItem, MembersMap, NormalizedQuery, QueryTimeDimension,
5-
QueryType, ResultType, TransformDataRequest,
4+
AnnotatedConfigItem, ConfigItem, MemberOrMemberExpression, MembersMap, NormalizedQuery,
5+
QueryTimeDimension, QueryType, ResultType, TransformDataRequest,
66
},
77
};
88
use anyhow::{bail, Context, Result};
@@ -162,10 +162,11 @@ pub fn get_members(
162162
let calc_member = format!("{}{}{}", path[0], MEMBER_SEPARATOR, path[1]);
163163

164164
if path.len() == 3
165-
&& query
166-
.dimensions
167-
.as_ref()
168-
.map_or(true, |dims| !dims.iter().any(|dim| *dim == calc_member))
165+
&& query.dimensions.as_ref().map_or(true, |dims| {
166+
!dims
167+
.iter()
168+
.any(|dim| *dim == MemberOrMemberExpression::Member(calc_member.clone()))
169+
})
169170
{
170171
members.insert(calc_member, column.clone());
171172
}
@@ -295,9 +296,11 @@ pub fn get_vanilla_row(
295296
format!("{}{}{}", path[0], MEMBER_SEPARATOR, path[1]);
296297
if path.len() == 3
297298
&& query.dimensions.as_ref().map_or(true, |dims| {
298-
!dims
299-
.iter()
300-
.any(|dim| *dim == member_name_without_granularity)
299+
!dims.iter().any(|dim| {
300+
*dim == MemberOrMemberExpression::Member(
301+
member_name_without_granularity.clone(),
302+
)
303+
})
301304
})
302305
{
303306
row.insert(member_name_without_granularity, transformed_value);
@@ -389,7 +392,9 @@ pub fn get_pivot_query(
389392
}
390393
}
391394
QueryType::CompareDateRangeQuery => {
392-
let mut dimensions = vec!["compareDateRange".to_string()];
395+
let mut dimensions = vec![MemberOrMemberExpression::Member(
396+
"compareDateRange".to_string(),
397+
)];
393398
if let Some(dims) = pivot_query.dimensions {
394399
dimensions.extend(dims.clone());
395400
}

rust/cubeorchestrator/src/transport.rs

Lines changed: 24 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,31 @@ pub struct GroupingSet {
8282
pub sub_id: Option<u32>,
8383
}
8484

85+
#[derive(Debug, Clone, Serialize, Deserialize, Hash, Eq, PartialEq)]
86+
#[serde(rename_all = "camelCase")]
87+
pub struct MemberExpression {
88+
#[serde(skip_deserializing)]
89+
pub expression: Option<Value>,
90+
pub cube_name: String,
91+
pub name: String,
92+
#[serde(skip_serializing_if = "Option::is_none")]
93+
pub expression_name: Option<String>,
94+
#[serde(skip_serializing_if = "Option::is_none")]
95+
pub definition: Option<String>,
96+
#[serde(skip_serializing_if = "Option::is_none")]
97+
pub grouping_set: Option<GroupingSet>,
98+
}
99+
85100
#[derive(Debug, Clone, Serialize, Deserialize, Hash, Eq, PartialEq)]
86101
#[serde(rename_all = "camelCase")]
87102
pub struct ParsedMemberExpression {
88103
pub expression: Vec<String>,
89104
pub cube_name: String,
90105
pub name: String,
91-
pub expression_name: String,
92-
pub definition: String,
106+
#[serde(skip_serializing_if = "Option::is_none")]
107+
pub expression_name: Option<String>,
108+
#[serde(skip_serializing_if = "Option::is_none")]
109+
pub definition: Option<String>,
93110
#[serde(skip_serializing_if = "Option::is_none")]
94111
pub grouping_set: Option<GroupingSet>,
95112
}
@@ -196,7 +213,8 @@ pub struct NormalizedQueryFilter {
196213
#[serde(untagged)]
197214
pub enum MemberOrMemberExpression {
198215
Member(String),
199-
MemberExpression(ParsedMemberExpression),
216+
ParsedMemberExpression(ParsedMemberExpression),
217+
MemberExpression(MemberExpression),
200218
}
201219

202220
#[derive(Debug, Clone, Serialize, Deserialize)]
@@ -218,55 +236,17 @@ pub enum QueryFilterOrLogicalFilter {
218236
NormalizedQueryFilter(NormalizedQueryFilter),
219237
}
220238

221-
#[derive(Debug, Serialize, Deserialize)]
222-
#[serde(rename_all = "camelCase")]
223-
pub struct Query {
224-
// pub measures: Vec<MemberOrMemberExpression>,
225-
pub measures: Vec<String>,
226-
#[serde(skip_serializing_if = "Option::is_none")]
227-
// pub dimensions: Option<Vec<MemberOrMemberExpression>>,
228-
pub dimensions: Option<Vec<String>>,
229-
#[serde(skip_serializing_if = "Option::is_none")]
230-
pub filters: Option<Vec<QueryFilterOrLogicalFilter>>,
231-
#[serde(skip_serializing_if = "Option::is_none")]
232-
pub time_dimensions: Option<Vec<QueryTimeDimension>>,
233-
#[serde(skip_serializing_if = "Option::is_none")]
234-
// pub segments: Option<Vec<MemberOrMemberExpression>>,
235-
pub segments: Option<Vec<String>>,
236-
#[serde(skip_serializing_if = "Option::is_none")]
237-
pub limit: Option<u32>,
238-
#[serde(skip_serializing_if = "Option::is_none")]
239-
pub offset: Option<u32>,
240-
#[serde(skip_serializing_if = "Option::is_none")]
241-
pub total: Option<bool>,
242-
#[serde(skip_serializing_if = "Option::is_none")]
243-
pub total_query: Option<bool>,
244-
#[serde(skip_serializing_if = "Option::is_none")]
245-
pub order: Option<Value>,
246-
#[serde(skip_serializing_if = "Option::is_none")]
247-
pub timezone: Option<String>,
248-
#[serde(skip_serializing_if = "Option::is_none")]
249-
pub renew_query: Option<bool>,
250-
#[serde(skip_serializing_if = "Option::is_none")]
251-
pub ungrouped: Option<bool>,
252-
#[serde(skip_serializing_if = "Option::is_none")]
253-
pub response_format: Option<ResultType>,
254-
}
255-
256239
#[derive(Debug, Clone, Serialize, Deserialize)]
257240
#[serde(rename_all = "camelCase")]
258241
pub struct NormalizedQuery {
259242
#[serde(skip_serializing_if = "Option::is_none")]
260-
// pub measures: Vec<MemberOrMemberExpression>,
261-
pub measures: Option<Vec<String>>,
243+
pub measures: Option<Vec<MemberOrMemberExpression>>,
262244
#[serde(skip_serializing_if = "Option::is_none")]
263-
// pub dimensions: Option<Vec<MemberOrMemberExpression>>,
264-
pub dimensions: Option<Vec<String>>,
245+
pub dimensions: Option<Vec<MemberOrMemberExpression>>,
265246
#[serde(skip_serializing_if = "Option::is_none")]
266247
pub time_dimensions: Option<Vec<QueryTimeDimension>>,
267-
// pub segments: Option<Vec<MemberOrMemberExpression>>,
268248
#[serde(skip_serializing_if = "Option::is_none")]
269-
pub segments: Option<Vec<String>>,
249+
pub segments: Option<Vec<MemberOrMemberExpression>>,
270250
#[serde(skip_serializing_if = "Option::is_none")]
271251
pub limit: Option<u32>,
272252
#[serde(skip_serializing_if = "Option::is_none")]

0 commit comments

Comments
 (0)