Skip to content

Commit 80b8d41

Browse files
authored
feat: ResultSet serializaion and deserializaion (#836)
* feat: ResultSet serializaion and deserializaion * format fix
1 parent 28e8a4a commit 80b8d41

File tree

8 files changed

+269
-1727
lines changed

8 files changed

+269
-1727
lines changed

docs/Cube.js-Frontend/@cubejs-client-core.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,10 @@ You can find the examples of using the `pivotConfig` [here](#pivot-config)
327327

328328
**rawData**(): *T[]*
329329

330+
### serialize
331+
332+
**serialize**(): *Object*
333+
330334
### series
331335

332336
**series****SeriesItem**›(**pivotConfig?**: [PivotConfig](#types-pivot-config)): *[Series](#types-series)‹SeriesItem›[]*
@@ -513,6 +517,14 @@ For example:
513517
]
514518
```
515519

520+
### deserialize
521+
522+
`static` **deserialize****TData**›(**data**: Object, **options?**: Object): *[ResultSet](#result-set)‹TData›*
523+
524+
**Type parameters:**
525+
526+
- **TData**
527+
516528
### getNormalizedPivotConfig
517529

518530
`static` **getNormalizedPivotConfig**(**query**: [Query](#types-query), **pivotConfig?**: Partial‹[PivotConfig](#types-pivot-config)›): *[PivotConfig](#types-pivot-config)*

packages/cubejs-client-core/dist/cubejs-client-core.esm.js

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
3737
import _defineProperty from '@babel/runtime/helpers/defineProperty';
3838
import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
3939
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
40-
import { pipe, map, filter, reduce, minBy, maxBy, groupBy, equals, unnest, toPairs, uniq, fromPairs, dropLast } from 'ramda';
40+
import { pipe, map, filter, reduce, minBy, maxBy, groupBy, equals, unnest, toPairs, uniq, fromPairs, dropLast, clone } from 'ramda';
4141
import Moment from 'moment';
4242
import momentRange from 'moment-range';
4343
import 'core-js/modules/es.array.is-array';
@@ -96,12 +96,14 @@ var LocalDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z?$/;
9696
var ResultSet =
9797
/*#__PURE__*/
9898
function () {
99-
function ResultSet(loadResponse, options) {
99+
function ResultSet(loadResponse) {
100+
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
101+
100102
_classCallCheck(this, ResultSet);
101103

102-
options = options || {};
103104
this.loadResponse = loadResponse;
104105
this.parseDateMeasures = options.parseDateMeasures;
106+
this.options = options;
105107
}
106108

107109
_createClass(ResultSet, [{
@@ -644,6 +646,13 @@ function () {
644646

645647
return this.backwardCompatibleData;
646648
}
649+
}, {
650+
key: "serialize",
651+
value: function serialize() {
652+
return {
653+
loadResponse: clone(this.loadResponse)
654+
};
655+
}
647656
}], [{
648657
key: "timeDimensionMember",
649658
value: function timeDimensionMember(td) {
@@ -725,6 +734,12 @@ function () {
725734
value: function measureFromAxis(axisValues) {
726735
return axisValues[axisValues.length - 1];
727736
}
737+
}, {
738+
key: "deserialize",
739+
value: function deserialize(data) {
740+
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
741+
return new ResultSet(data.loadResponse, options);
742+
}
728743
}]);
729744

730745
return ResultSet;

packages/cubejs-client-core/dist/cubejs-client-core.js

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,14 @@ var LocalDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z?$/;
102102
var ResultSet =
103103
/*#__PURE__*/
104104
function () {
105-
function ResultSet(loadResponse, options) {
105+
function ResultSet(loadResponse) {
106+
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
107+
106108
_classCallCheck(this, ResultSet);
107109

108-
options = options || {};
109110
this.loadResponse = loadResponse;
110111
this.parseDateMeasures = options.parseDateMeasures;
112+
this.options = options;
111113
}
112114

113115
_createClass(ResultSet, [{
@@ -650,6 +652,13 @@ function () {
650652

651653
return this.backwardCompatibleData;
652654
}
655+
}, {
656+
key: "serialize",
657+
value: function serialize() {
658+
return {
659+
loadResponse: ramda.clone(this.loadResponse)
660+
};
661+
}
653662
}], [{
654663
key: "timeDimensionMember",
655664
value: function timeDimensionMember(td) {
@@ -731,6 +740,12 @@ function () {
731740
value: function measureFromAxis(axisValues) {
732741
return axisValues[axisValues.length - 1];
733742
}
743+
}, {
744+
key: "deserialize",
745+
value: function deserialize(data) {
746+
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
747+
return new ResultSet(data.loadResponse, options);
748+
}
734749
}]);
735750

736751
return ResultSet;

packages/cubejs-client-core/dist/cubejs-client-core.umd.js

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3005,7 +3005,7 @@
30053005
};
30063006
};
30073007

3008-
function AsyncIterator(generator, PromiseImpl) {
3008+
function AsyncIterator(generator) {
30093009
function invoke(method, arg, resolve, reject) {
30103010
var record = tryCatch(generator[method], generator, arg);
30113011

@@ -3016,14 +3016,14 @@
30163016
var value = result.value;
30173017

30183018
if (value && _typeof(value) === "object" && hasOwn.call(value, "__await")) {
3019-
return PromiseImpl.resolve(value.__await).then(function (value) {
3019+
return Promise.resolve(value.__await).then(function (value) {
30203020
invoke("next", value, resolve, reject);
30213021
}, function (err) {
30223022
invoke("throw", err, resolve, reject);
30233023
});
30243024
}
30253025

3026-
return PromiseImpl.resolve(value).then(function (unwrapped) {
3026+
return Promise.resolve(value).then(function (unwrapped) {
30273027
// When a yielded Promise is resolved, its final value becomes
30283028
// the .value of the Promise<{value,done}> result for the
30293029
// current iteration.
@@ -3041,7 +3041,7 @@
30413041

30423042
function enqueue(method, arg) {
30433043
function callInvokeWithMethodAndArg() {
3044-
return new PromiseImpl(function (resolve, reject) {
3044+
return new Promise(function (resolve, reject) {
30453045
invoke(method, arg, resolve, reject);
30463046
});
30473047
}
@@ -3078,9 +3078,8 @@
30783078
// AsyncIterator objects; they just return a Promise for the value of
30793079
// the final result produced by the iterator.
30803080

3081-
exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {
3082-
if (PromiseImpl === void 0) PromiseImpl = Promise;
3083-
var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);
3081+
exports.async = function (innerFn, outerFn, self, tryLocsList) {
3082+
var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList));
30843083
return exports.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator.
30853084
: iter.next().then(function (result) {
30863085
return result.done ? result.value : iter.next();
@@ -7408,6 +7407,34 @@
74087407
}
74097408
}
74107409

7410+
/**
7411+
* Creates a deep copy of the value which may contain (nested) `Array`s and
7412+
* `Object`s, `Number`s, `String`s, `Boolean`s and `Date`s. `Function`s are
7413+
* assigned by reference rather than copied
7414+
*
7415+
* Dispatches to a `clone` method if present.
7416+
*
7417+
* @func
7418+
* @memberOf R
7419+
* @since v0.1.0
7420+
* @category Object
7421+
* @sig {*} -> {*}
7422+
* @param {*} value The object or array to clone
7423+
* @return {*} A deeply cloned copy of `val`
7424+
* @example
7425+
*
7426+
* const objects = [{}, {}, {}];
7427+
* const objectsClone = R.clone(objects);
7428+
* objects === objectsClone; //=> false
7429+
* objects[0] === objectsClone[0]; //=> false
7430+
*/
7431+
7432+
var clone =
7433+
/*#__PURE__*/
7434+
_curry1(function clone(value) {
7435+
return value != null && typeof value.clone === 'function' ? value.clone() : _clone(value, [], [], true);
7436+
});
7437+
74117438
/**
74127439
* A function that returns the `!` of its argument. It will return `true` when
74137440
* passed false-y value, and `false` when passed a truth-y one.
@@ -15983,12 +16010,14 @@
1598316010
var ResultSet =
1598416011
/*#__PURE__*/
1598516012
function () {
15986-
function ResultSet(loadResponse, options) {
16013+
function ResultSet(loadResponse) {
16014+
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
16015+
1598716016
_classCallCheck(this, ResultSet);
1598816017

15989-
options = options || {};
1599016018
this.loadResponse = loadResponse;
1599116019
this.parseDateMeasures = options.parseDateMeasures;
16020+
this.options = options;
1599216021
}
1599316022

1599416023
_createClass(ResultSet, [{
@@ -16531,6 +16560,13 @@
1653116560

1653216561
return this.backwardCompatibleData;
1653316562
}
16563+
}, {
16564+
key: "serialize",
16565+
value: function serialize() {
16566+
return {
16567+
loadResponse: clone(this.loadResponse)
16568+
};
16569+
}
1653416570
}], [{
1653516571
key: "timeDimensionMember",
1653616572
value: function timeDimensionMember(td) {
@@ -16612,6 +16648,12 @@
1661216648
value: function measureFromAxis(axisValues) {
1661316649
return axisValues[axisValues.length - 1];
1661416650
}
16651+
}, {
16652+
key: "deserialize",
16653+
value: function deserialize(data) {
16654+
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
16655+
return new ResultSet(data.loadResponse, options);
16656+
}
1661516657
}]);
1661616658

1661716659
return ResultSet;

packages/cubejs-client-core/index.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ declare module '@cubejs-client/core' {
218218
*/
219219
static measureFromAxis(axisValues: string[]): string;
220220
static getNormalizedPivotConfig(query: Query, pivotConfig?: Partial<PivotConfig>): PivotConfig;
221+
static deserialize<TData>(data: Object, options?: Object): ResultSet<TData>;
221222

222223
/**
223224
* Creates a new instance of ResultSet based on [LoadResponse](#load-response) data.
@@ -241,6 +242,8 @@ declare module '@cubejs-client/core' {
241242
*/
242243
constructor(loadResponse: LoadResponse<T>, options?: Object);
243244

245+
serialize(): Object;
246+
244247
/**
245248
* @hidden
246249
*/

packages/cubejs-client-core/src/ResultSet.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {
2-
groupBy, pipe, fromPairs, toPairs, uniq, filter, map, unnest, dropLast, equals, reduce, minBy, maxBy
2+
groupBy, pipe, fromPairs, toPairs, uniq, filter, map, unnest, dropLast, equals, reduce, minBy, maxBy, clone
33
} from 'ramda';
44
import Moment from 'moment';
55
import momentRange from 'moment-range';
@@ -27,10 +27,10 @@ const DateRegex = /^\d\d\d\d-\d\d-\d\d$/;
2727
const LocalDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z?$/;
2828

2929
class ResultSet {
30-
constructor(loadResponse, options) {
31-
options = options || {};
30+
constructor(loadResponse, options = {}) {
3231
this.loadResponse = loadResponse;
3332
this.parseDateMeasures = options.parseDateMeasures;
33+
this.options = options;
3434
}
3535

3636
drillDown(drillDownLocator, pivotConfig) {
@@ -512,6 +512,16 @@ class ResultSet {
512512
}
513513
return this.backwardCompatibleData;
514514
}
515+
516+
serialize() {
517+
return {
518+
loadResponse: clone(this.loadResponse)
519+
};
520+
}
521+
522+
static deserialize(data, options = {}) {
523+
return new ResultSet(data.loadResponse, options);
524+
}
515525
}
516526

517527
export default ResultSet;

0 commit comments

Comments
 (0)