@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.
Files changed (49) hide show
  1. package/README.md +0 -0
  2. package/dist/builder/connector.d.ts +7 -0
  3. package/dist/builder/index.d.ts +3 -0
  4. package/dist/builder/sub-builders/chart-type/chart-type-builder.d.ts +39 -0
  5. package/dist/builder/sub-builders/chart-type/index.d.ts +1 -0
  6. package/dist/builder/sub-builders/dimensions/dim-builder.d.ts +48 -0
  7. package/dist/builder/sub-builders/dimensions/dim-node-builder.d.ts +22 -0
  8. package/dist/builder/sub-builders/dimensions/index.d.ts +2 -0
  9. package/dist/builder/sub-builders/havingFilters/having-builder.d.ts +55 -0
  10. package/dist/builder/sub-builders/havingFilters/having-node-builder.d.ts +27 -0
  11. package/dist/builder/sub-builders/havingFilters/index.d.ts +2 -0
  12. package/dist/builder/sub-builders/index.d.ts +5 -0
  13. package/dist/builder/sub-builders/measures/index.d.ts +2 -0
  14. package/dist/builder/sub-builders/measures/mea-builder.d.ts +52 -0
  15. package/dist/builder/sub-builders/measures/mea-node-builder.d.ts +32 -0
  16. package/dist/builder/sub-builders/whereFilters/index.d.ts +1 -0
  17. package/dist/builder/sub-builders/whereFilters/where-builder.d.ts +55 -0
  18. package/dist/builder/sub-builders/whereFilters/where-node-builder.d.ts +27 -0
  19. package/dist/builder/vbi-builder.d.ts +32 -0
  20. package/dist/builder/vbi.d.ts +16 -0
  21. package/dist/index.cjs +689 -0
  22. package/dist/index.d.ts +5 -0
  23. package/dist/index.js +628 -0
  24. package/dist/pipeline/index.d.ts +1 -0
  25. package/dist/pipeline/vqueryDSL/buildVQuery.d.ts +4 -0
  26. package/dist/pipeline/vqueryDSL/index.d.ts +1 -0
  27. package/dist/types/builder/VBIInterface.d.ts +21 -0
  28. package/dist/types/builder/context.d.ts +4 -0
  29. package/dist/types/builder/index.d.ts +2 -0
  30. package/dist/types/builder/observe.d.ts +2 -0
  31. package/dist/types/connector/connector.d.ts +9 -0
  32. package/dist/types/connector/index.d.ts +3 -0
  33. package/dist/types/connector/query.d.ts +15 -0
  34. package/dist/types/connector/schema.d.ts +8 -0
  35. package/dist/types/dsl/dimensions/dimensions.d.ts +16 -0
  36. package/dist/types/dsl/encoding.d.ts +11 -0
  37. package/dist/types/dsl/havingFilters/having.d.ts +13 -0
  38. package/dist/types/dsl/index.d.ts +6 -0
  39. package/dist/types/dsl/locale/locale.d.ts +6 -0
  40. package/dist/types/dsl/measures/aggregate.d.ts +7 -0
  41. package/dist/types/dsl/measures/measures.d.ts +30 -0
  42. package/dist/types/dsl/theme/theme.d.ts +6 -0
  43. package/dist/types/dsl/vbi/vbi.d.ts +41 -0
  44. package/dist/types/dsl/whereFilters/filters.d.ts +7 -0
  45. package/dist/types/index.d.ts +4 -0
  46. package/dist/utils/index.d.ts +1 -0
  47. package/dist/utils/tree/index.d.ts +1 -0
  48. package/dist/utils/tree/traverse.d.ts +1 -0
  49. 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
+ });
@@ -0,0 +1,5 @@
1
+ export { VBIBuilder, VBI } from './builder';
2
+ export { MeasuresBuilder, DimensionsBuilder, ChartTypeBuilder } from './builder';
3
+ export * from './types';
4
+ export * from './utils';
5
+ export * from './pipeline';