Skip to content

Commit c589ed7

Browse files
committed
add DataResult interface + implement it in result wrappers
1 parent e75028f commit c589ed7

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 {
@@ -1814,29 +1813,12 @@ class ApiGateway {
18141813

18151814
if (props.queryType === 'multi') {
18161815
// We prepare the final json result on native side
1817-
const [transformDataJson, rawDataRef, cleanResultList] = results.reduce<[Object[], any[], Object[]]>(
1818-
([transformList, rawList, resultList], r) => {
1819-
transformList.push(r.getTransformData());
1820-
rawList.push(r.getRawData());
1821-
resultList.push(r.getRootResultObject());
1822-
return [transformList, rawList, resultList];
1823-
},
1824-
[[], [], []]
1825-
);
1826-
1827-
const responseDataObj = {
1828-
queryType,
1829-
results: cleanResultList,
1830-
slowQuery
1831-
};
1832-
1833-
res(await getFinalQueryResultMulti(transformDataJson, rawDataRef, responseDataObj));
1816+
const resultMulti = new ResultMultiWrapper(results, { queryType, slowQuery });
1817+
res(await resultMulti.getFinalResult());
18341818
} else {
18351819
// We prepare the full final json result on native side
18361820
const r = results[0];
1837-
res(await getFinalQueryResult(
1838-
r.getTransformData(), r.getRawData(), r.getRootResultObject()
1839-
));
1821+
res(await r.getFinalResult());
18401822
}
18411823
} catch (e: any) {
18421824
this.handleError({
@@ -1970,17 +1952,8 @@ class ApiGateway {
19701952
res(results[0]);
19711953
} else {
19721954
// We prepare the final json result on native side
1973-
const [transformDataJson, rawData, resultDataJson] = (results as ResultWrapper[]).reduce<[Object[], any[], Object[]]>(
1974-
([transformList, rawList, resultList], r) => {
1975-
transformList.push(r.getTransformData());
1976-
rawList.push(r.getRawData());
1977-
resultList.push(r.getRootResultObject());
1978-
return [transformList, rawList, resultList];
1979-
},
1980-
[[], [], []]
1981-
);
1982-
1983-
res(await getFinalQueryResultArray(transformDataJson, rawData, resultDataJson));
1955+
const resultArray = new ResultArrayWrapper(results);
1956+
res(await resultArray.getFinalResult());
19841957
}
19851958
}
19861959
} 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)