Skip to content

Commit 46eeeb9

Browse files
committed
use ResultWrapper for all results
1 parent 45c3e2f commit 46eeeb9

File tree

2 files changed

+45
-15
lines changed

2 files changed

+45
-15
lines changed

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

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
getFinalQueryResult,
1515
getFinalQueryResultArray,
1616
getFinalQueryResultMulti,
17+
ResultWrapper,
1718
} from '@cubejs-backend/native';
1819
import type {
1920
Application as ExpressApplication,
@@ -120,7 +121,6 @@ function cleanupResult(result) {
120121
return {
121122
...result,
122123
rawData: undefined,
123-
transformDataParams: undefined,
124124
};
125125
}
126126

@@ -1533,7 +1533,7 @@ class ApiGateway {
15331533
context: RequestContext,
15341534
normalizedQuery: NormalizedQuery,
15351535
sqlQuery: any,
1536-
) {
1536+
): Promise<ResultWrapper> {
15371537
const queries = [{
15381538
...sqlQuery,
15391539
query: sqlQuery.sql[0],
@@ -1578,7 +1578,22 @@ class ApiGateway {
15781578
response.total = normalizedQuery.total
15791579
? Number(total.data[0][QueryAlias.TOTAL_COUNT])
15801580
: undefined;
1581-
return response;
1581+
1582+
return this.wrapAdapterQueryResultIfNeeded(response);
1583+
}
1584+
1585+
/**
1586+
* Wraps the adapter's response in unified ResultWrapper if it comes from
1587+
* a common driver (not a Cubestore's one, cause Cubestore Driver internally creates ResultWrapper)
1588+
* @param res Adapter's response
1589+
* @private
1590+
*/
1591+
private wrapAdapterQueryResultIfNeeded(res: any): ResultWrapper {
1592+
if (!(res.data instanceof ResultWrapper)) {
1593+
res.data = new ResultWrapper(null, res.data);
1594+
}
1595+
1596+
return res;
15821597
}
15831598

15841599
/**
@@ -1620,11 +1635,12 @@ class ApiGateway {
16201635
resType: responseType,
16211636
};
16221637

1638+
response.data.setTransformData(transformDataParams);
1639+
16231640
// We postpone data transformation until the last minute
16241641
return {
16251642
query: normalizedQuery,
16261643
rawData: response.data,
1627-
transformDataParams,
16281644
lastRefreshTime: response.lastRefreshTime?.toISOString(),
16291645
...(
16301646
getEnv('devMode') ||
@@ -1806,8 +1822,8 @@ class ApiGateway {
18061822
// We prepare the final json result on native side
18071823
const [transformDataJson, rawDataRef, cleanResultList] = results.reduce<[Object[], any[], Object[]]>(
18081824
([transformList, rawList, resultList], r) => {
1809-
transformList.push(r.transformDataParams);
1810-
rawList.push(r.rawData.isNative ? r.rawData.getNativeRef() : r.rawData);
1825+
transformList.push(r.rawData.getTransformData());
1826+
rawList.push(r.rawData.getRawData());
18111827
resultList.push(cleanupResult(r));
18121828
return [transformList, rawList, resultList];
18131829
},
@@ -1824,8 +1840,9 @@ class ApiGateway {
18241840
} else {
18251841
// We prepare the full final json result on native side
18261842
const r = results[0];
1827-
const rawData = r.rawData.isNative ? r.rawData.getNativeRef() : r.rawData;
1828-
res(await getFinalQueryResult(r.transformDataParams, rawData, cleanupResult(r)));
1843+
res(await getFinalQueryResult(
1844+
r.rawData.getTransformData(), r.rawData.getRawData(), cleanupResult(r)
1845+
));
18291846
}
18301847
} catch (e: any) {
18311848
this.handleError({
@@ -1960,12 +1977,11 @@ class ApiGateway {
19601977
} else {
19611978
// We prepare the final json result on native side
19621979
const [transformDataJson, rawData, resultDataJson] = (results as {
1963-
transformDataParams: any;
1964-
rawData: { isNative: boolean, getNativeRef: () => any };
1980+
rawData: { getTransformData: () => any, getRawData: () => any };
19651981
}[]).reduce<[Object[], any[], Object[]]>(
19661982
([transformList, rawList, resultList], r) => {
1967-
transformList.push(r.transformDataParams);
1968-
rawList.push(r.rawData.isNative ? r.rawData.getNativeRef() : r.rawData);
1983+
transformList.push(r.rawData.getTransformData());
1984+
rawList.push(r.rawData.getRawData());
19691985
resultList.push(cleanupResult(r));
19701986
return [transformList, rawList, resultList];
19711987
},

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

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ export class ResultWrapper {
99

1010
private readonly isNative: Boolean = false;
1111

12-
public constructor(private readonly nativeReference: any) {
12+
private transformData: any;
13+
14+
public constructor(private readonly nativeReference: any, private readonly jsResult: any = null) {
1315
if (nativeReference) {
1416
this.isNative = true;
1517
}
@@ -81,7 +83,19 @@ export class ResultWrapper {
8183
return (array as any)[method](...args);
8284
}
8385

84-
public getNativeRef() {
85-
return this.nativeReference;
86+
public getRawData() {
87+
if (this.isNative) {
88+
return this.nativeReference;
89+
}
90+
91+
return this.jsResult;
92+
}
93+
94+
public setTransformData(td: any) {
95+
this.transformData = td;
96+
}
97+
98+
public getTransformData(): any {
99+
return this.transformData;
86100
}
87101
}

0 commit comments

Comments
 (0)