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