Skip to content

Commit 5ab9f50

Browse files
committed
add DataResult interface + implement it in result wrappers
1 parent fccac53 commit 5ab9f50

File tree

2 files changed

+67
-36
lines changed

2 files changed

+67
-36
lines changed

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

Lines changed: 7 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,8 @@ import {
1111
QueryAlias,
1212
} from '@cubejs-backend/shared';
1313
import {
14-
getFinalQueryResult,
15-
getFinalQueryResultArray,
16-
getFinalQueryResultMulti,
14+
ResultArrayWrapper,
15+
ResultMultiWrapper,
1716
ResultWrapper,
1817
} from '@cubejs-backend/native';
1918
import type {
@@ -1834,29 +1833,12 @@ class ApiGateway {
18341833

18351834
if (props.queryType === 'multi') {
18361835
// We prepare the final json result on native side
1837-
const [transformDataJson, rawDataRef, cleanResultList] = results.reduce<[Object[], any[], Object[]]>(
1838-
([transformList, rawList, resultList], r) => {
1839-
transformList.push(r.getTransformData());
1840-
rawList.push(r.getRawData());
1841-
resultList.push(r.getRootResultObject());
1842-
return [transformList, rawList, resultList];
1843-
},
1844-
[[], [], []]
1845-
);
1846-
1847-
const responseDataObj = {
1848-
queryType,
1849-
results: cleanResultList,
1850-
slowQuery
1851-
};
1852-
1853-
res(await getFinalQueryResultMulti(transformDataJson, rawDataRef, responseDataObj));
1836+
const resultMulti = new ResultMultiWrapper(results, { queryType, slowQuery });
1837+
res(await resultMulti.getFinalResult());
18541838
} else {
18551839
// We prepare the full final json result on native side
18561840
const r = results[0];
1857-
res(await getFinalQueryResult(
1858-
r.getTransformData(), r.getRawData(), r.getRootResultObject()
1859-
));
1841+
res(await r.getFinalResult());
18601842
}
18611843
} catch (e: any) {
18621844
this.handleError({
@@ -1990,17 +1972,8 @@ class ApiGateway {
19901972
res(results[0]);
19911973
} else {
19921974
// We prepare the final json result on native side
1993-
const [transformDataJson, rawData, resultDataJson] = (results as ResultWrapper[]).reduce<[Object[], any[], Object[]]>(
1994-
([transformList, rawList, resultList], r) => {
1995-
transformList.push(r.getTransformData());
1996-
rawList.push(r.getRawData());
1997-
resultList.push(r.getRootResultObject());
1998-
return [transformList, rawList, resultList];
1999-
},
2000-
[[], [], []]
2001-
);
2002-
2003-
res(await getFinalQueryResultArray(transformDataJson, rawData, resultDataJson));
1975+
const resultArray = new ResultArrayWrapper(results);
1976+
res(await resultArray.getFinalResult());
20041977
}
20051978
}
20061979
} catch (e: any) {

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

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
1-
import { getCubestoreResult, ResultRow } from './index';
1+
import {
2+
getCubestoreResult,
3+
getFinalQueryResult,
4+
getFinalQueryResultArray,
5+
getFinalQueryResultMulti,
6+
ResultRow
7+
} from './index';
8+
9+
export interface DataResult {
10+
getFinalResult(): Promise<any>;
11+
}
212

3-
export class ResultWrapper {
13+
export class ResultWrapper implements DataResult {
414
private readonly proxy: any;
515

616
private cache: any;
@@ -112,4 +122,52 @@ export class ResultWrapper {
112122
public getRootResultObject(): any {
113123
return this.rootResultObject;
114124
}
125+
126+
public async getFinalResult(): Promise<any> {
127+
return getFinalQueryResult(this.transformData, this.getRawData(), this.rootResultObject);
128+
}
129+
}
130+
131+
export class ResultMultiWrapper implements DataResult {
132+
public constructor(private readonly results: ResultWrapper[], private rootResultObject: any) {
133+
}
134+
135+
public async getFinalResult(): Promise<any> {
136+
const [transformDataJson, rawDataRef, cleanResultList] = this.results.reduce<[Object[], any[], Object[]]>(
137+
([transformList, rawList, resultList], r) => {
138+
transformList.push(r.getTransformData());
139+
rawList.push(r.getRawData());
140+
resultList.push(r.getRootResultObject());
141+
return [transformList, rawList, resultList];
142+
},
143+
[[], [], []]
144+
);
145+
146+
const responseDataObj = {
147+
queryType: this.rootResultObject.queryType,
148+
results: cleanResultList,
149+
slowQuery: this.rootResultObject.slowQuery,
150+
};
151+
152+
return getFinalQueryResultMulti(transformDataJson, rawDataRef, responseDataObj);
153+
}
154+
}
155+
156+
export class ResultArrayWrapper implements DataResult {
157+
public constructor(private readonly results: ResultWrapper[]) {
158+
}
159+
160+
public async getFinalResult(): Promise<any> {
161+
const [transformDataJson, rawData, resultDataJson] = this.results.reduce<[Object[], any[], Object[]]>(
162+
([transformList, rawList, resultList], r) => {
163+
transformList.push(r.getTransformData());
164+
rawList.push(r.getRawData());
165+
resultList.push(r.getRootResultObject());
166+
return [transformList, rawList, resultList];
167+
},
168+
[[], [], []]
169+
);
170+
171+
return getFinalQueryResultArray(transformDataJson, rawData, resultDataJson);
172+
}
115173
}

0 commit comments

Comments
 (0)