Skip to content

Commit 54475f9

Browse files
committed
debug and fix native transform_data()
1 parent 966519a commit 54475f9

File tree

8 files changed

+164
-119
lines changed

8 files changed

+164
-119
lines changed

packages/cubejs-api-gateway/src/gateway.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
getRealType,
1111
QueryAlias,
1212
} from '@cubejs-backend/shared';
13+
import { transformData as transformDataNative, TransformDataResponse } from '@cubejs-backend/native';
1314
import type {
1415
Application as ExpressApplication,
1516
ErrorRequestHandler,
@@ -1594,9 +1595,20 @@ class ApiGateway {
15941595
response: any,
15951596
responseType?: ResultType,
15961597
) {
1597-
return {
1598-
query: normalizedQuery,
1599-
data: transformData(
1598+
const data = response.data.isNative ?
1599+
JSON.parse(transformDataNative(JSON.stringify({
1600+
aliasToMemberNameMap: sqlQuery.aliasNameToMember,
1601+
annotation: {
1602+
...annotation.measures,
1603+
...annotation.dimensions,
1604+
...annotation.timeDimensions
1605+
},
1606+
query: normalizedQuery,
1607+
queryType,
1608+
resType: responseType,
1609+
}), response.data.getNativeRef()).result) as TransformDataResponse
1610+
:
1611+
transformData(
16001612
sqlQuery.aliasNameToMember,
16011613
{
16021614
...annotation.measures,
@@ -1607,7 +1619,10 @@ class ApiGateway {
16071619
normalizedQuery,
16081620
queryType,
16091621
responseType,
1610-
),
1622+
);
1623+
return {
1624+
query: normalizedQuery,
1625+
data,
16111626
lastRefreshTime: response.lastRefreshTime?.toISOString(),
16121627
...(
16131628
getEnv('devMode') ||

packages/cubejs-api-gateway/src/types/responses.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { ConfigItem } from '../helpers/prepareAnnotation';
22
import type { NormalizedQuery } from './query';
3-
import type { QueryType, ResultType } from './enums';
3+
import type { QueryType, ResultType } from './strings';
44

55
export type DBResponsePrimitive =
66
null |

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,8 @@ export class CubeStoreResultWrapper {
7777
const array = this.getArray();
7878
return (array as any)[method](...args);
7979
}
80+
81+
public getNativeRef() {
82+
return this.nativeReference;
83+
}
8084
}

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

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import fs from 'fs';
33
import path from 'path';
44
import { Writable } from 'stream';
55
import type { Request as ExpressRequest } from 'express';
6-
import type { TransformDataRequest, TransformDataResponse, } from '@cubejs-backend/api-gateway';
76
import { CubeStoreResultWrapper } from './CubeStoreResultWrapper';
87

98
export * from './CubeStoreResultWrapper';
@@ -102,6 +101,23 @@ export type SQLInterfaceOptions = {
102101
gatewayPort?: number,
103102
};
104103

104+
export type DBResponsePrimitive =
105+
null |
106+
boolean |
107+
number |
108+
string;
109+
110+
export type TransformDataResponse = {
111+
members: string[],
112+
dataset: DBResponsePrimitive[][]
113+
} | {
114+
[member: string]: DBResponsePrimitive
115+
}[];
116+
117+
export type TransformDataResponseNative = {
118+
result: string
119+
};
120+
105121
export function loadNative() {
106122
// Development version
107123
if (fs.existsSync(path.join(__dirname, '/../../index.node'))) {
@@ -367,10 +383,10 @@ export const getCubestoreResult = (ref: CubeStoreResultWrapper): ResultRow[] =>
367383
return native.getCubestoreResult(ref);
368384
};
369385

370-
export const transformData = (data: TransformDataRequest): TransformDataResponse => {
386+
export const transformData = (transformDataJson: string, rows: any): TransformDataResponseNative => {
371387
const native = loadNative();
372388

373-
return native.transformQueryData(data);
389+
return native.transformQueryData(transformDataJson, rows);
374390
};
375391

376392
export interface PyConfiguration {

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

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ use cubesql::{telemetry::ReportingLogger, CubeError};
3838

3939
use neon::prelude::*;
4040
use neon::types::buffer::TypedArray;
41-
use serde::Deserialize;
4241
use cubeorchestrator::cubestore_result_transform::transform_data;
4342
use cubeorchestrator::types::{TransformDataRequest};
4443

@@ -546,37 +545,29 @@ fn get_cubestore_result(mut cx: FunctionContext) -> JsResult<JsValue> {
546545
Ok(js_array.upcast())
547546
}
548547

549-
fn js_object_to_struct<T>(cx: &mut FunctionContext) -> Result<T, neon::result::Throw>
550-
where
551-
T: for<'de> Deserialize<'de>,
552-
{
548+
fn transform_query_data(mut cx: FunctionContext) -> JsResult<JsObject> {
553549
let json_str = cx
554550
.argument::<JsString>(0)?
555-
.value(cx);
556-
557-
let result: Result<T, serde_json::Error> = serde_json::from_str(&json_str);
558-
match result {
559-
Ok(value) => Ok(value),
560-
Err(err) => cx.throw_error(err.to_string()),
561-
}
562-
}
551+
.value(&mut cx);
552+
let request_data = match serde_json::from_str::<TransformDataRequest>(&json_str) {
553+
Ok(data) => data,
554+
Err(err) => return cx.throw_error(err.to_string()),
555+
};
563556

564-
fn transform_query_data(mut cx: FunctionContext) -> JsResult<JsObject> {
565-
let request_data: TransformDataRequest = js_object_to_struct(&mut cx)?;
557+
let cube_store_result = cx.argument::<JsBox<CubeStoreResult>>(1)?;
566558

567559
let alias_to_member_name_map = &request_data.alias_to_member_name_map;
568560
let annotation = &request_data.annotation;
569-
let data = &request_data.data;
570561
let query = &request_data.query;
571-
let query_type = &request_data.query_type;
562+
let query_type = &request_data.query_type.unwrap_or_default();
572563
let res_type = &request_data.res_type;
573564

574565
let transformed = match transform_data(
575566
alias_to_member_name_map,
576567
annotation,
577-
data.clone(),
568+
&**cube_store_result,
578569
query,
579-
query_type,
570+
&query_type,
580571
res_type.clone(),
581572
) {
582573
Ok(data) => data,

rust/cubeorchestrator/src/cubestore_message_parser.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use std::collections::HashMap;
12
use cubeshared::codegen::{root_as_http_message, HttpCommand};
23
use neon::prelude::Finalize;
34

@@ -29,6 +30,7 @@ impl std::error::Error for ParseError {}
2930
pub struct CubeStoreResult {
3031
pub columns: Vec<String>,
3132
pub rows: Vec<Vec<String>>,
33+
pub columns_pos: HashMap<String, usize>,
3234
}
3335

3436
impl Finalize for CubeStoreResult {}
@@ -38,6 +40,7 @@ impl CubeStoreResult {
3840
let mut result = CubeStoreResult {
3941
columns: vec![],
4042
rows: vec![],
43+
columns_pos: HashMap::new(),
4144
};
4245

4346
let http_message =
@@ -62,10 +65,15 @@ impl CubeStoreResult {
6265
return Err(ParseError::ColumnNameNotDefined);
6366
}
6467

65-
result.columns = result_set_columns
68+
let (columns, columns_pos): (Vec<_>, HashMap<_, _>) = result_set_columns
6669
.iter()
67-
.map(|val| val.to_owned())
68-
.collect();
70+
.enumerate()
71+
.map(|(index, column_name)| (column_name.to_owned(), (column_name.to_owned(), index)))
72+
.unzip();
73+
74+
result.columns = columns;
75+
result.columns_pos = columns_pos;
76+
6977
let result_set_rows = result_set.rows().ok_or(ParseError::EmptyResultSet)?;
7078
result.rows = Vec::with_capacity(result_set_rows.len());
7179

0 commit comments

Comments
 (0)