@visactor/vbi 0.0.0
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.
- package/README.md +0 -0
- package/dist/builder/connector.d.ts +7 -0
- package/dist/builder/index.d.ts +3 -0
- package/dist/builder/sub-builders/chart-type/chart-type-builder.d.ts +39 -0
- package/dist/builder/sub-builders/chart-type/index.d.ts +1 -0
- package/dist/builder/sub-builders/dimensions/dim-builder.d.ts +48 -0
- package/dist/builder/sub-builders/dimensions/dim-node-builder.d.ts +22 -0
- package/dist/builder/sub-builders/dimensions/index.d.ts +2 -0
- package/dist/builder/sub-builders/havingFilters/having-builder.d.ts +55 -0
- package/dist/builder/sub-builders/havingFilters/having-node-builder.d.ts +27 -0
- package/dist/builder/sub-builders/havingFilters/index.d.ts +2 -0
- package/dist/builder/sub-builders/index.d.ts +5 -0
- package/dist/builder/sub-builders/measures/index.d.ts +2 -0
- package/dist/builder/sub-builders/measures/mea-builder.d.ts +52 -0
- package/dist/builder/sub-builders/measures/mea-node-builder.d.ts +32 -0
- package/dist/builder/sub-builders/whereFilters/index.d.ts +1 -0
- package/dist/builder/sub-builders/whereFilters/where-builder.d.ts +55 -0
- package/dist/builder/sub-builders/whereFilters/where-node-builder.d.ts +27 -0
- package/dist/builder/vbi-builder.d.ts +32 -0
- package/dist/builder/vbi.d.ts +16 -0
- package/dist/index.cjs +689 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +628 -0
- package/dist/pipeline/index.d.ts +1 -0
- package/dist/pipeline/vqueryDSL/buildVQuery.d.ts +4 -0
- package/dist/pipeline/vqueryDSL/index.d.ts +1 -0
- package/dist/types/builder/VBIInterface.d.ts +21 -0
- package/dist/types/builder/context.d.ts +4 -0
- package/dist/types/builder/index.d.ts +2 -0
- package/dist/types/builder/observe.d.ts +2 -0
- package/dist/types/connector/connector.d.ts +9 -0
- package/dist/types/connector/index.d.ts +3 -0
- package/dist/types/connector/query.d.ts +15 -0
- package/dist/types/connector/schema.d.ts +8 -0
- package/dist/types/dsl/dimensions/dimensions.d.ts +16 -0
- package/dist/types/dsl/encoding.d.ts +11 -0
- package/dist/types/dsl/havingFilters/having.d.ts +13 -0
- package/dist/types/dsl/index.d.ts +6 -0
- package/dist/types/dsl/locale/locale.d.ts +6 -0
- package/dist/types/dsl/measures/aggregate.d.ts +7 -0
- package/dist/types/dsl/measures/measures.d.ts +30 -0
- package/dist/types/dsl/theme/theme.d.ts +6 -0
- package/dist/types/dsl/vbi/vbi.d.ts +41 -0
- package/dist/types/dsl/whereFilters/filters.d.ts +7 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/tree/index.d.ts +1 -0
- package/dist/utils/tree/traverse.d.ts +1 -0
- package/package.json +55 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,689 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
zVBIHavingFilter: ()=>zVBIHavingFilter,
|
|
28
|
+
zVBIHavingArray: ()=>zVBIHavingArray,
|
|
29
|
+
MeasuresBuilder: ()=>MeasuresBuilder,
|
|
30
|
+
DimensionsBuilder: ()=>DimensionsBuilder,
|
|
31
|
+
VBIBuilder: ()=>VBIBuilder,
|
|
32
|
+
ChartTypeBuilder: ()=>ChartTypeBuilder,
|
|
33
|
+
VBI: ()=>VBI,
|
|
34
|
+
preorderTraverse: ()=>vseed_namespaceObject.preorderTraverse,
|
|
35
|
+
buildVQuery: ()=>buildVQuery,
|
|
36
|
+
findTreeNodesBy: ()=>vseed_namespaceObject.findTreeNodesBy
|
|
37
|
+
});
|
|
38
|
+
const external_yjs_namespaceObject = require("yjs");
|
|
39
|
+
class DimensionNodeBuilder {
|
|
40
|
+
yMap;
|
|
41
|
+
constructor(yMap){
|
|
42
|
+
this.yMap = yMap;
|
|
43
|
+
}
|
|
44
|
+
getField() {
|
|
45
|
+
return this.yMap.get('field');
|
|
46
|
+
}
|
|
47
|
+
setAlias(alias) {
|
|
48
|
+
this.yMap.set('alias', alias);
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
toJson() {
|
|
52
|
+
return this.yMap.toJSON();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
class DimensionsBuilder {
|
|
56
|
+
dsl;
|
|
57
|
+
constructor(_doc, dsl){
|
|
58
|
+
this.dsl = dsl;
|
|
59
|
+
}
|
|
60
|
+
add(field, callback) {
|
|
61
|
+
const dimension = {
|
|
62
|
+
alias: field,
|
|
63
|
+
field
|
|
64
|
+
};
|
|
65
|
+
const yMap = new external_yjs_namespaceObject.Map();
|
|
66
|
+
for (const [key, value] of Object.entries(dimension))yMap.set(key, value);
|
|
67
|
+
this.dsl.get('dimensions').push([
|
|
68
|
+
yMap
|
|
69
|
+
]);
|
|
70
|
+
const node = new DimensionNodeBuilder(yMap);
|
|
71
|
+
callback(node);
|
|
72
|
+
return this;
|
|
73
|
+
}
|
|
74
|
+
remove(field) {
|
|
75
|
+
const dimensions = this.dsl.get('dimensions');
|
|
76
|
+
const index = dimensions.toArray().findIndex((item)=>item.get('field') === field);
|
|
77
|
+
if (-1 !== index) this.dsl.get('dimensions').delete(index, 1);
|
|
78
|
+
return this;
|
|
79
|
+
}
|
|
80
|
+
update(field, callback) {
|
|
81
|
+
const dimensions = this.dsl.get('dimensions');
|
|
82
|
+
const index = dimensions.toArray().findIndex((item)=>item.get('field') === field);
|
|
83
|
+
if (-1 === index) throw new Error(`Dimension with field "${field}" not found`);
|
|
84
|
+
const dimensionYMap = dimensions.get(index);
|
|
85
|
+
const node = new DimensionNodeBuilder(dimensionYMap);
|
|
86
|
+
callback(node);
|
|
87
|
+
return this;
|
|
88
|
+
}
|
|
89
|
+
find(field) {
|
|
90
|
+
const dimensions = this.dsl.get('dimensions');
|
|
91
|
+
const index = dimensions.toArray().findIndex((item)=>item.get('field') === field);
|
|
92
|
+
if (-1 === index) return;
|
|
93
|
+
return new DimensionNodeBuilder(dimensions.get(index));
|
|
94
|
+
}
|
|
95
|
+
findAll() {
|
|
96
|
+
const dimensions = this.dsl.get('dimensions');
|
|
97
|
+
return dimensions.toArray().map((yMap)=>new DimensionNodeBuilder(yMap));
|
|
98
|
+
}
|
|
99
|
+
toJson() {
|
|
100
|
+
return this.dsl.get('dimensions').toJSON();
|
|
101
|
+
}
|
|
102
|
+
observe(callback) {
|
|
103
|
+
this.dsl.get('dimensions').observe(callback);
|
|
104
|
+
return ()=>{
|
|
105
|
+
this.dsl.get('dimensions').unobserve(callback);
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
static isDimensionNode(node) {
|
|
109
|
+
return 'alias' in node && !('children' in node);
|
|
110
|
+
}
|
|
111
|
+
static isDimensionGroup(node) {
|
|
112
|
+
return 'children' in node;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
class MeasureNodeBuilder {
|
|
116
|
+
yMap;
|
|
117
|
+
constructor(yMap){
|
|
118
|
+
this.yMap = yMap;
|
|
119
|
+
}
|
|
120
|
+
getField() {
|
|
121
|
+
return this.yMap.get('field');
|
|
122
|
+
}
|
|
123
|
+
setAlias(alias) {
|
|
124
|
+
this.yMap.set('alias', alias);
|
|
125
|
+
return this;
|
|
126
|
+
}
|
|
127
|
+
setEncoding(encoding) {
|
|
128
|
+
this.yMap.set('encoding', encoding);
|
|
129
|
+
return this;
|
|
130
|
+
}
|
|
131
|
+
setAggregate(aggregate) {
|
|
132
|
+
this.yMap.set('aggregate', aggregate);
|
|
133
|
+
return this;
|
|
134
|
+
}
|
|
135
|
+
toJson() {
|
|
136
|
+
return this.yMap.toJSON();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
class MeasuresBuilder {
|
|
140
|
+
dsl;
|
|
141
|
+
constructor(_doc, dsl){
|
|
142
|
+
this.dsl = dsl;
|
|
143
|
+
}
|
|
144
|
+
add(field, callback) {
|
|
145
|
+
const measure = {
|
|
146
|
+
alias: field,
|
|
147
|
+
field,
|
|
148
|
+
encoding: 'yAxis',
|
|
149
|
+
aggregate: {
|
|
150
|
+
func: 'sum'
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
const yMap = new external_yjs_namespaceObject.Map();
|
|
154
|
+
for (const [key, value] of Object.entries(measure))yMap.set(key, value);
|
|
155
|
+
this.dsl.get('measures').push([
|
|
156
|
+
yMap
|
|
157
|
+
]);
|
|
158
|
+
const node = new MeasureNodeBuilder(yMap);
|
|
159
|
+
callback(node);
|
|
160
|
+
return this;
|
|
161
|
+
}
|
|
162
|
+
remove(field) {
|
|
163
|
+
const measures = this.dsl.get('measures');
|
|
164
|
+
const index = measures.toArray().findIndex((item)=>item.get('field') === field);
|
|
165
|
+
if (-1 !== index) this.dsl.get('measures').delete(index, 1);
|
|
166
|
+
return this;
|
|
167
|
+
}
|
|
168
|
+
update(field, callback) {
|
|
169
|
+
const measures = this.dsl.get('measures');
|
|
170
|
+
const index = measures.toArray().findIndex((item)=>item.get('field') === field);
|
|
171
|
+
if (-1 === index) throw new Error(`Measure with field "${field}" not found`);
|
|
172
|
+
const measureYMap = measures.get(index);
|
|
173
|
+
const node = new MeasureNodeBuilder(measureYMap);
|
|
174
|
+
callback(node);
|
|
175
|
+
return this;
|
|
176
|
+
}
|
|
177
|
+
find(field) {
|
|
178
|
+
const measures = this.dsl.get('measures');
|
|
179
|
+
const index = measures.toArray().findIndex((item)=>item.get('field') === field);
|
|
180
|
+
if (-1 === index) return;
|
|
181
|
+
return new MeasureNodeBuilder(measures.get(index));
|
|
182
|
+
}
|
|
183
|
+
findAll() {
|
|
184
|
+
const measures = this.dsl.get('measures');
|
|
185
|
+
return measures.toArray().map((yMap)=>new MeasureNodeBuilder(yMap));
|
|
186
|
+
}
|
|
187
|
+
toJson() {
|
|
188
|
+
return this.dsl.get('measures').toJSON();
|
|
189
|
+
}
|
|
190
|
+
observe(callback) {
|
|
191
|
+
this.dsl.get('measures').observe(callback);
|
|
192
|
+
return ()=>{
|
|
193
|
+
this.dsl.get('measures').unobserve(callback);
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
static isMeasureNode(node) {
|
|
197
|
+
return 'encoding' in node || 'aggregate' in node;
|
|
198
|
+
}
|
|
199
|
+
static isMeasureGroup(node) {
|
|
200
|
+
return 'children' in node;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
class HavingFiltersNodeBuilder {
|
|
204
|
+
yMap;
|
|
205
|
+
constructor(yMap){
|
|
206
|
+
this.yMap = yMap;
|
|
207
|
+
}
|
|
208
|
+
getField() {
|
|
209
|
+
return this.yMap.get('field');
|
|
210
|
+
}
|
|
211
|
+
setValue(value) {
|
|
212
|
+
this.yMap.set('value', value);
|
|
213
|
+
return this;
|
|
214
|
+
}
|
|
215
|
+
setOperator(operator) {
|
|
216
|
+
this.yMap.set('operator', operator);
|
|
217
|
+
return this;
|
|
218
|
+
}
|
|
219
|
+
toJson() {
|
|
220
|
+
return this.yMap.toJSON();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
class HavingFiltersBuilder {
|
|
224
|
+
dsl;
|
|
225
|
+
constructor(_doc, dsl){
|
|
226
|
+
this.dsl = dsl;
|
|
227
|
+
}
|
|
228
|
+
add(field, callback) {
|
|
229
|
+
if (!field || 'string' != typeof field) throw new Error('Field is required and must be a string');
|
|
230
|
+
const defaultFilter = {
|
|
231
|
+
field,
|
|
232
|
+
operator: 'eq',
|
|
233
|
+
value: null
|
|
234
|
+
};
|
|
235
|
+
const yMap = new external_yjs_namespaceObject.Map();
|
|
236
|
+
for (const [key, value] of Object.entries(defaultFilter))yMap.set(key, value);
|
|
237
|
+
this.dsl.get('havingFilters').push([
|
|
238
|
+
yMap
|
|
239
|
+
]);
|
|
240
|
+
const filterNode = new HavingFiltersNodeBuilder(yMap);
|
|
241
|
+
callback(filterNode);
|
|
242
|
+
return this;
|
|
243
|
+
}
|
|
244
|
+
update(field, callback) {
|
|
245
|
+
const havingFilters = this.dsl.get('havingFilters');
|
|
246
|
+
const index = havingFilters.toArray().findIndex((item)=>item.get('field') === field);
|
|
247
|
+
if (-1 === index) throw new Error(`Having filter with field "${field}" not found`);
|
|
248
|
+
const filterYMap = havingFilters.get(index);
|
|
249
|
+
const node = new HavingFiltersNodeBuilder(filterYMap);
|
|
250
|
+
callback(node);
|
|
251
|
+
return this;
|
|
252
|
+
}
|
|
253
|
+
remove(field) {
|
|
254
|
+
if (!field || 'string' != typeof field) console.error('[HavingFiltersBuilder] Invalid field name:', field);
|
|
255
|
+
const havingFilters = this.dsl.get('havingFilters');
|
|
256
|
+
const index = havingFilters.toArray().findIndex((item)=>item.get('field') === field);
|
|
257
|
+
if (-1 !== index) this.dsl.get('havingFilters').delete(index, 1);
|
|
258
|
+
return this;
|
|
259
|
+
}
|
|
260
|
+
find(field) {
|
|
261
|
+
const havingFilters = this.dsl.get('havingFilters');
|
|
262
|
+
const index = havingFilters.toArray().findIndex((item)=>item.get('field') === field);
|
|
263
|
+
if (-1 === index) return;
|
|
264
|
+
return new HavingFiltersNodeBuilder(havingFilters.get(index));
|
|
265
|
+
}
|
|
266
|
+
findAll() {
|
|
267
|
+
const havingFilters = this.dsl.get('havingFilters');
|
|
268
|
+
return havingFilters.toArray().map((yMap)=>new HavingFiltersNodeBuilder(yMap));
|
|
269
|
+
}
|
|
270
|
+
clear() {
|
|
271
|
+
const havingFilters = this.dsl.get('havingFilters');
|
|
272
|
+
if (havingFilters.length > 0) havingFilters.delete(0, havingFilters.length);
|
|
273
|
+
return this;
|
|
274
|
+
}
|
|
275
|
+
toJson() {
|
|
276
|
+
return this.dsl.get('havingFilters').toJSON();
|
|
277
|
+
}
|
|
278
|
+
observe(callback) {
|
|
279
|
+
this.dsl.get('havingFilters').observe(callback);
|
|
280
|
+
return ()=>{
|
|
281
|
+
this.dsl.get('havingFilters').unobserve(callback);
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
const vseed_namespaceObject = require("@visactor/vseed");
|
|
286
|
+
class ChartTypeBuilder {
|
|
287
|
+
dsl;
|
|
288
|
+
constructor(_doc, dsl){
|
|
289
|
+
this.dsl = dsl;
|
|
290
|
+
}
|
|
291
|
+
observe(callback) {
|
|
292
|
+
const wrapper = (e, trans)=>{
|
|
293
|
+
if (e.keysChanged.has('chartType')) callback(e, trans);
|
|
294
|
+
};
|
|
295
|
+
this.dsl.observe(wrapper);
|
|
296
|
+
return ()=>{
|
|
297
|
+
this.dsl.unobserve(wrapper);
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
changeChartType(chartType) {
|
|
301
|
+
this.dsl.set('chartType', chartType);
|
|
302
|
+
}
|
|
303
|
+
getChartType() {
|
|
304
|
+
return this.dsl.get('chartType') || 'table';
|
|
305
|
+
}
|
|
306
|
+
toJson() {
|
|
307
|
+
return this.dsl.get('chartType') || 'table';
|
|
308
|
+
}
|
|
309
|
+
getAvailableChartTypes() {
|
|
310
|
+
return [
|
|
311
|
+
vseed_namespaceObject.ChartTypeEnum.Table,
|
|
312
|
+
vseed_namespaceObject.ChartTypeEnum.PivotTable,
|
|
313
|
+
vseed_namespaceObject.ChartTypeEnum.Line,
|
|
314
|
+
vseed_namespaceObject.ChartTypeEnum.Column,
|
|
315
|
+
vseed_namespaceObject.ChartTypeEnum.ColumnPercent,
|
|
316
|
+
vseed_namespaceObject.ChartTypeEnum.ColumnParallel,
|
|
317
|
+
vseed_namespaceObject.ChartTypeEnum.BarPercent,
|
|
318
|
+
vseed_namespaceObject.ChartTypeEnum.BarParallel,
|
|
319
|
+
vseed_namespaceObject.ChartTypeEnum.Area,
|
|
320
|
+
vseed_namespaceObject.ChartTypeEnum.AreaPercent,
|
|
321
|
+
vseed_namespaceObject.ChartTypeEnum.DualAxis,
|
|
322
|
+
vseed_namespaceObject.ChartTypeEnum.Scatter,
|
|
323
|
+
vseed_namespaceObject.ChartTypeEnum.Rose,
|
|
324
|
+
vseed_namespaceObject.ChartTypeEnum.RoseParallel,
|
|
325
|
+
vseed_namespaceObject.ChartTypeEnum.Pie,
|
|
326
|
+
vseed_namespaceObject.ChartTypeEnum.Donut,
|
|
327
|
+
vseed_namespaceObject.ChartTypeEnum.Radar,
|
|
328
|
+
vseed_namespaceObject.ChartTypeEnum.Funnel,
|
|
329
|
+
vseed_namespaceObject.ChartTypeEnum.Heatmap,
|
|
330
|
+
vseed_namespaceObject.ChartTypeEnum.Boxplot,
|
|
331
|
+
vseed_namespaceObject.ChartTypeEnum.Histogram
|
|
332
|
+
];
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
class WhereFilterNodeBuilder {
|
|
336
|
+
yMap;
|
|
337
|
+
constructor(yMap){
|
|
338
|
+
this.yMap = yMap;
|
|
339
|
+
}
|
|
340
|
+
getField() {
|
|
341
|
+
return this.yMap.get('field');
|
|
342
|
+
}
|
|
343
|
+
setOperator(operator) {
|
|
344
|
+
this.yMap.set('operator', operator);
|
|
345
|
+
return this;
|
|
346
|
+
}
|
|
347
|
+
setValue(value) {
|
|
348
|
+
this.yMap.set('value', value);
|
|
349
|
+
return this;
|
|
350
|
+
}
|
|
351
|
+
toJson() {
|
|
352
|
+
return this.yMap.toJSON();
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
class WhereFiltersBuilder {
|
|
356
|
+
dsl;
|
|
357
|
+
doc;
|
|
358
|
+
constructor(doc, dsl){
|
|
359
|
+
this.doc = doc;
|
|
360
|
+
this.dsl = dsl;
|
|
361
|
+
if (!this.dsl.get('whereFilters')) this.doc.transact(()=>{
|
|
362
|
+
this.dsl.set('whereFilters', new external_yjs_namespaceObject.Array());
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
add(field, callback) {
|
|
366
|
+
const filter = {
|
|
367
|
+
field
|
|
368
|
+
};
|
|
369
|
+
const yMap = new external_yjs_namespaceObject.Map();
|
|
370
|
+
for (const [key, value] of Object.entries(filter))yMap.set(key, value);
|
|
371
|
+
this.dsl.get('whereFilters').push([
|
|
372
|
+
yMap
|
|
373
|
+
]);
|
|
374
|
+
const node = new WhereFilterNodeBuilder(yMap);
|
|
375
|
+
callback(node);
|
|
376
|
+
return this;
|
|
377
|
+
}
|
|
378
|
+
update(field, callback) {
|
|
379
|
+
const whereFilters = this.dsl.get('whereFilters');
|
|
380
|
+
const index = whereFilters.toArray().findIndex((item)=>item.get('field') === field);
|
|
381
|
+
if (-1 === index) throw new Error(`Where filter with field ${field} not found`);
|
|
382
|
+
const filterYMap = whereFilters.get(index);
|
|
383
|
+
const node = new WhereFilterNodeBuilder(filterYMap);
|
|
384
|
+
callback(node);
|
|
385
|
+
return this;
|
|
386
|
+
}
|
|
387
|
+
remove(field) {
|
|
388
|
+
const whereFilters = this.dsl.get('whereFilters');
|
|
389
|
+
const index = whereFilters.toArray().findIndex((item)=>item.get('field') === field);
|
|
390
|
+
if (-1 === index) return this;
|
|
391
|
+
whereFilters.delete(index, 1);
|
|
392
|
+
return this;
|
|
393
|
+
}
|
|
394
|
+
find(field) {
|
|
395
|
+
const whereFilters = this.dsl.get('whereFilters');
|
|
396
|
+
const index = whereFilters.toArray().findIndex((item)=>item.get('field') === field);
|
|
397
|
+
if (-1 === index) return;
|
|
398
|
+
return new WhereFilterNodeBuilder(whereFilters.get(index));
|
|
399
|
+
}
|
|
400
|
+
findAll() {
|
|
401
|
+
const whereFilters = this.dsl.get('whereFilters');
|
|
402
|
+
return whereFilters.toArray().map((yMap)=>new WhereFilterNodeBuilder(yMap));
|
|
403
|
+
}
|
|
404
|
+
clear() {
|
|
405
|
+
const whereFilters = this.dsl.get('whereFilters');
|
|
406
|
+
whereFilters.delete(0, whereFilters.length);
|
|
407
|
+
return this;
|
|
408
|
+
}
|
|
409
|
+
toJson() {
|
|
410
|
+
return this.dsl.get('whereFilters').toJSON();
|
|
411
|
+
}
|
|
412
|
+
observe(callback) {
|
|
413
|
+
this.dsl.get('whereFilters').observe(callback);
|
|
414
|
+
return ()=>{
|
|
415
|
+
this.dsl.get('whereFilters').unobserve(callback);
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
const external_zod_namespaceObject = require("zod");
|
|
420
|
+
const zVBIHavingFilter = external_zod_namespaceObject.z.object({
|
|
421
|
+
field: external_zod_namespaceObject.z.string(),
|
|
422
|
+
operator: external_zod_namespaceObject.z.string().optional(),
|
|
423
|
+
value: external_zod_namespaceObject.z.any().optional()
|
|
424
|
+
});
|
|
425
|
+
const zVBIHavingArray = external_zod_namespaceObject.z.array(zVBIHavingFilter);
|
|
426
|
+
const external_remeda_namespaceObject = require("remeda");
|
|
427
|
+
const buildVQuery = (vbiDSL, builder)=>{
|
|
428
|
+
const wrapper = (processor)=>(queryDSL)=>processor(queryDSL, {
|
|
429
|
+
vbiDSL,
|
|
430
|
+
builder
|
|
431
|
+
});
|
|
432
|
+
return (0, external_remeda_namespaceObject.pipe)({}, wrapper(buildSelect), wrapper(buildGroupBy), wrapper(buildWhere), wrapper(buildHaving), wrapper(buildOrderBy), wrapper(buildLimit));
|
|
433
|
+
};
|
|
434
|
+
const buildWhere = (queryDSL, context)=>{
|
|
435
|
+
const { vbiDSL } = context;
|
|
436
|
+
const whereFilters = vbiDSL.whereFilters || [];
|
|
437
|
+
if (0 === whereFilters.length) return queryDSL;
|
|
438
|
+
const result = {
|
|
439
|
+
...queryDSL
|
|
440
|
+
};
|
|
441
|
+
result.where = {
|
|
442
|
+
op: 'and',
|
|
443
|
+
conditions: whereFilters.flatMap((filter)=>{
|
|
444
|
+
if ('between' === filter.operator && filter.value && 'object' == typeof filter.value && !Array.isArray(filter.value)) {
|
|
445
|
+
const conditions = [];
|
|
446
|
+
if (void 0 !== filter.value.min && null !== filter.value.min && '' !== filter.value.min) conditions.push({
|
|
447
|
+
field: filter.field,
|
|
448
|
+
op: '<' === filter.value.leftOp ? '>' : '>=',
|
|
449
|
+
value: filter.value.min
|
|
450
|
+
});
|
|
451
|
+
if (void 0 !== filter.value.max && null !== filter.value.max && '' !== filter.value.max) conditions.push({
|
|
452
|
+
field: filter.field,
|
|
453
|
+
op: '<' === filter.value.rightOp ? '<' : '<=',
|
|
454
|
+
value: filter.value.max
|
|
455
|
+
});
|
|
456
|
+
return conditions;
|
|
457
|
+
}
|
|
458
|
+
let mappedOp = filter.operator ?? '=';
|
|
459
|
+
if (Array.isArray(filter.value)) {
|
|
460
|
+
if ('=' === mappedOp) mappedOp = 'in';
|
|
461
|
+
if ('!=' === mappedOp) mappedOp = 'not in';
|
|
462
|
+
}
|
|
463
|
+
return [
|
|
464
|
+
{
|
|
465
|
+
field: filter.field,
|
|
466
|
+
op: mappedOp,
|
|
467
|
+
value: filter.value
|
|
468
|
+
}
|
|
469
|
+
];
|
|
470
|
+
})
|
|
471
|
+
};
|
|
472
|
+
return result;
|
|
473
|
+
};
|
|
474
|
+
const buildOrderBy = (queryDSL, context)=>queryDSL;
|
|
475
|
+
const buildSelect = (queryDSL, context)=>{
|
|
476
|
+
const { vbiDSL } = context;
|
|
477
|
+
const measures = vbiDSL.measures;
|
|
478
|
+
const dimensions = vbiDSL.dimensions;
|
|
479
|
+
const result = {
|
|
480
|
+
...queryDSL
|
|
481
|
+
};
|
|
482
|
+
const measureNodes = measures.filter((measure)=>MeasuresBuilder.isMeasureNode(measure));
|
|
483
|
+
const measureSelects = measureNodes.map((measure)=>({
|
|
484
|
+
field: measure.field,
|
|
485
|
+
alias: measure.alias,
|
|
486
|
+
aggr: measure.aggregate
|
|
487
|
+
}));
|
|
488
|
+
const dimensionNodes = dimensions.filter((dimension)=>DimensionsBuilder.isDimensionNode(dimension));
|
|
489
|
+
const dimensionSelects = dimensionNodes.map((dimension)=>({
|
|
490
|
+
field: dimension.field,
|
|
491
|
+
alias: dimension.alias
|
|
492
|
+
}));
|
|
493
|
+
result.select = measureSelects.concat(dimensionSelects);
|
|
494
|
+
return result;
|
|
495
|
+
};
|
|
496
|
+
const buildGroupBy = (queryDSL, context)=>{
|
|
497
|
+
const result = {
|
|
498
|
+
...queryDSL
|
|
499
|
+
};
|
|
500
|
+
const { vbiDSL } = context;
|
|
501
|
+
const dimensions = vbiDSL.dimensions;
|
|
502
|
+
const dimensionNodes = dimensions.filter((dimension)=>DimensionsBuilder.isDimensionNode(dimension));
|
|
503
|
+
result.groupBy = dimensionNodes.map((dimension)=>dimension.field);
|
|
504
|
+
return result;
|
|
505
|
+
};
|
|
506
|
+
const buildLimit = (queryDSL, context)=>{
|
|
507
|
+
const result = {
|
|
508
|
+
...queryDSL
|
|
509
|
+
};
|
|
510
|
+
const limit = context.vbiDSL.limit ?? 1000;
|
|
511
|
+
result.limit = limit;
|
|
512
|
+
return result;
|
|
513
|
+
};
|
|
514
|
+
const buildHaving = (queryDSL, context)=>{
|
|
515
|
+
const { vbiDSL } = context;
|
|
516
|
+
const havingFilters = vbiDSL.havingFilters || [];
|
|
517
|
+
if (0 === havingFilters.length) return queryDSL;
|
|
518
|
+
const result = {
|
|
519
|
+
...queryDSL
|
|
520
|
+
};
|
|
521
|
+
result.having = {
|
|
522
|
+
op: 'and',
|
|
523
|
+
conditions: havingFilters.map((filter)=>{
|
|
524
|
+
const mappedOp = filter.operator ?? '=';
|
|
525
|
+
return {
|
|
526
|
+
field: filter.field,
|
|
527
|
+
op: mappedOp,
|
|
528
|
+
value: filter.value
|
|
529
|
+
};
|
|
530
|
+
})
|
|
531
|
+
};
|
|
532
|
+
return result;
|
|
533
|
+
};
|
|
534
|
+
const connectorMap = new Map();
|
|
535
|
+
const registerConnector = (id, connector)=>{
|
|
536
|
+
connectorMap.set(id, connector);
|
|
537
|
+
};
|
|
538
|
+
const getConnector = async (id)=>{
|
|
539
|
+
const connector = connectorMap.get(id);
|
|
540
|
+
if (!connector) throw new Error(`connector ${id} not registered`);
|
|
541
|
+
if ('function' == typeof connector) return connector();
|
|
542
|
+
return connector;
|
|
543
|
+
};
|
|
544
|
+
class VBIBuilder {
|
|
545
|
+
doc;
|
|
546
|
+
dsl;
|
|
547
|
+
undoManager;
|
|
548
|
+
chartType;
|
|
549
|
+
measures;
|
|
550
|
+
dimensions;
|
|
551
|
+
havingFilters;
|
|
552
|
+
whereFilters;
|
|
553
|
+
constructor(doc){
|
|
554
|
+
this.doc = doc;
|
|
555
|
+
this.dsl = doc.getMap('dsl');
|
|
556
|
+
this.undoManager = new external_yjs_namespaceObject.UndoManager(this.dsl);
|
|
557
|
+
this.chartType = new ChartTypeBuilder(doc, this.dsl);
|
|
558
|
+
this.measures = new MeasuresBuilder(doc, this.dsl);
|
|
559
|
+
this.dimensions = new DimensionsBuilder(doc, this.dsl);
|
|
560
|
+
this.havingFilters = new HavingFiltersBuilder(doc, this.dsl);
|
|
561
|
+
this.whereFilters = new WhereFiltersBuilder(doc, this.dsl);
|
|
562
|
+
}
|
|
563
|
+
applyUpdate(update) {
|
|
564
|
+
external_yjs_namespaceObject.applyUpdate(this.doc, update);
|
|
565
|
+
}
|
|
566
|
+
encodeStateAsUpdate(targetStateVector) {
|
|
567
|
+
return external_yjs_namespaceObject.encodeStateAsUpdate(this.doc, targetStateVector);
|
|
568
|
+
}
|
|
569
|
+
buildVSeed = async ()=>{
|
|
570
|
+
const vbiDSL = this.build();
|
|
571
|
+
const connectorId = vbiDSL.connectorId;
|
|
572
|
+
const connector = await getConnector(vbiDSL.connectorId);
|
|
573
|
+
const queryDSL = this.buildVQuery();
|
|
574
|
+
const schema = await connector.discoverSchema();
|
|
575
|
+
const queryResult = await connector.query({
|
|
576
|
+
queryDSL,
|
|
577
|
+
schema,
|
|
578
|
+
connectorId
|
|
579
|
+
});
|
|
580
|
+
return {
|
|
581
|
+
chartType: vbiDSL.chartType,
|
|
582
|
+
dataset: queryResult.dataset,
|
|
583
|
+
theme: vbiDSL.theme,
|
|
584
|
+
locale: vbiDSL.locale
|
|
585
|
+
};
|
|
586
|
+
};
|
|
587
|
+
buildVQuery = ()=>{
|
|
588
|
+
const vbiDSL = this.build();
|
|
589
|
+
return buildVQuery(vbiDSL, this);
|
|
590
|
+
};
|
|
591
|
+
build = ()=>this.dsl.toJSON();
|
|
592
|
+
getSchema = async ()=>{
|
|
593
|
+
const connectorId = this.dsl.get('connectorId');
|
|
594
|
+
const con = await getConnector(connectorId);
|
|
595
|
+
const result = await con.discoverSchema();
|
|
596
|
+
return result;
|
|
597
|
+
};
|
|
598
|
+
setLimit(limit) {
|
|
599
|
+
this.dsl.set('limit', limit);
|
|
600
|
+
return this;
|
|
601
|
+
}
|
|
602
|
+
setLocale(locale) {
|
|
603
|
+
this.dsl.set('locale', locale);
|
|
604
|
+
return this;
|
|
605
|
+
}
|
|
606
|
+
setTheme(theme) {
|
|
607
|
+
this.dsl.set('theme', theme);
|
|
608
|
+
return this;
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
const createVBI = ()=>({
|
|
612
|
+
connectorMap: connectorMap,
|
|
613
|
+
registerConnector: registerConnector,
|
|
614
|
+
getConnector: getConnector,
|
|
615
|
+
generateEmptyDSL: (connectorId)=>({
|
|
616
|
+
connectorId: connectorId,
|
|
617
|
+
chartType: 'table',
|
|
618
|
+
measures: [],
|
|
619
|
+
dimensions: [],
|
|
620
|
+
whereFilters: [],
|
|
621
|
+
havingFilters: [],
|
|
622
|
+
theme: 'light',
|
|
623
|
+
locale: 'zh-CN',
|
|
624
|
+
version: 0
|
|
625
|
+
}),
|
|
626
|
+
from: (vbi)=>{
|
|
627
|
+
const doc = new external_yjs_namespaceObject.Doc();
|
|
628
|
+
const dsl = doc.getMap('dsl');
|
|
629
|
+
doc.transact(()=>{
|
|
630
|
+
if (vbi.connectorId) dsl.set('connectorId', vbi.connectorId);
|
|
631
|
+
if (vbi.chartType) dsl.set('chartType', vbi.chartType);
|
|
632
|
+
if (vbi.theme) dsl.set('theme', vbi.theme);
|
|
633
|
+
if (vbi.limit) dsl.set('limit', vbi.limit);
|
|
634
|
+
if (vbi.locale) dsl.set('locale', vbi.locale);
|
|
635
|
+
if (vbi.version) dsl.set('version', vbi.version);
|
|
636
|
+
const ensureYArray = (arr)=>{
|
|
637
|
+
if (!arr) return new external_yjs_namespaceObject.Array();
|
|
638
|
+
if (arr instanceof external_yjs_namespaceObject.Array) return arr;
|
|
639
|
+
const yArr = new external_yjs_namespaceObject.Array();
|
|
640
|
+
arr.forEach((item)=>{
|
|
641
|
+
if (item instanceof external_yjs_namespaceObject.Map) yArr.push([
|
|
642
|
+
item
|
|
643
|
+
]);
|
|
644
|
+
else if ('object' == typeof item && null !== item) {
|
|
645
|
+
const yMap = new external_yjs_namespaceObject.Map();
|
|
646
|
+
for (const [key, value] of Object.entries(item))yMap.set(key, value);
|
|
647
|
+
yArr.push([
|
|
648
|
+
yMap
|
|
649
|
+
]);
|
|
650
|
+
} else yArr.push([
|
|
651
|
+
item
|
|
652
|
+
]);
|
|
653
|
+
});
|
|
654
|
+
return yArr;
|
|
655
|
+
};
|
|
656
|
+
dsl.set('whereFilters', ensureYArray(vbi.whereFilters));
|
|
657
|
+
dsl.set('havingFilters', ensureYArray(vbi.havingFilters));
|
|
658
|
+
dsl.set('measures', ensureYArray(vbi.measures));
|
|
659
|
+
dsl.set('dimensions', ensureYArray(vbi.dimensions));
|
|
660
|
+
});
|
|
661
|
+
return new VBIBuilder(doc);
|
|
662
|
+
}
|
|
663
|
+
});
|
|
664
|
+
const VBI = createVBI();
|
|
665
|
+
exports.ChartTypeBuilder = __webpack_exports__.ChartTypeBuilder;
|
|
666
|
+
exports.DimensionsBuilder = __webpack_exports__.DimensionsBuilder;
|
|
667
|
+
exports.MeasuresBuilder = __webpack_exports__.MeasuresBuilder;
|
|
668
|
+
exports.VBI = __webpack_exports__.VBI;
|
|
669
|
+
exports.VBIBuilder = __webpack_exports__.VBIBuilder;
|
|
670
|
+
exports.buildVQuery = __webpack_exports__.buildVQuery;
|
|
671
|
+
exports.findTreeNodesBy = __webpack_exports__.findTreeNodesBy;
|
|
672
|
+
exports.preorderTraverse = __webpack_exports__.preorderTraverse;
|
|
673
|
+
exports.zVBIHavingArray = __webpack_exports__.zVBIHavingArray;
|
|
674
|
+
exports.zVBIHavingFilter = __webpack_exports__.zVBIHavingFilter;
|
|
675
|
+
for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
676
|
+
"ChartTypeBuilder",
|
|
677
|
+
"DimensionsBuilder",
|
|
678
|
+
"MeasuresBuilder",
|
|
679
|
+
"VBI",
|
|
680
|
+
"VBIBuilder",
|
|
681
|
+
"buildVQuery",
|
|
682
|
+
"findTreeNodesBy",
|
|
683
|
+
"preorderTraverse",
|
|
684
|
+
"zVBIHavingArray",
|
|
685
|
+
"zVBIHavingFilter"
|
|
686
|
+
].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
|
|
687
|
+
Object.defineProperty(exports, '__esModule', {
|
|
688
|
+
value: true
|
|
689
|
+
});
|