@kepler.gl/reducers 3.3.0-alpha.14 → 3.3.0-alpha.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,289 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.addGroupByUpdater = addGroupByUpdater;
8
+ exports.addJoinUpdater = addJoinUpdater;
9
+ exports.addSpatialJoinUpdater = addSpatialJoinUpdater;
10
+ exports.executeGroupBy = executeGroupBy;
11
+ exports.executeJoin = executeJoin;
12
+ exports.executeSpatialJoin = executeSpatialJoin;
13
+ exports.removeDatasetOpUpdater = removeDatasetOpUpdater;
14
+ exports.removeOpsForDatasets = removeOpsForDatasets;
15
+ exports.setGroupByConfigUpdater = setGroupByConfigUpdater;
16
+ exports.setJoinConfigUpdater = setJoinConfigUpdater;
17
+ exports.setSpatialJoinConfigUpdater = setSpatialJoinConfigUpdater;
18
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
19
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
20
+ var _commonUtils = require("@kepler.gl/common-utils");
21
+ var _table = require("@kepler.gl/table");
22
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
23
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT
24
+ // Copyright contributors to the kepler.gl project
25
+ function deactivateOps(ops) {
26
+ return ops.map(function (op) {
27
+ return _objectSpread(_objectSpread({}, op), {}, {
28
+ isConfigActive: false
29
+ });
30
+ });
31
+ }
32
+ function randomTwoDigitSuffix() {
33
+ return String(Math.floor(Math.random() * 100)).padStart(2, '0');
34
+ }
35
+ function defaultGroupByLabel() {
36
+ return "group-by-".concat(randomTwoDigitSuffix());
37
+ }
38
+ function defaultJoinLabel() {
39
+ return "join-dataset-".concat(randomTwoDigitSuffix());
40
+ }
41
+ function defaultSpatialJoinLabel(resultId) {
42
+ return "spatial-join-".concat(resultId);
43
+ }
44
+ function addGroupByUpdater(state, action) {
45
+ var dataset = state.datasets[action.dataId];
46
+ if (!(0, _table.isTabularDatasetForOps)(dataset)) {
47
+ return state;
48
+ }
49
+ var id = (0, _commonUtils.generateHashId)(6);
50
+ var resultId = (0, _commonUtils.generateHashId)(6);
51
+ var op = {
52
+ id: id,
53
+ dataId: action.dataId,
54
+ fieldName: null,
55
+ aggregations: (0, _table.defaultAggregationsForFields)(dataset.fields),
56
+ resultId: resultId,
57
+ resultLabel: defaultGroupByLabel(),
58
+ isConfigActive: true,
59
+ error: null
60
+ };
61
+ return _objectSpread(_objectSpread({}, state), {}, {
62
+ groupBys: [].concat((0, _toConsumableArray2["default"])(deactivateOps(state.groupBys)), [op]),
63
+ joins: deactivateOps(state.joins)
64
+ });
65
+ }
66
+ function setGroupByConfigUpdater(state, action) {
67
+ return _objectSpread(_objectSpread({}, state), {}, {
68
+ groupBys: state.groupBys.map(function (op) {
69
+ var _action$config$error;
70
+ return op.id === action.id ? _objectSpread(_objectSpread(_objectSpread({}, op), action.config), {}, {
71
+ error: (_action$config$error = action.config.error) !== null && _action$config$error !== void 0 ? _action$config$error : null
72
+ }) : op;
73
+ })
74
+ });
75
+ }
76
+ function executeGroupBy(state, action) {
77
+ var op = state.groupBys.find(function (item) {
78
+ return item.id === action.id;
79
+ });
80
+ var dataset = op ? state.datasets[op.dataId] : undefined;
81
+ if (!op || !dataset || !op.fieldName) {
82
+ return {
83
+ state: setGroupByConfigUpdater(state, {
84
+ id: action.id,
85
+ config: {
86
+ error: 'Select a grouping field'
87
+ }
88
+ })
89
+ };
90
+ }
91
+ try {
92
+ var proto = (0, _table.groupByDataset)(dataset, {
93
+ fieldName: op.fieldName,
94
+ aggregations: op.aggregations,
95
+ label: op.resultLabel,
96
+ resultId: op.resultId,
97
+ operationId: op.id
98
+ });
99
+ return {
100
+ state: _objectSpread(_objectSpread({}, state), {}, {
101
+ groupBys: state.groupBys.map(function (item) {
102
+ return item.id === op.id ? _objectSpread(_objectSpread({}, item), {}, {
103
+ isConfigActive: false,
104
+ error: null
105
+ }) : item;
106
+ })
107
+ }),
108
+ proto: proto
109
+ };
110
+ } catch (error) {
111
+ return {
112
+ state: setGroupByConfigUpdater(state, {
113
+ id: action.id,
114
+ config: {
115
+ error: error instanceof Error ? error.message : String(error)
116
+ }
117
+ })
118
+ };
119
+ }
120
+ }
121
+ function addJoinUpdater(state, action) {
122
+ var dataset = state.datasets[action.dataId];
123
+ if (!(0, _table.isTabularDatasetForOps)(dataset)) {
124
+ return state;
125
+ }
126
+ var implementation = action.implementation || 'simple';
127
+ var id = (0, _commonUtils.generateHashId)(6);
128
+ var resultId = (0, _commonUtils.generateHashId)(6);
129
+ var op = {
130
+ id: id,
131
+ implementation: implementation,
132
+ leftDataId: action.dataId,
133
+ rightDataId: null,
134
+ leftField: null,
135
+ rightField: null,
136
+ type: 'LEFT',
137
+ aggregations: {},
138
+ leftGeo: implementation === 'spatial' ? (0, _table.suggestSpatialGeo)(dataset.fields) : null,
139
+ rightGeo: null,
140
+ predicate: implementation === 'spatial' ? 'intersects' : undefined,
141
+ resultId: resultId,
142
+ resultLabel: implementation === 'spatial' ? defaultSpatialJoinLabel(resultId) : defaultJoinLabel(),
143
+ isConfigActive: true,
144
+ error: null
145
+ };
146
+ return _objectSpread(_objectSpread({}, state), {}, {
147
+ joins: [].concat((0, _toConsumableArray2["default"])(deactivateOps(state.joins)), [op]),
148
+ groupBys: deactivateOps(state.groupBys)
149
+ });
150
+ }
151
+ function setJoinConfigUpdater(state, action) {
152
+ return _objectSpread(_objectSpread({}, state), {}, {
153
+ joins: state.joins.map(function (op) {
154
+ var _action$config$error2;
155
+ return op.id === action.id ? _objectSpread(_objectSpread(_objectSpread({}, op), action.config), {}, {
156
+ error: (_action$config$error2 = action.config.error) !== null && _action$config$error2 !== void 0 ? _action$config$error2 : null
157
+ }) : op;
158
+ })
159
+ });
160
+ }
161
+ function executeJoin(state, action) {
162
+ var op = state.joins.find(function (item) {
163
+ return item.id === action.id && item.implementation !== 'spatial';
164
+ });
165
+ var left = op ? state.datasets[op.leftDataId] : undefined;
166
+ var right = op !== null && op !== void 0 && op.rightDataId ? state.datasets[op.rightDataId] : undefined;
167
+ if (!op || !left || !right || !op.leftField || !op.rightField) {
168
+ return {
169
+ state: setJoinConfigUpdater(state, {
170
+ id: action.id,
171
+ config: {
172
+ error: 'Select datasets and join keys'
173
+ }
174
+ })
175
+ };
176
+ }
177
+ try {
178
+ var proto = (0, _table.joinDatasets)(left, right, {
179
+ leftField: op.leftField,
180
+ rightField: op.rightField,
181
+ type: op.type,
182
+ leftColumns: op.leftColumns,
183
+ rightColumns: op.rightColumns,
184
+ label: op.resultLabel,
185
+ resultId: op.resultId,
186
+ operationId: op.id
187
+ });
188
+ return {
189
+ state: _objectSpread(_objectSpread({}, state), {}, {
190
+ joins: state.joins.map(function (item) {
191
+ return item.id === op.id ? _objectSpread(_objectSpread({}, item), {}, {
192
+ isConfigActive: false,
193
+ error: null
194
+ }) : item;
195
+ })
196
+ }),
197
+ proto: proto
198
+ };
199
+ } catch (error) {
200
+ return {
201
+ state: setJoinConfigUpdater(state, {
202
+ id: action.id,
203
+ config: {
204
+ error: error instanceof Error ? error.message : String(error)
205
+ }
206
+ })
207
+ };
208
+ }
209
+ }
210
+ function addSpatialJoinUpdater(state, action) {
211
+ return addJoinUpdater(state, {
212
+ dataId: action.dataId,
213
+ implementation: 'spatial'
214
+ });
215
+ }
216
+ function setSpatialJoinConfigUpdater(state, action) {
217
+ return setJoinConfigUpdater(state, action);
218
+ }
219
+ function executeSpatialJoin(state, action) {
220
+ var op = state.joins.find(function (item) {
221
+ return item.id === action.id && item.implementation === 'spatial';
222
+ });
223
+ var left = op ? state.datasets[op.leftDataId] : undefined;
224
+ var right = op !== null && op !== void 0 && op.rightDataId ? state.datasets[op.rightDataId] : undefined;
225
+ if (!op || !left || !right || !op.leftGeo || !op.rightGeo) {
226
+ return {
227
+ state: setJoinConfigUpdater(state, {
228
+ id: action.id,
229
+ config: {
230
+ error: 'Select datasets and geometry fields'
231
+ }
232
+ })
233
+ };
234
+ }
235
+ try {
236
+ var proto = (0, _table.spatialJoinDatasets)(left, right, {
237
+ leftGeo: op.leftGeo,
238
+ rightGeo: op.rightGeo,
239
+ aggregations: op.aggregations,
240
+ leftColumns: op.leftColumns,
241
+ predicate: op.predicate || 'intersects',
242
+ label: op.resultLabel,
243
+ resultId: op.resultId,
244
+ operationId: op.id
245
+ });
246
+ return {
247
+ state: _objectSpread(_objectSpread({}, state), {}, {
248
+ joins: state.joins.map(function (item) {
249
+ return item.id === op.id ? _objectSpread(_objectSpread({}, item), {}, {
250
+ isConfigActive: false,
251
+ error: null
252
+ }) : item;
253
+ })
254
+ }),
255
+ proto: proto
256
+ };
257
+ } catch (error) {
258
+ return {
259
+ state: setJoinConfigUpdater(state, {
260
+ id: action.id,
261
+ config: {
262
+ error: error instanceof Error ? error.message : String(error)
263
+ }
264
+ })
265
+ };
266
+ }
267
+ }
268
+ function removeDatasetOpUpdater(state, action) {
269
+ return _objectSpread(_objectSpread({}, state), {}, {
270
+ groupBys: state.groupBys.filter(function (op) {
271
+ return op.id !== action.id;
272
+ }),
273
+ joins: state.joins.filter(function (op) {
274
+ return op.id !== action.id;
275
+ })
276
+ });
277
+ }
278
+ function removeOpsForDatasets(state, dataIds) {
279
+ var ids = new Set(dataIds);
280
+ return _objectSpread(_objectSpread({}, state), {}, {
281
+ groupBys: state.groupBys.filter(function (op) {
282
+ return !ids.has(op.dataId) && !ids.has(op.resultId);
283
+ }),
284
+ joins: state.joins.filter(function (op) {
285
+ return !ids.has(op.leftDataId) && !(op.rightDataId && ids.has(op.rightDataId)) && !ids.has(op.resultId);
286
+ })
287
+ });
288
+ }
289
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29tbW9uVXRpbHMiLCJyZXF1aXJlIiwiX3RhYmxlIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJkZWFjdGl2YXRlT3BzIiwib3BzIiwibWFwIiwib3AiLCJpc0NvbmZpZ0FjdGl2ZSIsInJhbmRvbVR3b0RpZ2l0U3VmZml4IiwiU3RyaW5nIiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwicGFkU3RhcnQiLCJkZWZhdWx0R3JvdXBCeUxhYmVsIiwiY29uY2F0IiwiZGVmYXVsdEpvaW5MYWJlbCIsImRlZmF1bHRTcGF0aWFsSm9pbkxhYmVsIiwicmVzdWx0SWQiLCJhZGRHcm91cEJ5VXBkYXRlciIsInN0YXRlIiwiYWN0aW9uIiwiZGF0YXNldCIsImRhdGFzZXRzIiwiZGF0YUlkIiwiaXNUYWJ1bGFyRGF0YXNldEZvck9wcyIsImlkIiwiZ2VuZXJhdGVIYXNoSWQiLCJmaWVsZE5hbWUiLCJhZ2dyZWdhdGlvbnMiLCJkZWZhdWx0QWdncmVnYXRpb25zRm9yRmllbGRzIiwiZmllbGRzIiwicmVzdWx0TGFiZWwiLCJlcnJvciIsImdyb3VwQnlzIiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsImpvaW5zIiwic2V0R3JvdXBCeUNvbmZpZ1VwZGF0ZXIiLCJfYWN0aW9uJGNvbmZpZyRlcnJvciIsImNvbmZpZyIsImV4ZWN1dGVHcm91cEJ5IiwiZmluZCIsIml0ZW0iLCJ1bmRlZmluZWQiLCJwcm90byIsImdyb3VwQnlEYXRhc2V0IiwibGFiZWwiLCJvcGVyYXRpb25JZCIsIkVycm9yIiwibWVzc2FnZSIsImFkZEpvaW5VcGRhdGVyIiwiaW1wbGVtZW50YXRpb24iLCJsZWZ0RGF0YUlkIiwicmlnaHREYXRhSWQiLCJsZWZ0RmllbGQiLCJyaWdodEZpZWxkIiwidHlwZSIsImxlZnRHZW8iLCJzdWdnZXN0U3BhdGlhbEdlbyIsInJpZ2h0R2VvIiwicHJlZGljYXRlIiwic2V0Sm9pbkNvbmZpZ1VwZGF0ZXIiLCJfYWN0aW9uJGNvbmZpZyRlcnJvcjIiLCJleGVjdXRlSm9pbiIsImxlZnQiLCJyaWdodCIsImpvaW5EYXRhc2V0cyIsImxlZnRDb2x1bW5zIiwicmlnaHRDb2x1bW5zIiwiYWRkU3BhdGlhbEpvaW5VcGRhdGVyIiwic2V0U3BhdGlhbEpvaW5Db25maWdVcGRhdGVyIiwiZXhlY3V0ZVNwYXRpYWxKb2luIiwic3BhdGlhbEpvaW5EYXRhc2V0cyIsInJlbW92ZURhdGFzZXRPcFVwZGF0ZXIiLCJyZW1vdmVPcHNGb3JEYXRhc2V0cyIsImRhdGFJZHMiLCJpZHMiLCJTZXQiLCJoYXMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YXNldC1vcHMtdXBkYXRlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtnZW5lcmF0ZUhhc2hJZH0gZnJvbSAnQGtlcGxlci5nbC9jb21tb24tdXRpbHMnO1xuaW1wb3J0IHtcbiAgZGVmYXVsdEFnZ3JlZ2F0aW9uc0ZvckZpZWxkcyxcbiAgZ3JvdXBCeURhdGFzZXQsXG4gIGlzVGFidWxhckRhdGFzZXRGb3JPcHMsXG4gIGpvaW5EYXRhc2V0cyxcbiAgc3BhdGlhbEpvaW5EYXRhc2V0cyxcbiAgc3VnZ2VzdFNwYXRpYWxHZW8sXG4gIEdyb3VwQnlPcCxcbiAgSm9pbk9wXG59IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtQcm90b0RhdGFzZXR9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtWaXNTdGF0ZUFjdGlvbnN9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge1Zpc1N0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuXG5leHBvcnQgdHlwZSBEZXJpdmVkRGF0YXNldE9wUmVzdWx0ID0ge1xuICBzdGF0ZTogVmlzU3RhdGU7XG4gIHByb3RvPzogUHJvdG9EYXRhc2V0O1xufTtcblxuZnVuY3Rpb24gZGVhY3RpdmF0ZU9wczxUIGV4dGVuZHMge2lzQ29uZmlnQWN0aXZlPzogYm9vbGVhbn0+KG9wczogVFtdKTogVFtdIHtcbiAgcmV0dXJuIG9wcy5tYXAob3AgPT4gKHsuLi5vcCwgaXNDb25maWdBY3RpdmU6IGZhbHNlfSkpO1xufVxuXG5mdW5jdGlvbiByYW5kb21Ud29EaWdpdFN1ZmZpeCgpOiBzdHJpbmcge1xuICByZXR1cm4gU3RyaW5nKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMCkpLnBhZFN0YXJ0KDIsICcwJyk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRHcm91cEJ5TGFiZWwoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBncm91cC1ieS0ke3JhbmRvbVR3b0RpZ2l0U3VmZml4KCl9YDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEpvaW5MYWJlbCgpOiBzdHJpbmcge1xuICByZXR1cm4gYGpvaW4tZGF0YXNldC0ke3JhbmRvbVR3b0RpZ2l0U3VmZml4KCl9YDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFNwYXRpYWxKb2luTGFiZWwocmVzdWx0SWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgc3BhdGlhbC1qb2luLSR7cmVzdWx0SWR9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEdyb3VwQnlVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkFkZEdyb3VwQnlVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IGRhdGFzZXQgPSBzdGF0ZS5kYXRhc2V0c1thY3Rpb24uZGF0YUlkXTtcbiAgaWYgKCFpc1RhYnVsYXJEYXRhc2V0Rm9yT3BzKGRhdGFzZXQpKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IGlkID0gZ2VuZXJhdGVIYXNoSWQoNik7XG4gIGNvbnN0IHJlc3VsdElkID0gZ2VuZXJhdGVIYXNoSWQoNik7XG4gIGNvbnN0IG9wOiBHcm91cEJ5T3AgPSB7XG4gICAgaWQsXG4gICAgZGF0YUlkOiBhY3Rpb24uZGF0YUlkLFxuICAgIGZpZWxkTmFtZTogbnVsbCxcbiAgICBhZ2dyZWdhdGlvbnM6IGRlZmF1bHRBZ2dyZWdhdGlvbnNGb3JGaWVsZHMoZGF0YXNldC5maWVsZHMpLFxuICAgIHJlc3VsdElkLFxuICAgIHJlc3VsdExhYmVsOiBkZWZhdWx0R3JvdXBCeUxhYmVsKCksXG4gICAgaXNDb25maWdBY3RpdmU6IHRydWUsXG4gICAgZXJyb3I6IG51bGxcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBncm91cEJ5czogWy4uLmRlYWN0aXZhdGVPcHMoc3RhdGUuZ3JvdXBCeXMpLCBvcF0sXG4gICAgam9pbnM6IGRlYWN0aXZhdGVPcHMoc3RhdGUuam9pbnMpXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRHcm91cEJ5Q29uZmlnVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5TZXRHcm91cEJ5Q29uZmlnVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGdyb3VwQnlzOiBzdGF0ZS5ncm91cEJ5cy5tYXAob3AgPT5cbiAgICAgIG9wLmlkID09PSBhY3Rpb24uaWQgPyB7Li4ub3AsIC4uLmFjdGlvbi5jb25maWcsIGVycm9yOiBhY3Rpb24uY29uZmlnLmVycm9yID8/IG51bGx9IDogb3BcbiAgICApXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlR3JvdXBCeShcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5SdW5Hcm91cEJ5VXBkYXRlckFjdGlvblxuKTogRGVyaXZlZERhdGFzZXRPcFJlc3VsdCB7XG4gIGNvbnN0IG9wID0gc3RhdGUuZ3JvdXBCeXMuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IGFjdGlvbi5pZCk7XG4gIGNvbnN0IGRhdGFzZXQgPSBvcCA/IHN0YXRlLmRhdGFzZXRzW29wLmRhdGFJZF0gOiB1bmRlZmluZWQ7XG4gIGlmICghb3AgfHwgIWRhdGFzZXQgfHwgIW9wLmZpZWxkTmFtZSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZTogc2V0R3JvdXBCeUNvbmZpZ1VwZGF0ZXIoc3RhdGUsIHtcbiAgICAgICAgaWQ6IGFjdGlvbi5pZCxcbiAgICAgICAgY29uZmlnOiB7ZXJyb3I6ICdTZWxlY3QgYSBncm91cGluZyBmaWVsZCd9XG4gICAgICB9KVxuICAgIH07XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHByb3RvID0gZ3JvdXBCeURhdGFzZXQoZGF0YXNldCwge1xuICAgICAgZmllbGROYW1lOiBvcC5maWVsZE5hbWUsXG4gICAgICBhZ2dyZWdhdGlvbnM6IG9wLmFnZ3JlZ2F0aW9ucyxcbiAgICAgIGxhYmVsOiBvcC5yZXN1bHRMYWJlbCxcbiAgICAgIHJlc3VsdElkOiBvcC5yZXN1bHRJZCxcbiAgICAgIG9wZXJhdGlvbklkOiBvcC5pZFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZToge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgZ3JvdXBCeXM6IHN0YXRlLmdyb3VwQnlzLm1hcChpdGVtID0+XG4gICAgICAgICAgaXRlbS5pZCA9PT0gb3AuaWQgPyB7Li4uaXRlbSwgaXNDb25maWdBY3RpdmU6IGZhbHNlLCBlcnJvcjogbnVsbH0gOiBpdGVtXG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgICBwcm90b1xuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlOiBzZXRHcm91cEJ5Q29uZmlnVXBkYXRlcihzdGF0ZSwge1xuICAgICAgICBpZDogYWN0aW9uLmlkLFxuICAgICAgICBjb25maWc6IHtlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfVxuICAgICAgfSlcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRKb2luVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRKb2luVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBkYXRhc2V0ID0gc3RhdGUuZGF0YXNldHNbYWN0aW9uLmRhdGFJZF07XG4gIGlmICghaXNUYWJ1bGFyRGF0YXNldEZvck9wcyhkYXRhc2V0KSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBpbXBsZW1lbnRhdGlvbiA9IGFjdGlvbi5pbXBsZW1lbnRhdGlvbiB8fCAnc2ltcGxlJztcbiAgY29uc3QgaWQgPSBnZW5lcmF0ZUhhc2hJZCg2KTtcbiAgY29uc3QgcmVzdWx0SWQgPSBnZW5lcmF0ZUhhc2hJZCg2KTtcbiAgY29uc3Qgb3A6IEpvaW5PcCA9IHtcbiAgICBpZCxcbiAgICBpbXBsZW1lbnRhdGlvbixcbiAgICBsZWZ0RGF0YUlkOiBhY3Rpb24uZGF0YUlkLFxuICAgIHJpZ2h0RGF0YUlkOiBudWxsLFxuICAgIGxlZnRGaWVsZDogbnVsbCxcbiAgICByaWdodEZpZWxkOiBudWxsLFxuICAgIHR5cGU6ICdMRUZUJyxcbiAgICBhZ2dyZWdhdGlvbnM6IHt9LFxuICAgIGxlZnRHZW86IGltcGxlbWVudGF0aW9uID09PSAnc3BhdGlhbCcgPyBzdWdnZXN0U3BhdGlhbEdlbyhkYXRhc2V0LmZpZWxkcykgOiBudWxsLFxuICAgIHJpZ2h0R2VvOiBudWxsLFxuICAgIHByZWRpY2F0ZTogaW1wbGVtZW50YXRpb24gPT09ICdzcGF0aWFsJyA/ICdpbnRlcnNlY3RzJyA6IHVuZGVmaW5lZCxcbiAgICByZXN1bHRJZCxcbiAgICByZXN1bHRMYWJlbDpcbiAgICAgIGltcGxlbWVudGF0aW9uID09PSAnc3BhdGlhbCcgPyBkZWZhdWx0U3BhdGlhbEpvaW5MYWJlbChyZXN1bHRJZCkgOiBkZWZhdWx0Sm9pbkxhYmVsKCksXG4gICAgaXNDb25maWdBY3RpdmU6IHRydWUsXG4gICAgZXJyb3I6IG51bGxcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBqb2luczogWy4uLmRlYWN0aXZhdGVPcHMoc3RhdGUuam9pbnMpLCBvcF0sXG4gICAgZ3JvdXBCeXM6IGRlYWN0aXZhdGVPcHMoc3RhdGUuZ3JvdXBCeXMpXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRKb2luQ29uZmlnVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5TZXRKb2luQ29uZmlnVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGpvaW5zOiBzdGF0ZS5qb2lucy5tYXAob3AgPT5cbiAgICAgIG9wLmlkID09PSBhY3Rpb24uaWQgPyB7Li4ub3AsIC4uLmFjdGlvbi5jb25maWcsIGVycm9yOiBhY3Rpb24uY29uZmlnLmVycm9yID8/IG51bGx9IDogb3BcbiAgICApXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlSm9pbihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5SdW5Kb2luVXBkYXRlckFjdGlvblxuKTogRGVyaXZlZERhdGFzZXRPcFJlc3VsdCB7XG4gIGNvbnN0IG9wID0gc3RhdGUuam9pbnMuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IGFjdGlvbi5pZCAmJiBpdGVtLmltcGxlbWVudGF0aW9uICE9PSAnc3BhdGlhbCcpO1xuICBjb25zdCBsZWZ0ID0gb3AgPyBzdGF0ZS5kYXRhc2V0c1tvcC5sZWZ0RGF0YUlkXSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmlnaHQgPSBvcD8ucmlnaHREYXRhSWQgPyBzdGF0ZS5kYXRhc2V0c1tvcC5yaWdodERhdGFJZF0gOiB1bmRlZmluZWQ7XG4gIGlmICghb3AgfHwgIWxlZnQgfHwgIXJpZ2h0IHx8ICFvcC5sZWZ0RmllbGQgfHwgIW9wLnJpZ2h0RmllbGQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGU6IHNldEpvaW5Db25maWdVcGRhdGVyKHN0YXRlLCB7XG4gICAgICAgIGlkOiBhY3Rpb24uaWQsXG4gICAgICAgIGNvbmZpZzoge2Vycm9yOiAnU2VsZWN0IGRhdGFzZXRzIGFuZCBqb2luIGtleXMnfVxuICAgICAgfSlcbiAgICB9O1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwcm90byA9IGpvaW5EYXRhc2V0cyhsZWZ0LCByaWdodCwge1xuICAgICAgbGVmdEZpZWxkOiBvcC5sZWZ0RmllbGQsXG4gICAgICByaWdodEZpZWxkOiBvcC5yaWdodEZpZWxkLFxuICAgICAgdHlwZTogb3AudHlwZSxcbiAgICAgIGxlZnRDb2x1bW5zOiBvcC5sZWZ0Q29sdW1ucyxcbiAgICAgIHJpZ2h0Q29sdW1uczogb3AucmlnaHRDb2x1bW5zLFxuICAgICAgbGFiZWw6IG9wLnJlc3VsdExhYmVsLFxuICAgICAgcmVzdWx0SWQ6IG9wLnJlc3VsdElkLFxuICAgICAgb3BlcmF0aW9uSWQ6IG9wLmlkXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBqb2luczogc3RhdGUuam9pbnMubWFwKGl0ZW0gPT5cbiAgICAgICAgICBpdGVtLmlkID09PSBvcC5pZCA/IHsuLi5pdGVtLCBpc0NvbmZpZ0FjdGl2ZTogZmFsc2UsIGVycm9yOiBudWxsfSA6IGl0ZW1cbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIHByb3RvXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGU6IHNldEpvaW5Db25maWdVcGRhdGVyKHN0YXRlLCB7XG4gICAgICAgIGlkOiBhY3Rpb24uaWQsXG4gICAgICAgIGNvbmZpZzoge2Vycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9XG4gICAgICB9KVxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFNwYXRpYWxKb2luVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRTcGF0aWFsSm9pblVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIGFkZEpvaW5VcGRhdGVyKHN0YXRlLCB7ZGF0YUlkOiBhY3Rpb24uZGF0YUlkLCBpbXBsZW1lbnRhdGlvbjogJ3NwYXRpYWwnfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRTcGF0aWFsSm9pbkNvbmZpZ1VwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuU2V0U3BhdGlhbEpvaW5Db25maWdVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIHJldHVybiBzZXRKb2luQ29uZmlnVXBkYXRlcihzdGF0ZSwgYWN0aW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVTcGF0aWFsSm9pbihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5SdW5TcGF0aWFsSm9pblVwZGF0ZXJBY3Rpb25cbik6IERlcml2ZWREYXRhc2V0T3BSZXN1bHQge1xuICBjb25zdCBvcCA9IHN0YXRlLmpvaW5zLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSBhY3Rpb24uaWQgJiYgaXRlbS5pbXBsZW1lbnRhdGlvbiA9PT0gJ3NwYXRpYWwnKTtcbiAgY29uc3QgbGVmdCA9IG9wID8gc3RhdGUuZGF0YXNldHNbb3AubGVmdERhdGFJZF0gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJpZ2h0ID0gb3A/LnJpZ2h0RGF0YUlkID8gc3RhdGUuZGF0YXNldHNbb3AucmlnaHREYXRhSWRdIDogdW5kZWZpbmVkO1xuICBpZiAoIW9wIHx8ICFsZWZ0IHx8ICFyaWdodCB8fCAhb3AubGVmdEdlbyB8fCAhb3AucmlnaHRHZW8pIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGU6IHNldEpvaW5Db25maWdVcGRhdGVyKHN0YXRlLCB7XG4gICAgICAgIGlkOiBhY3Rpb24uaWQsXG4gICAgICAgIGNvbmZpZzoge2Vycm9yOiAnU2VsZWN0IGRhdGFzZXRzIGFuZCBnZW9tZXRyeSBmaWVsZHMnfVxuICAgICAgfSlcbiAgICB9O1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwcm90byA9IHNwYXRpYWxKb2luRGF0YXNldHMobGVmdCwgcmlnaHQsIHtcbiAgICAgIGxlZnRHZW86IG9wLmxlZnRHZW8sXG4gICAgICByaWdodEdlbzogb3AucmlnaHRHZW8sXG4gICAgICBhZ2dyZWdhdGlvbnM6IG9wLmFnZ3JlZ2F0aW9ucyxcbiAgICAgIGxlZnRDb2x1bW5zOiBvcC5sZWZ0Q29sdW1ucyxcbiAgICAgIHByZWRpY2F0ZTogb3AucHJlZGljYXRlIHx8ICdpbnRlcnNlY3RzJyxcbiAgICAgIGxhYmVsOiBvcC5yZXN1bHRMYWJlbCxcbiAgICAgIHJlc3VsdElkOiBvcC5yZXN1bHRJZCxcbiAgICAgIG9wZXJhdGlvbklkOiBvcC5pZFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZToge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgam9pbnM6IHN0YXRlLmpvaW5zLm1hcChpdGVtID0+XG4gICAgICAgICAgaXRlbS5pZCA9PT0gb3AuaWQgPyB7Li4uaXRlbSwgaXNDb25maWdBY3RpdmU6IGZhbHNlLCBlcnJvcjogbnVsbH0gOiBpdGVtXG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgICBwcm90b1xuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlOiBzZXRKb2luQ29uZmlnVXBkYXRlcihzdGF0ZSwge1xuICAgICAgICBpZDogYWN0aW9uLmlkLFxuICAgICAgICBjb25maWc6IHtlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfVxuICAgICAgfSlcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEYXRhc2V0T3BVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlJlbW92ZURhdGFzZXRPcFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBncm91cEJ5czogc3RhdGUuZ3JvdXBCeXMuZmlsdGVyKG9wID0+IG9wLmlkICE9PSBhY3Rpb24uaWQpLFxuICAgIGpvaW5zOiBzdGF0ZS5qb2lucy5maWx0ZXIob3AgPT4gb3AuaWQgIT09IGFjdGlvbi5pZClcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU9wc0ZvckRhdGFzZXRzKHN0YXRlOiBWaXNTdGF0ZSwgZGF0YUlkczogc3RyaW5nW10pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IGlkcyA9IG5ldyBTZXQoZGF0YUlkcyk7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZ3JvdXBCeXM6IHN0YXRlLmdyb3VwQnlzLmZpbHRlcihvcCA9PiAhaWRzLmhhcyhvcC5kYXRhSWQpICYmICFpZHMuaGFzKG9wLnJlc3VsdElkKSksXG4gICAgam9pbnM6IHN0YXRlLmpvaW5zLmZpbHRlcihcbiAgICAgIG9wID0+XG4gICAgICAgICFpZHMuaGFzKG9wLmxlZnREYXRhSWQpICYmXG4gICAgICAgICEob3AucmlnaHREYXRhSWQgJiYgaWRzLmhhcyhvcC5yaWdodERhdGFJZCkpICYmXG4gICAgICAgICFpZHMuaGFzKG9w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
@@ -0,0 +1,257 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
5
+ var _constants = require("@kepler.gl/constants");
6
+ var _actions = require("@kepler.gl/actions");
7
+ var _table = require("@kepler.gl/table");
8
+ var _schemas = _interopRequireDefault(require("@kepler.gl/schemas"));
9
+ var _tasks = require("@kepler.gl/tasks");
10
+ var _visState = _interopRequireDefault(require("./vis-state"));
11
+ var _visStateUpdaters = require("./vis-state-updaters");
12
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
13
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT
14
+ // Copyright contributors to the kepler.gl project
15
+ var reduceVisState = _visState["default"];
16
+ function makeTable(id, fields, rows) {
17
+ var table = new _table.KeplerTable({
18
+ info: {
19
+ id: id,
20
+ label: id,
21
+ type: 'local'
22
+ },
23
+ color: [0, 0, 0]
24
+ });
25
+ table.updateSchema({
26
+ fields: fields.map(function (field) {
27
+ return {
28
+ name: field.name,
29
+ type: field.type,
30
+ analyzerType: field.type
31
+ };
32
+ }),
33
+ rows: rows
34
+ });
35
+ return table;
36
+ }
37
+ function flushCreateTableTasks(state) {
38
+ var tasks = (0, _tasks.drainTasksForTesting)();
39
+ return tasks.reduce(function (nextState, task) {
40
+ if (!String(task.label || '').includes('CREATE_TABLE_TASK')) {
41
+ return nextState;
42
+ }
43
+ var tables = (Array.isArray(task.payload) ? task.payload : [task.payload]).map(function (payload) {
44
+ var table = new _table.KeplerTable(_objectSpread({
45
+ info: payload.info,
46
+ color: payload.color
47
+ }, payload.opts));
48
+ table.updateSchema(payload.data);
49
+ return table;
50
+ });
51
+ return reduceVisState(nextState, (0, _tasks.succeedTaskWithValues)(task, tables));
52
+ }, state);
53
+ }
54
+ describe('dataset ops vis-state', function () {
55
+ beforeEach(function () {
56
+ (0, _tasks.drainTasksForTesting)();
57
+ });
58
+ test('runGroupBy adds a derived dataset', function () {
59
+ var cities = makeTable('cities', [{
60
+ name: 'region',
61
+ type: _constants.ALL_FIELD_TYPES.string
62
+ }, {
63
+ name: 'pop',
64
+ type: _constants.ALL_FIELD_TYPES.integer
65
+ }], [['west', 10], ['west', 20], ['east', 40]]);
66
+ var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
67
+ datasets: {
68
+ cities: cities
69
+ }
70
+ });
71
+ state = reduceVisState(state, _actions.VisStateActions.addGroupBy('cities'));
72
+ expect(state.groupBys).toHaveLength(1);
73
+ var opId = state.groupBys[0].id;
74
+ state = reduceVisState(state, _actions.VisStateActions.setGroupByConfig(opId, {
75
+ fieldName: 'region',
76
+ aggregations: {
77
+ pop: 'sum'
78
+ }
79
+ }));
80
+ state = reduceVisState(state, _actions.VisStateActions.runGroupBy(opId));
81
+ state = flushCreateTableTasks(state);
82
+ var resultId = state.groupBys[0].resultId;
83
+ expect(state.datasets[resultId]).toBeTruthy();
84
+ expect(state.datasets[resultId].metadata.derivedDataset).toEqual({
85
+ type: 'groupBy',
86
+ sourceDataIds: ['cities'],
87
+ operationId: opId
88
+ });
89
+ expect(state.datasets[resultId].dataContainer.numRows()).toBe(2);
90
+ });
91
+ test('delete parent keeps derived child snapshot', function () {
92
+ var cities = makeTable('cities', [{
93
+ name: 'region',
94
+ type: _constants.ALL_FIELD_TYPES.string
95
+ }, {
96
+ name: 'pop',
97
+ type: _constants.ALL_FIELD_TYPES.integer
98
+ }], [['west', 10]]);
99
+ var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
100
+ datasets: {
101
+ cities: cities
102
+ }
103
+ });
104
+ state = reduceVisState(state, _actions.VisStateActions.addGroupBy('cities'));
105
+ var op = state.groupBys[0];
106
+ state = reduceVisState(state, _actions.VisStateActions.setGroupByConfig(op.id, {
107
+ fieldName: 'region',
108
+ aggregations: {
109
+ pop: 'sum'
110
+ }
111
+ }));
112
+ state = reduceVisState(state, _actions.VisStateActions.runGroupBy(op.id));
113
+ state = flushCreateTableTasks(state);
114
+ expect(Object.keys(state.datasets)).toHaveLength(2);
115
+ state = reduceVisState(state, _actions.VisStateActions.removeDataset('cities'));
116
+ expect(state.datasets.cities).toBeUndefined();
117
+ expect(state.datasets[op.resultId]).toBeTruthy();
118
+ expect(state.groupBys).toHaveLength(0);
119
+ });
120
+ test('addGroupBy uses a short random result name', function () {
121
+ var cities = makeTable('cities', [{
122
+ name: 'region',
123
+ type: _constants.ALL_FIELD_TYPES.string
124
+ }], [['west']]);
125
+ var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
126
+ datasets: {
127
+ cities: cities
128
+ }
129
+ });
130
+ state = reduceVisState(state, _actions.VisStateActions.addGroupBy('cities'));
131
+ expect(state.groupBys[0].resultLabel).toMatch(/^group-by-\d{2}$/);
132
+ });
133
+ test('addJoin uses a short random result name', function () {
134
+ var cities = makeTable('cities', [{
135
+ name: 'id',
136
+ type: _constants.ALL_FIELD_TYPES.string
137
+ }], [['1']]);
138
+ var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
139
+ datasets: {
140
+ cities: cities
141
+ }
142
+ });
143
+ state = reduceVisState(state, _actions.VisStateActions.addJoin('cities'));
144
+ expect(state.joins[0].resultLabel).toMatch(/^join-dataset-\d{2}$/);
145
+ });
146
+ test('setSpatialJoinConfig updates the predicate', function () {
147
+ var polys = makeTable('polys', [{
148
+ name: 'geom',
149
+ type: _constants.ALL_FIELD_TYPES.geojson
150
+ }], []);
151
+ var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
152
+ datasets: {
153
+ polys: polys
154
+ }
155
+ });
156
+ state = reduceVisState(state, _actions.VisStateActions.addSpatialJoin('polys'));
157
+ var op = state.joins[0];
158
+ expect(state.joins[0].predicate).toBe('intersects');
159
+ expect(state.joins[0].resultLabel).toBe("spatial-join-".concat(state.joins[0].resultId));
160
+ state = reduceVisState(state, _actions.VisStateActions.setSpatialJoinConfig(op.id, {
161
+ predicate: 'within'
162
+ }));
163
+ expect(state.joins[0].predicate).toBe('within');
164
+ });
165
+ test('delete spatial join source keeps result snapshot', function () {
166
+ var polygon = {
167
+ type: 'Polygon',
168
+ coordinates: [[[-10, -10], [10, -10], [10, 10], [-10, 10], [-10, -10]]]
169
+ };
170
+ var polys = makeTable('polys', [{
171
+ name: 'name',
172
+ type: _constants.ALL_FIELD_TYPES.string
173
+ }, {
174
+ name: 'geom',
175
+ type: _constants.ALL_FIELD_TYPES.geojson
176
+ }], [['west', polygon]]);
177
+ var pts = makeTable('pts', [{
178
+ name: 'lat',
179
+ type: _constants.ALL_FIELD_TYPES.real
180
+ }, {
181
+ name: 'lng',
182
+ type: _constants.ALL_FIELD_TYPES.real
183
+ }, {
184
+ name: 'value',
185
+ type: _constants.ALL_FIELD_TYPES.integer
186
+ }], [[0, 0, 10]]);
187
+ var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
188
+ datasets: {
189
+ polys: polys,
190
+ pts: pts
191
+ }
192
+ });
193
+ state = reduceVisState(state, _actions.VisStateActions.addSpatialJoin('polys'));
194
+ var op = state.joins[0];
195
+ state = reduceVisState(state, _actions.VisStateActions.setSpatialJoinConfig(op.id, {
196
+ rightDataId: 'pts',
197
+ leftGeo: {
198
+ kind: 'geojson',
199
+ fieldName: 'geom'
200
+ },
201
+ rightGeo: {
202
+ kind: 'latlng',
203
+ latField: 'lat',
204
+ lngField: 'lng'
205
+ },
206
+ aggregations: {
207
+ value: 'sum'
208
+ }
209
+ }));
210
+ state = reduceVisState(state, _actions.VisStateActions.runSpatialJoin(op.id));
211
+ state = flushCreateTableTasks(state);
212
+ expect(state.datasets[op.resultId]).toBeTruthy();
213
+ state = reduceVisState(state, _actions.VisStateActions.removeDataset('pts'));
214
+ expect(state.datasets.pts).toBeUndefined();
215
+ expect(state.datasets.polys).toBeTruthy();
216
+ expect(state.datasets[op.resultId]).toBeTruthy();
217
+ expect(state.joins).toHaveLength(0);
218
+ });
219
+ test('save/load roundtrip keeps derivedDataset metadata and drafts', function () {
220
+ var _derivedMeta$derivedD, _saved$config$config$;
221
+ var cities = makeTable('cities', [{
222
+ name: 'region',
223
+ type: _constants.ALL_FIELD_TYPES.string
224
+ }, {
225
+ name: 'pop',
226
+ type: _constants.ALL_FIELD_TYPES.integer
227
+ }], [['west', 10]]);
228
+ var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
229
+ datasets: {
230
+ cities: cities
231
+ }
232
+ });
233
+ state = reduceVisState(state, _actions.VisStateActions.addGroupBy('cities'));
234
+ var op = state.groupBys[0];
235
+ state = reduceVisState(state, _actions.VisStateActions.setGroupByConfig(op.id, {
236
+ fieldName: 'region',
237
+ aggregations: {
238
+ pop: 'sum'
239
+ }
240
+ }));
241
+ state = reduceVisState(state, _actions.VisStateActions.runGroupBy(op.id));
242
+ state = flushCreateTableTasks(state);
243
+ var saved = _schemas["default"].save({
244
+ visState: state,
245
+ mapState: {},
246
+ mapStyle: {},
247
+ uiState: {}
248
+ });
249
+ var derived = saved.datasets.find(function (dataset) {
250
+ return dataset.data.id === op.resultId;
251
+ });
252
+ var derivedMeta = derived === null || derived === void 0 ? void 0 : derived.data.metadata;
253
+ expect(derivedMeta === null || derivedMeta === void 0 || (_derivedMeta$derivedD = derivedMeta.derivedDataset) === null || _derivedMeta$derivedD === void 0 ? void 0 : _derivedMeta$derivedD.type).toBe('groupBy');
254
+ expect((_saved$config$config$ = saved.config.config.visState.groupBys) === null || _saved$config$config$ === void 0 ? void 0 : _saved$config$config$[0].fieldName).toBe('region');
255
+ });
256
+ });
257
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc3RhbnRzIiwicmVxdWlyZSIsIl9hY3Rpb25zIiwiX3RhYmxlIiwiX3NjaGVtYXMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX3Rhc2tzIiwiX3Zpc1N0YXRlIiwiX3Zpc1N0YXRlVXBkYXRlcnMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsInJlZHVjZVZpc1N0YXRlIiwidmlzU3RhdGVSZWR1Y2VyIiwibWFrZVRhYmxlIiwiaWQiLCJmaWVsZHMiLCJyb3dzIiwidGFibGUiLCJLZXBsZXJUYWJsZSIsImluZm8iLCJsYWJlbCIsInR5cGUiLCJjb2xvciIsInVwZGF0ZVNjaGVtYSIsIm1hcCIsImZpZWxkIiwibmFtZSIsImFuYWx5emVyVHlwZSIsImZsdXNoQ3JlYXRlVGFibGVUYXNrcyIsInN0YXRlIiwidGFza3MiLCJkcmFpblRhc2tzRm9yVGVzdGluZyIsInJlZHVjZSIsIm5leHRTdGF0ZSIsInRhc2siLCJTdHJpbmciLCJpbmNsdWRlcyIsInRhYmxlcyIsIkFycmF5IiwiaXNBcnJheSIsInBheWxvYWQiLCJvcHRzIiwiZGF0YSIsInN1Y2NlZWRUYXNrV2l0aFZhbHVlcyIsImRlc2NyaWJlIiwiYmVmb3JlRWFjaCIsInRlc3QiLCJjaXRpZXMiLCJBTExfRklFTERfVFlQRVMiLCJzdHJpbmciLCJpbnRlZ2VyIiwiSU5JVElBTF9WSVNfU1RBVEUiLCJkYXRhc2V0cyIsIlZpc1N0YXRlQWN0aW9ucyIsImFkZEdyb3VwQnkiLCJleHBlY3QiLCJncm91cEJ5cyIsInRvSGF2ZUxlbmd0aCIsIm9wSWQiLCJzZXRHcm91cEJ5Q29uZmlnIiwiZmllbGROYW1lIiwiYWdncmVnYXRpb25zIiwicG9wIiwicnVuR3JvdXBCeSIsInJlc3VsdElkIiwidG9CZVRydXRoeSIsIm1ldGFkYXRhIiwiZGVyaXZlZERhdGFzZXQiLCJ0b0VxdWFsIiwic291cmNlRGF0YUlkcyIsIm9wZXJhdGlvbklkIiwiZGF0YUNvbnRhaW5lciIsIm51bVJvd3MiLCJ0b0JlIiwib3AiLCJyZW1vdmVEYXRhc2V0IiwidG9CZVVuZGVmaW5lZCIsInJlc3VsdExhYmVsIiwidG9NYXRjaCIsImFkZEpvaW4iLCJqb2lucyIsInBvbHlzIiwiZ2VvanNvbiIsImFkZFNwYXRpYWxKb2luIiwicHJlZGljYXRlIiwiY29uY2F0Iiwic2V0U3BhdGlhbEpvaW5Db25maWciLCJwb2x5Z29uIiwiY29vcmRpbmF0ZXMiLCJwdHMiLCJyZWFsIiwicmlnaHREYXRhSWQiLCJsZWZ0R2VvIiwia2luZCIsInJpZ2h0R2VvIiwibGF0RmllbGQiLCJsbmdGaWVsZCIsInZhbHVlIiwicnVuU3BhdGlhbEpvaW4iLCJfZGVyaXZlZE1ldGEkZGVyaXZlZEQiLCJfc2F2ZWQkY29uZmlnJGNvbmZpZyQiLCJzYXZlZCIsIlNjaGVtYU1hbmFnZXIiLCJzYXZlIiwidmlzU3RhdGUiLCJtYXBTdGF0ZSIsIm1hcFN0eWxlIiwidWlTdGF0ZSIsImRlcml2ZWQiLCJmaW5kIiwiZGF0YXNldCIsImRlcml2ZWRNZXRhIiwiY29uZmlnIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFzZXQtb3BzLXVwZGF0ZXJzLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtBTExfRklFTERfVFlQRVN9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7VmlzU3RhdGVBY3Rpb25zfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtLZXBsZXJUYWJsZX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5pbXBvcnQgU2NoZW1hTWFuYWdlciwge1Zpc1N0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuaW1wb3J0IHtkcmFpblRhc2tzRm9yVGVzdGluZywgc3VjY2VlZFRhc2tXaXRoVmFsdWVzfSBmcm9tICdAa2VwbGVyLmdsL3Rhc2tzJztcblxuaW1wb3J0IHZpc1N0YXRlUmVkdWNlciBmcm9tICcuL3Zpcy1zdGF0ZSc7XG5pbXBvcnQge0lOSVRJQUxfVklTX1NUQVRFfSBmcm9tICcuL3Zpcy1zdGF0ZS11cGRhdGVycyc7XG5cbmNvbnN0IHJlZHVjZVZpc1N0YXRlID0gdmlzU3RhdGVSZWR1Y2VyIGFzIChzdGF0ZTogVmlzU3RhdGUsIGFjdGlvbjogdW5rbm93bikgPT4gVmlzU3RhdGU7XG5cbmZ1bmN0aW9uIG1ha2VUYWJsZShpZDogc3RyaW5nLCBmaWVsZHM6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZ31bXSwgcm93czogYW55W11bXSkge1xuICBjb25zdCB0YWJsZSA9IG5ldyBLZXBsZXJUYWJsZSh7XG4gICAgaW5mbzoge2lkLCBsYWJlbDogaWQsIHR5cGU6ICdsb2NhbCd9LFxuICAgIGNvbG9yOiBbMCwgMCwgMF1cbiAgfSk7XG4gIHRhYmxlLnVwZGF0ZVNjaGVtYSh7XG4gICAgZmllbGRzOiBmaWVsZHMubWFwKGZpZWxkID0+ICh7XG4gICAgICBuYW1lOiBmaWVsZC5uYW1lLFxuICAgICAgdHlwZTogZmllbGQudHlwZSxcbiAgICAgIGFuYWx5emVyVHlwZTogZmllbGQudHlwZVxuICAgIH0pKSxcbiAgICByb3dzXG4gIH0pO1xuICByZXR1cm4gdGFibGU7XG59XG5cbmZ1bmN0aW9uIGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZTogVmlzU3RhdGUpIHtcbiAgY29uc3QgdGFza3MgPSBkcmFpblRhc2tzRm9yVGVzdGluZygpO1xuICByZXR1cm4gdGFza3MucmVkdWNlKChuZXh0U3RhdGUsIHRhc2spID0+IHtcbiAgICBpZiAoIVN0cmluZyh0YXNrLmxhYmVsIHx8ICcnKS5pbmNsdWRlcygnQ1JFQVRFX1RBQkxFX1RBU0snKSkge1xuICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICB9XG4gICAgY29uc3QgdGFibGVzID0gKEFycmF5LmlzQXJyYXkodGFzay5wYXlsb2FkKSA/IHRhc2sucGF5bG9hZCA6IFt0YXNrLnBheWxvYWRdKS5tYXAocGF5bG9hZCA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IG5ldyBLZXBsZXJUYWJsZSh7aW5mbzogcGF5bG9hZC5pbmZvLCBjb2xvcjogcGF5bG9hZC5jb2xvciwgLi4ucGF5bG9hZC5vcHRzfSk7XG4gICAgICB0YWJsZS51cGRhdGVTY2hlbWEocGF5bG9hZC5kYXRhKTtcbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVkdWNlVmlzU3RhdGUobmV4dFN0YXRlLCBzdWNjZWVkVGFza1dpdGhWYWx1ZXModGFzaywgdGFibGVzKSk7XG4gIH0sIHN0YXRlKTtcbn1cblxuZGVzY3JpYmUoJ2RhdGFzZXQgb3BzIHZpcy1zdGF0ZScsICgpID0+IHtcbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgZHJhaW5UYXNrc0ZvclRlc3RpbmcoKTtcbiAgfSk7XG5cbiAgdGVzdCgncnVuR3JvdXBCeSBhZGRzIGEgZGVyaXZlZCBkYXRhc2V0JywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZShcbiAgICAgICdjaXRpZXMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ3BvcCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgWyd3ZXN0JywgMTBdLFxuICAgICAgICBbJ3dlc3QnLCAyMF0sXG4gICAgICAgIFsnZWFzdCcsIDQwXVxuICAgICAgXVxuICAgICk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHtcbiAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgICAgZGF0YXNldHM6IHtjaXRpZXN9XG4gICAgfTtcblxuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRHcm91cEJ5KCdjaXRpZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgY29uc3Qgb3BJZCA9IHN0YXRlLmdyb3VwQnlzWzBdLmlkO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldEdyb3VwQnlDb25maWcob3BJZCwge1xuICAgICAgICBmaWVsZE5hbWU6ICdyZWdpb24nLFxuICAgICAgICBhZ2dyZWdhdGlvbnM6IHtwb3A6ICdzdW0nfVxuICAgICAgfSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5Hcm91cEJ5KG9wSWQpKTtcbiAgICBzdGF0ZSA9IGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZSk7XG5cbiAgICBjb25zdCByZXN1bHRJZCA9IHN0YXRlLmdyb3VwQnlzWzBdLnJlc3VsdElkO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tyZXN1bHRJZF0pLnRvQmVUcnV0aHkoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbcmVzdWx0SWRdLm1ldGFkYXRhLmRlcml2ZWREYXRhc2V0KS50b0VxdWFsKHtcbiAgICAgIHR5cGU6ICdncm91cEJ5JyxcbiAgICAgIHNvdXJjZURhdGFJZHM6IFsnY2l0aWVzJ10sXG4gICAgICBvcGVyYXRpb25JZDogb3BJZFxuICAgIH0pO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tyZXN1bHRJZF0uZGF0YUNvbnRhaW5lci5udW1Sb3dzKCkpLnRvQmUoMik7XG4gIH0pO1xuXG4gIHRlc3QoJ2RlbGV0ZSBwYXJlbnQga2VlcHMgZGVyaXZlZCBjaGlsZCBzbmFwc2hvdCcsICgpID0+IHtcbiAgICBjb25zdCBjaXRpZXMgPSBtYWtlVGFibGUoXG4gICAgICAnY2l0aWVzJyxcbiAgICAgIFtcbiAgICAgICAge25hbWU6ICdyZWdpb24nLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfSxcbiAgICAgICAge25hbWU6ICdwb3AnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICBbWyd3ZXN0JywgMTBdXVxuICAgICk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHtcbiAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgICAgZGF0YXNldHM6IHtjaXRpZXN9XG4gICAgfTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuYWRkR3JvdXBCeSgnY2l0aWVzJykpO1xuICAgIGNvbnN0IG9wID0gc3RhdGUuZ3JvdXBCeXNbMF07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldEdyb3VwQnlDb25maWcob3AuaWQsIHtcbiAgICAgICAgZmllbGROYW1lOiAncmVnaW9uJyxcbiAgICAgICAgYWdncmVnYXRpb25zOiB7cG9wOiAnc3VtJ31cbiAgICAgIH0pXG4gICAgKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucnVuR3JvdXBCeShvcC5pZCkpO1xuICAgIHN0YXRlID0gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHN0YXRlKTtcblxuICAgIGV4cGVjdChPYmplY3Qua2V5cyhzdGF0ZS5kYXRhc2V0cykpLnRvSGF2ZUxlbmd0aCgyKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucmVtb3ZlRGF0YXNldCgnY2l0aWVzJykpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5jaXRpZXMpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzKS50b0hhdmVMZW5ndGgoMCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2FkZEdyb3VwQnkgdXNlcyBhIHNob3J0IHJhbmRvbSByZXN1bHQgbmFtZScsICgpID0+IHtcbiAgICBjb25zdCBjaXRpZXMgPSBtYWtlVGFibGUoXG4gICAgICAnY2l0aWVzJyxcbiAgICAgIFt7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9XSxcbiAgICAgIFtbJ3dlc3QnXV1cbiAgICApO1xuICAgIGxldCBzdGF0ZTogVmlzU3RhdGUgPSB7XG4gICAgICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgICAgIGRhdGFzZXRzOiB7Y2l0aWVzfVxuICAgIH07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEdyb3VwQnkoJ2NpdGllcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZ3JvdXBCeXNbMF0ucmVzdWx0TGFiZWwpLnRvTWF0Y2goL15ncm91cC1ieS1cXGR7Mn0kLyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2FkZEpvaW4gdXNlcyBhIHNob3J0IHJhbmRvbSByZXN1bHQgbmFtZScsICgpID0+IHtcbiAgICBjb25zdCBjaXRpZXMgPSBtYWtlVGFibGUoJ2NpdGllcycsIFt7bmFtZTogJ2lkJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ31dLCBbWycxJ11dKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge2NpdGllc31cbiAgICB9O1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRKb2luKCdjaXRpZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmpvaW5zWzBdLnJlc3VsdExhYmVsKS50b01hdGNoKC9eam9pbi1kYXRhc2V0LVxcZHsyfSQvKTtcbiAgfSk7XG5cbiAgdGVzdCgnc2V0U3BhdGlhbEpvaW5Db25maWcgdXBkYXRlcyB0aGUgcHJlZGljYXRlJywgKCkgPT4ge1xuICAgIGNvbnN0IHBvbHlzID0gbWFrZVRhYmxlKCdwb2x5cycsIFt7bmFtZTogJ2dlb20nLCB0eXBlOiBBTExfRklFTERfVFlQRVMuZ2VvanNvbn1dLCBbXSk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHtcbiAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgICAgZGF0YXNldHM6IHtwb2x5c31cbiAgICB9O1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRTcGF0aWFsSm9pbigncG9seXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5qb2luc1swXTtcbiAgICBleHBlY3Qoc3RhdGUuam9pbnNbMF0ucHJlZGljYXRlKS50b0JlKCdpbnRlcnNlY3RzJyk7XG4gICAgZXhwZWN0KHN0YXRlLmpvaW5zWzBdLnJlc3VsdExhYmVsKS50b0JlKGBzcGF0aWFsLWpvaW4tJHtzdGF0ZS5qb2luc1swXS5yZXN1bHRJZH1gKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0U3BhdGlhbEpvaW5Db25maWcob3AuaWQsIHtwcmVkaWNhdGU6ICd3aXRoaW4nfSlcbiAgICApO1xuICAgIGV4cGVjdChzdGF0ZS5qb2luc1swXS5wcmVkaWNhdGUpLnRvQmUoJ3dpdGhpbicpO1xuICB9KTtcblxuICB0ZXN0KCdkZWxldGUgc3BhdGlhbCBqb2luIHNvdXJjZSBrZWVwcyByZXN1bHQgc25hcHNob3QnLCAoKSA9PiB7XG4gICAgY29uc3QgcG9seWdvbiA9IHtcbiAgICAgIHR5cGU6ICdQb2x5Z29uJyxcbiAgICAgIGNvb3JkaW5hdGVzOiBbXG4gICAgICAgIFtcbiAgICAgICAgICBbLTEwLCAtMTBdLFxuICAgICAgICAgIFsxMCwgLTEwXSxcbiAgICAgICAgICBbMTAsIDEwXSxcbiAgICAgICAgICBbLTEwLCAxMF0sXG4gICAgICAgICAgWy0xMCwgLTEwXVxuICAgICAgICBdXG4gICAgICBdXG4gICAgfTtcbiAgICBjb25zdCBwb2x5cyA9IG1ha2VUYWJsZShcbiAgICAgICdwb2x5cycsXG4gICAgICBbXG4gICAgICAgIHtuYW1lOiAnbmFtZScsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ2dlb20nLCB0eXBlOiBBTExfRklFTERfVFlQRVMuZ2VvanNvbn1cbiAgICAgIF0sXG4gICAgICBbWyd3ZXN0JywgcG9seWdvbl1dXG4gICAgKTtcbiAgICBjb25zdCBwdHMgPSBtYWtlVGFibGUoXG4gICAgICAncHRzJyxcbiAgICAgIFtcbiAgICAgICAge25hbWU6ICdsYXQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMucmVhbH0sXG4gICAgICAgIHtuYW1lOiAnbG5nJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnJlYWx9LFxuICAgICAgICB7bmFtZTogJ3ZhbHVlJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICBdLFxuICAgICAgW1swLCAwLCAxMF1dXG4gICAgKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge3BvbHlzLCBwdHN9XG4gICAgfTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuYWRkU3BhdGlhbEpvaW4oJ3BvbHlzJykpO1xuICAgIGNvbnN0IG9wID0gc3RhdGUuam9pbnNbMF07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldFNwYXRpYWxKb2luQ29uZmlnKG9wLmlkLCB7XG4gICAgICAgIHJpZ2h0RGF0YUlkOiAncHRzJyxcbiAgICAgICAgbGVmdEdlbzoge2tpbmQ6ICdnZW9qc29uJywgZmllbGROYW1lOiAnZ2VvbSd9LFxuICAgICAgICByaWdodEdlbzoge2tpbmQ6ICdsYXRsbmcnLCBsYXRGaWVsZDogJ2xhdCcsIGxuZ0ZpZWxkOiAnbG5nJ30sXG4gICAgICAgIGFnZ3JlZ2F0aW9uczoge3ZhbHVlOiAnc3VtJ31cbiAgICAgIH0pXG4gICAgKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucnVuU3BhdGlhbEpvaW4ob3AuaWQpKTtcbiAgICBzdGF0ZSA9IGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZSk7XG5cbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdKS50b0JlVHJ1dGh5KCk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJlbW92ZURhdGFzZXQoJ3B0cycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMucHRzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLnBvbHlzKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW29wLnJlc3VsdElkXSkudG9CZVRydXRoeSgpO1xuICAgIGV4cGVjdChzdGF0ZS5qb2lucykudG9IYXZlTGVuZ3RoKDApO1xuICB9KTtcblxuICB0ZXN0KCdzYXZlL2xvYWQgcm91bmR0cmlwIGtlZXBzIGRlcml2ZWREYXRhc2V0IG1ldGFkYXRhIGFuZCBkcmFmdHMnLCAoKSA9PiB7XG4gICAgY29uc3QgY2l0aWVzID0gbWFrZVRhYmxlKFxuICAgICAgJ2NpdGllcycsXG4gICAgICBbXG4gICAgICAgIHtuYW1lOiAncmVnaW9uJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30sXG4gICAgICAgIHtuYW1lOiAncG9wJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICBdLFxuICAgICAgW1snd2VzdCcsIDEwXV1cbiAgICApO1xuICAgIGxldCBzdGF0ZTogVmlzU3RhdGUgPSB7XG4gICAgICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgICAgIGRhdGFzZXRzOiB7Y2l0aWVzfVxuICAgIH07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEdyb3VwQnkoJ2NpdGllcycpKTtcbiAgICBjb25zdCBvcCA9IHN0YXRlLmdyb3VwQnlzWzBdO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoXG4gICAgICBzdGF0ZSxcbiAgICAgIFZpc1N0YXRlQWN0aW9ucy5zZXRHcm91cEJ5Q29uZmlnKG9wLmlkLCB7XG4gICAgICAgIGZpZWxkTmFtZTogJ3JlZ2lvbicsXG4gICAgICAgIGFnZ3JlZ2F0aW9uczoge3BvcDogJ3N1bSd9XG4gICAgICB9KVxuICAgICk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1bkdyb3VwQnkob3AuaWQpKTtcbiAgICBzdGF0ZSA9IGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZSk7XG5cbiAgICBjb25zdCBzYXZlZCA9IFNjaGVtYU1hbmFnZXIuc2F2ZSh7XG4gICAgICB2aXNTdGF0ZTogc3RhdGUsXG4gICAgICBtYXBTdGF0ZToge30sXG4gICAgICBtYXBTdHlsZToge30sXG4gICAgICB1aVN0YXRlOiB7fVxuICAgIH0pO1xuICAgIGNvbnN0IGRlcml2ZWQgPSBzYXZlZC5kYXRhc2V0cy5maW5kKGRhdGFzZXQgPT4gZGF0YXNldC5kYXRhLmlkID09PSBvcC5yZXN1bHRJZCk7XG4gICAgY29uc3QgZGVyaXZlZE1ldGEgPSBkZXJpdmVkPy5kYXRhLm1ldGFkYXRhIGFzXG4gICAgICB8IHtkZXJpdmVkRGF0YXNldD86IHt0eXBlPzogc3RyaW5nfSB8IG51bGx9XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBleHBlY3QoZGVyaXZlZE1ldGE/LmRlcml2ZWREYXRhc2V0Py50eXBlKS50b0JlKCdncm91cEJ5Jyk7XG4gICAgZXhwZWN0KHNhdmVkLmNvbmZpZy5jb25maWcudmlzU3RhdGUuZ3JvdXBCeXM/LlswXS5maWVsZE5hbWUpLnRvQmUoJ3JlZ2lvbicpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBR0EsSUFBQUEsVUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsUUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsTUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsUUFBQSxHQUFBQyxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssTUFBQSxHQUFBTCxPQUFBO0FBRUEsSUFBQU0sU0FBQSxHQUFBRixzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQU8saUJBQUEsR0FBQVAsT0FBQTtBQUF1RCxTQUFBUSxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVks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