drizzle-cube 0.1.3 → 0.1.4

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 (39) hide show
  1. package/README.md +24 -2
  2. package/dist/adapters/hono/index.d.ts +5 -1
  3. package/dist/adapters/hono/index.js +187 -93
  4. package/dist/client/client/CubeClient.d.ts +14 -0
  5. package/dist/client/components/AnalyticsDashboard.d.ts +2 -0
  6. package/dist/client/components/AnalyticsPage.d.ts +1 -0
  7. package/dist/client/components/AnalyticsPortlet.d.ts +6 -0
  8. package/dist/client/components/ChartConfigEditor.d.ts +8 -0
  9. package/dist/client/components/ChartErrorBoundary.d.ts +21 -0
  10. package/dist/client/components/DashboardEditModal.d.ts +14 -0
  11. package/dist/client/components/DashboardGrid.d.ts +11 -0
  12. package/dist/client/components/Modal.d.ts +15 -0
  13. package/dist/client/components/PortletContainer.d.ts +10 -0
  14. package/dist/client/components/PortletEditModal.d.ts +12 -0
  15. package/dist/client/components/charts/AreaChart.d.ts +2 -0
  16. package/dist/client/components/charts/BarChart.d.ts +2 -0
  17. package/dist/client/components/charts/ChartContainer.d.ts +7 -0
  18. package/dist/client/components/charts/ChartLegend.d.ts +7 -0
  19. package/dist/client/components/charts/ChartTooltip.d.ts +7 -0
  20. package/dist/client/components/charts/DataTable.d.ts +2 -0
  21. package/dist/client/components/charts/LineChart.d.ts +2 -0
  22. package/dist/client/components/charts/PieChart.d.ts +2 -0
  23. package/dist/client/components/charts/RadarChart.d.ts +2 -0
  24. package/dist/client/components/charts/RadialBarChart.d.ts +2 -0
  25. package/dist/client/components/charts/ScatterChart.d.ts +2 -0
  26. package/dist/client/components/charts/TreeMapChart.d.ts +2 -0
  27. package/dist/client/components/charts/index.d.ts +13 -0
  28. package/dist/client/hooks/useCubeQuery.d.ts +8 -0
  29. package/dist/client/index.d.ts +14 -0
  30. package/dist/client/index.js +23813 -4
  31. package/dist/client/providers/CubeProvider.d.ts +15 -0
  32. package/dist/client/styles.css +1 -0
  33. package/dist/client/types.d.ts +111 -0
  34. package/dist/client/utils/chartConstants.d.ts +15 -0
  35. package/dist/client/utils/chartUtils.d.ts +9 -0
  36. package/dist/client/utils/index.d.ts +87 -0
  37. package/dist/server/index.d.ts +74 -1155
  38. package/dist/server/index.js +1036 -2842
  39. package/package.json +10 -3
@@ -1,9 +1,4 @@
1
1
  import { AnyColumn } from 'drizzle-orm';
2
- import { Many } from 'drizzle-orm';
3
- import { One } from 'drizzle-orm';
4
- import { PgColumn } from 'drizzle-orm/pg-core';
5
- import { PgTableWithColumns } from 'drizzle-orm/pg-core';
6
- import { Relations } from 'drizzle-orm';
7
2
  import { SQL } from 'drizzle-orm';
8
3
 
9
4
  /**
@@ -13,7 +8,7 @@ export declare abstract class BaseDatabaseExecutor<TSchema extends Record<string
13
8
  db: DrizzleDatabase<TSchema>;
14
9
  schema?: TSchema | undefined;
15
10
  constructor(db: DrizzleDatabase<TSchema>, schema?: TSchema | undefined);
16
- abstract execute<T = any[]>(query: SQL | any): Promise<T>;
11
+ abstract execute<T = any[]>(query: SQL | any, measureFields?: string[]): Promise<T>;
17
12
  abstract getEngineType(): 'postgres' | 'mysql' | 'sqlite';
18
13
  }
19
14
 
@@ -106,6 +101,8 @@ export declare interface Cube<TSchema extends Record<string, any> = Record<strin
106
101
  dimensions: Record<string, Dimension<TSchema>>;
107
102
  /** Cube measures using direct column references */
108
103
  measures: Record<string, Measure<TSchema>>;
104
+ /** Optional joins to other cubes for multi-cube queries */
105
+ joins?: Record<string, CubeJoin<TSchema>>;
109
106
  }
110
107
 
111
108
  /**
@@ -150,14 +147,6 @@ export declare interface CubeMetadata {
150
147
  segments: any[];
151
148
  }
152
149
 
153
- /**
154
- * Enhanced Cube with join definitions for multi-cube support
155
- */
156
- export declare interface CubeWithJoins<TSchema extends Record<string, any> = Record<string, any>> extends Cube<TSchema> {
157
- /** Joins to other cubes for multi-cube queries */
158
- joins?: Record<string, CubeJoin<TSchema>>;
159
- }
160
-
161
150
  /**
162
151
  * Database executor that wraps Drizzle ORM
163
152
  * Provides type-safe SQL execution with engine-specific implementations
@@ -168,7 +157,7 @@ export declare interface DatabaseExecutor<TSchema extends Record<string, any> =
168
157
  /** Optional schema for type inference */
169
158
  schema?: TSchema;
170
159
  /** Execute a Drizzle SQL query or query object */
171
- execute<T = any[]>(query: SQL | any): Promise<T>;
160
+ execute<T = any[]>(query: SQL | any, measureFields?: string[]): Promise<T>;
172
161
  /** Get the database engine type */
173
162
  getEngineType(): 'postgres' | 'mysql' | 'sqlite';
174
163
  }
@@ -194,121 +183,6 @@ export declare function defineLegacyCube<TSchema extends Record<string, any>>(_s
194
183
  name: string;
195
184
  }): SemanticCube<TSchema>;
196
185
 
197
- export declare const departments: PgTableWithColumns< {
198
- name: "departments";
199
- schema: undefined;
200
- columns: {
201
- id: PgColumn< {
202
- name: "id";
203
- tableName: "departments";
204
- dataType: "number";
205
- columnType: "PgInteger";
206
- data: number;
207
- driverParam: string | number;
208
- notNull: true;
209
- hasDefault: false;
210
- isPrimaryKey: true;
211
- isAutoincrement: false;
212
- hasRuntimeDefault: false;
213
- enumValues: undefined;
214
- baseColumn: never;
215
- identity: undefined;
216
- generated: undefined;
217
- }, {}, {}>;
218
- name: PgColumn< {
219
- name: "name";
220
- tableName: "departments";
221
- dataType: "string";
222
- columnType: "PgText";
223
- data: string;
224
- driverParam: string;
225
- notNull: true;
226
- hasDefault: false;
227
- isPrimaryKey: false;
228
- isAutoincrement: false;
229
- hasRuntimeDefault: false;
230
- enumValues: [string, ...string[]];
231
- baseColumn: never;
232
- identity: undefined;
233
- generated: undefined;
234
- }, {}, {}>;
235
- description: PgColumn< {
236
- name: "description";
237
- tableName: "departments";
238
- dataType: "string";
239
- columnType: "PgText";
240
- data: string;
241
- driverParam: string;
242
- notNull: false;
243
- hasDefault: false;
244
- isPrimaryKey: false;
245
- isAutoincrement: false;
246
- hasRuntimeDefault: false;
247
- enumValues: [string, ...string[]];
248
- baseColumn: never;
249
- identity: undefined;
250
- generated: undefined;
251
- }, {}, {}>;
252
- organisation: PgColumn< {
253
- name: "organisation";
254
- tableName: "departments";
255
- dataType: "number";
256
- columnType: "PgInteger";
257
- data: number;
258
- driverParam: string | number;
259
- notNull: true;
260
- hasDefault: false;
261
- isPrimaryKey: false;
262
- isAutoincrement: false;
263
- hasRuntimeDefault: false;
264
- enumValues: undefined;
265
- baseColumn: never;
266
- identity: undefined;
267
- generated: undefined;
268
- }, {}, {}>;
269
- createdAt: PgColumn< {
270
- name: "created_at";
271
- tableName: "departments";
272
- dataType: "date";
273
- columnType: "PgTimestamp";
274
- data: Date;
275
- driverParam: string;
276
- notNull: false;
277
- hasDefault: true;
278
- isPrimaryKey: false;
279
- isAutoincrement: false;
280
- hasRuntimeDefault: false;
281
- enumValues: undefined;
282
- baseColumn: never;
283
- identity: undefined;
284
- generated: undefined;
285
- }, {}, {}>;
286
- updatedAt: PgColumn< {
287
- name: "updated_at";
288
- tableName: "departments";
289
- dataType: "date";
290
- columnType: "PgTimestamp";
291
- data: Date;
292
- driverParam: string;
293
- notNull: false;
294
- hasDefault: true;
295
- isPrimaryKey: false;
296
- isAutoincrement: false;
297
- hasRuntimeDefault: false;
298
- enumValues: undefined;
299
- baseColumn: never;
300
- identity: undefined;
301
- generated: undefined;
302
- }, {}, {}>;
303
- };
304
- dialect: "pg";
305
- }>;
306
-
307
- export declare const departmentsRelations: Relations<"departments", {
308
- organisation: One<"organisations", true>;
309
- employees: Many<"employees">;
310
- }>;
311
-
312
186
  /**
313
187
  * Dimension definition
314
188
  */
@@ -374,785 +248,6 @@ export declare type DrizzleDatabase<TSchema extends Record<string, any> = Record
374
248
  schema?: TSchema;
375
249
  };
376
250
 
377
- export declare const employees: PgTableWithColumns< {
378
- name: "employees";
379
- schema: undefined;
380
- columns: {
381
- id: PgColumn< {
382
- name: "id";
383
- tableName: "employees";
384
- dataType: "number";
385
- columnType: "PgInteger";
386
- data: number;
387
- driverParam: string | number;
388
- notNull: true;
389
- hasDefault: false;
390
- isPrimaryKey: true;
391
- isAutoincrement: false;
392
- hasRuntimeDefault: false;
393
- enumValues: undefined;
394
- baseColumn: never;
395
- identity: undefined;
396
- generated: undefined;
397
- }, {}, {}>;
398
- name: PgColumn< {
399
- name: "name";
400
- tableName: "employees";
401
- dataType: "string";
402
- columnType: "PgText";
403
- data: string;
404
- driverParam: string;
405
- notNull: true;
406
- hasDefault: false;
407
- isPrimaryKey: false;
408
- isAutoincrement: false;
409
- hasRuntimeDefault: false;
410
- enumValues: [string, ...string[]];
411
- baseColumn: never;
412
- identity: undefined;
413
- generated: undefined;
414
- }, {}, {}>;
415
- email: PgColumn< {
416
- name: "email";
417
- tableName: "employees";
418
- dataType: "string";
419
- columnType: "PgText";
420
- data: string;
421
- driverParam: string;
422
- notNull: true;
423
- hasDefault: false;
424
- isPrimaryKey: false;
425
- isAutoincrement: false;
426
- hasRuntimeDefault: false;
427
- enumValues: [string, ...string[]];
428
- baseColumn: never;
429
- identity: undefined;
430
- generated: undefined;
431
- }, {}, {}>;
432
- active: PgColumn< {
433
- name: "active";
434
- tableName: "employees";
435
- dataType: "boolean";
436
- columnType: "PgBoolean";
437
- data: boolean;
438
- driverParam: boolean;
439
- notNull: false;
440
- hasDefault: true;
441
- isPrimaryKey: false;
442
- isAutoincrement: false;
443
- hasRuntimeDefault: false;
444
- enumValues: undefined;
445
- baseColumn: never;
446
- identity: undefined;
447
- generated: undefined;
448
- }, {}, {}>;
449
- fteBasis: PgColumn< {
450
- name: "fte_basis";
451
- tableName: "employees";
452
- dataType: "string";
453
- columnType: "PgNumeric";
454
- data: string;
455
- driverParam: string;
456
- notNull: false;
457
- hasDefault: true;
458
- isPrimaryKey: false;
459
- isAutoincrement: false;
460
- hasRuntimeDefault: false;
461
- enumValues: undefined;
462
- baseColumn: never;
463
- identity: undefined;
464
- generated: undefined;
465
- }, {}, {}>;
466
- startDate: PgColumn< {
467
- name: "start_date";
468
- tableName: "employees";
469
- dataType: "date";
470
- columnType: "PgTimestamp";
471
- data: Date;
472
- driverParam: string;
473
- notNull: false;
474
- hasDefault: false;
475
- isPrimaryKey: false;
476
- isAutoincrement: false;
477
- hasRuntimeDefault: false;
478
- enumValues: undefined;
479
- baseColumn: never;
480
- identity: undefined;
481
- generated: undefined;
482
- }, {}, {}>;
483
- endDate: PgColumn< {
484
- name: "end_date";
485
- tableName: "employees";
486
- dataType: "date";
487
- columnType: "PgTimestamp";
488
- data: Date;
489
- driverParam: string;
490
- notNull: false;
491
- hasDefault: false;
492
- isPrimaryKey: false;
493
- isAutoincrement: false;
494
- hasRuntimeDefault: false;
495
- enumValues: undefined;
496
- baseColumn: never;
497
- identity: undefined;
498
- generated: undefined;
499
- }, {}, {}>;
500
- department: PgColumn< {
501
- name: "department";
502
- tableName: "employees";
503
- dataType: "number";
504
- columnType: "PgInteger";
505
- data: number;
506
- driverParam: string | number;
507
- notNull: false;
508
- hasDefault: false;
509
- isPrimaryKey: false;
510
- isAutoincrement: false;
511
- hasRuntimeDefault: false;
512
- enumValues: undefined;
513
- baseColumn: never;
514
- identity: undefined;
515
- generated: undefined;
516
- }, {}, {}>;
517
- supplier: PgColumn< {
518
- name: "supplier";
519
- tableName: "employees";
520
- dataType: "number";
521
- columnType: "PgInteger";
522
- data: number;
523
- driverParam: string | number;
524
- notNull: false;
525
- hasDefault: false;
526
- isPrimaryKey: false;
527
- isAutoincrement: false;
528
- hasRuntimeDefault: false;
529
- enumValues: undefined;
530
- baseColumn: never;
531
- identity: undefined;
532
- generated: undefined;
533
- }, {}, {}>;
534
- organisation: PgColumn< {
535
- name: "organisation";
536
- tableName: "employees";
537
- dataType: "number";
538
- columnType: "PgInteger";
539
- data: number;
540
- driverParam: string | number;
541
- notNull: true;
542
- hasDefault: false;
543
- isPrimaryKey: false;
544
- isAutoincrement: false;
545
- hasRuntimeDefault: false;
546
- enumValues: undefined;
547
- baseColumn: never;
548
- identity: undefined;
549
- generated: undefined;
550
- }, {}, {}>;
551
- createdAt: PgColumn< {
552
- name: "created_at";
553
- tableName: "employees";
554
- dataType: "date";
555
- columnType: "PgTimestamp";
556
- data: Date;
557
- driverParam: string;
558
- notNull: false;
559
- hasDefault: true;
560
- isPrimaryKey: false;
561
- isAutoincrement: false;
562
- hasRuntimeDefault: false;
563
- enumValues: undefined;
564
- baseColumn: never;
565
- identity: undefined;
566
- generated: undefined;
567
- }, {}, {}>;
568
- updatedAt: PgColumn< {
569
- name: "updated_at";
570
- tableName: "employees";
571
- dataType: "date";
572
- columnType: "PgTimestamp";
573
- data: Date;
574
- driverParam: string;
575
- notNull: false;
576
- hasDefault: true;
577
- isPrimaryKey: false;
578
- isAutoincrement: false;
579
- hasRuntimeDefault: false;
580
- enumValues: undefined;
581
- baseColumn: never;
582
- identity: undefined;
583
- generated: undefined;
584
- }, {}, {}>;
585
- };
586
- dialect: "pg";
587
- }>;
588
-
589
- export declare const employeesRelations: Relations<"employees", {
590
- organisation: One<"organisations", true>;
591
- department: One<"departments", false>;
592
- supplier: One<"suppliers", false>;
593
- }>;
594
-
595
- export declare type ExampleSchema = typeof exampleSchema;
596
-
597
- export declare const exampleSchema: {
598
- organisations: PgTableWithColumns< {
599
- name: "organisations";
600
- schema: undefined;
601
- columns: {
602
- id: PgColumn< {
603
- name: "id";
604
- tableName: "organisations";
605
- dataType: "number";
606
- columnType: "PgInteger";
607
- data: number;
608
- driverParam: string | number;
609
- notNull: true;
610
- hasDefault: false;
611
- isPrimaryKey: true;
612
- isAutoincrement: false;
613
- hasRuntimeDefault: false;
614
- enumValues: undefined;
615
- baseColumn: never;
616
- identity: undefined;
617
- generated: undefined;
618
- }, {}, {}>;
619
- name: PgColumn< {
620
- name: "name";
621
- tableName: "organisations";
622
- dataType: "string";
623
- columnType: "PgText";
624
- data: string;
625
- driverParam: string;
626
- notNull: true;
627
- hasDefault: false;
628
- isPrimaryKey: false;
629
- isAutoincrement: false;
630
- hasRuntimeDefault: false;
631
- enumValues: [string, ...string[]];
632
- baseColumn: never;
633
- identity: undefined;
634
- generated: undefined;
635
- }, {}, {}>;
636
- description: PgColumn< {
637
- name: "description";
638
- tableName: "organisations";
639
- dataType: "string";
640
- columnType: "PgText";
641
- data: string;
642
- driverParam: string;
643
- notNull: false;
644
- hasDefault: false;
645
- isPrimaryKey: false;
646
- isAutoincrement: false;
647
- hasRuntimeDefault: false;
648
- enumValues: [string, ...string[]];
649
- baseColumn: never;
650
- identity: undefined;
651
- generated: undefined;
652
- }, {}, {}>;
653
- createdAt: PgColumn< {
654
- name: "created_at";
655
- tableName: "organisations";
656
- dataType: "date";
657
- columnType: "PgTimestamp";
658
- data: Date;
659
- driverParam: string;
660
- notNull: false;
661
- hasDefault: true;
662
- isPrimaryKey: false;
663
- isAutoincrement: false;
664
- hasRuntimeDefault: false;
665
- enumValues: undefined;
666
- baseColumn: never;
667
- identity: undefined;
668
- generated: undefined;
669
- }, {}, {}>;
670
- updatedAt: PgColumn< {
671
- name: "updated_at";
672
- tableName: "organisations";
673
- dataType: "date";
674
- columnType: "PgTimestamp";
675
- data: Date;
676
- driverParam: string;
677
- notNull: false;
678
- hasDefault: true;
679
- isPrimaryKey: false;
680
- isAutoincrement: false;
681
- hasRuntimeDefault: false;
682
- enumValues: undefined;
683
- baseColumn: never;
684
- identity: undefined;
685
- generated: undefined;
686
- }, {}, {}>;
687
- };
688
- dialect: "pg";
689
- }>;
690
- departments: PgTableWithColumns< {
691
- name: "departments";
692
- schema: undefined;
693
- columns: {
694
- id: PgColumn< {
695
- name: "id";
696
- tableName: "departments";
697
- dataType: "number";
698
- columnType: "PgInteger";
699
- data: number;
700
- driverParam: string | number;
701
- notNull: true;
702
- hasDefault: false;
703
- isPrimaryKey: true;
704
- isAutoincrement: false;
705
- hasRuntimeDefault: false;
706
- enumValues: undefined;
707
- baseColumn: never;
708
- identity: undefined;
709
- generated: undefined;
710
- }, {}, {}>;
711
- name: PgColumn< {
712
- name: "name";
713
- tableName: "departments";
714
- dataType: "string";
715
- columnType: "PgText";
716
- data: string;
717
- driverParam: string;
718
- notNull: true;
719
- hasDefault: false;
720
- isPrimaryKey: false;
721
- isAutoincrement: false;
722
- hasRuntimeDefault: false;
723
- enumValues: [string, ...string[]];
724
- baseColumn: never;
725
- identity: undefined;
726
- generated: undefined;
727
- }, {}, {}>;
728
- description: PgColumn< {
729
- name: "description";
730
- tableName: "departments";
731
- dataType: "string";
732
- columnType: "PgText";
733
- data: string;
734
- driverParam: string;
735
- notNull: false;
736
- hasDefault: false;
737
- isPrimaryKey: false;
738
- isAutoincrement: false;
739
- hasRuntimeDefault: false;
740
- enumValues: [string, ...string[]];
741
- baseColumn: never;
742
- identity: undefined;
743
- generated: undefined;
744
- }, {}, {}>;
745
- organisation: PgColumn< {
746
- name: "organisation";
747
- tableName: "departments";
748
- dataType: "number";
749
- columnType: "PgInteger";
750
- data: number;
751
- driverParam: string | number;
752
- notNull: true;
753
- hasDefault: false;
754
- isPrimaryKey: false;
755
- isAutoincrement: false;
756
- hasRuntimeDefault: false;
757
- enumValues: undefined;
758
- baseColumn: never;
759
- identity: undefined;
760
- generated: undefined;
761
- }, {}, {}>;
762
- createdAt: PgColumn< {
763
- name: "created_at";
764
- tableName: "departments";
765
- dataType: "date";
766
- columnType: "PgTimestamp";
767
- data: Date;
768
- driverParam: string;
769
- notNull: false;
770
- hasDefault: true;
771
- isPrimaryKey: false;
772
- isAutoincrement: false;
773
- hasRuntimeDefault: false;
774
- enumValues: undefined;
775
- baseColumn: never;
776
- identity: undefined;
777
- generated: undefined;
778
- }, {}, {}>;
779
- updatedAt: PgColumn< {
780
- name: "updated_at";
781
- tableName: "departments";
782
- dataType: "date";
783
- columnType: "PgTimestamp";
784
- data: Date;
785
- driverParam: string;
786
- notNull: false;
787
- hasDefault: true;
788
- isPrimaryKey: false;
789
- isAutoincrement: false;
790
- hasRuntimeDefault: false;
791
- enumValues: undefined;
792
- baseColumn: never;
793
- identity: undefined;
794
- generated: undefined;
795
- }, {}, {}>;
796
- };
797
- dialect: "pg";
798
- }>;
799
- suppliers: PgTableWithColumns< {
800
- name: "suppliers";
801
- schema: undefined;
802
- columns: {
803
- id: PgColumn< {
804
- name: "id";
805
- tableName: "suppliers";
806
- dataType: "number";
807
- columnType: "PgInteger";
808
- data: number;
809
- driverParam: string | number;
810
- notNull: true;
811
- hasDefault: false;
812
- isPrimaryKey: true;
813
- isAutoincrement: false;
814
- hasRuntimeDefault: false;
815
- enumValues: undefined;
816
- baseColumn: never;
817
- identity: undefined;
818
- generated: undefined;
819
- }, {}, {}>;
820
- name: PgColumn< {
821
- name: "name";
822
- tableName: "suppliers";
823
- dataType: "string";
824
- columnType: "PgText";
825
- data: string;
826
- driverParam: string;
827
- notNull: true;
828
- hasDefault: false;
829
- isPrimaryKey: false;
830
- isAutoincrement: false;
831
- hasRuntimeDefault: false;
832
- enumValues: [string, ...string[]];
833
- baseColumn: never;
834
- identity: undefined;
835
- generated: undefined;
836
- }, {}, {}>;
837
- description: PgColumn< {
838
- name: "description";
839
- tableName: "suppliers";
840
- dataType: "string";
841
- columnType: "PgText";
842
- data: string;
843
- driverParam: string;
844
- notNull: false;
845
- hasDefault: false;
846
- isPrimaryKey: false;
847
- isAutoincrement: false;
848
- hasRuntimeDefault: false;
849
- enumValues: [string, ...string[]];
850
- baseColumn: never;
851
- identity: undefined;
852
- generated: undefined;
853
- }, {}, {}>;
854
- internal: PgColumn< {
855
- name: "internal";
856
- tableName: "suppliers";
857
- dataType: "boolean";
858
- columnType: "PgBoolean";
859
- data: boolean;
860
- driverParam: boolean;
861
- notNull: false;
862
- hasDefault: true;
863
- isPrimaryKey: false;
864
- isAutoincrement: false;
865
- hasRuntimeDefault: false;
866
- enumValues: undefined;
867
- baseColumn: never;
868
- identity: undefined;
869
- generated: undefined;
870
- }, {}, {}>;
871
- organisation: PgColumn< {
872
- name: "organisation";
873
- tableName: "suppliers";
874
- dataType: "number";
875
- columnType: "PgInteger";
876
- data: number;
877
- driverParam: string | number;
878
- notNull: true;
879
- hasDefault: false;
880
- isPrimaryKey: false;
881
- isAutoincrement: false;
882
- hasRuntimeDefault: false;
883
- enumValues: undefined;
884
- baseColumn: never;
885
- identity: undefined;
886
- generated: undefined;
887
- }, {}, {}>;
888
- createdAt: PgColumn< {
889
- name: "created_at";
890
- tableName: "suppliers";
891
- dataType: "date";
892
- columnType: "PgTimestamp";
893
- data: Date;
894
- driverParam: string;
895
- notNull: false;
896
- hasDefault: true;
897
- isPrimaryKey: false;
898
- isAutoincrement: false;
899
- hasRuntimeDefault: false;
900
- enumValues: undefined;
901
- baseColumn: never;
902
- identity: undefined;
903
- generated: undefined;
904
- }, {}, {}>;
905
- updatedAt: PgColumn< {
906
- name: "updated_at";
907
- tableName: "suppliers";
908
- dataType: "date";
909
- columnType: "PgTimestamp";
910
- data: Date;
911
- driverParam: string;
912
- notNull: false;
913
- hasDefault: true;
914
- isPrimaryKey: false;
915
- isAutoincrement: false;
916
- hasRuntimeDefault: false;
917
- enumValues: undefined;
918
- baseColumn: never;
919
- identity: undefined;
920
- generated: undefined;
921
- }, {}, {}>;
922
- };
923
- dialect: "pg";
924
- }>;
925
- employees: PgTableWithColumns< {
926
- name: "employees";
927
- schema: undefined;
928
- columns: {
929
- id: PgColumn< {
930
- name: "id";
931
- tableName: "employees";
932
- dataType: "number";
933
- columnType: "PgInteger";
934
- data: number;
935
- driverParam: string | number;
936
- notNull: true;
937
- hasDefault: false;
938
- isPrimaryKey: true;
939
- isAutoincrement: false;
940
- hasRuntimeDefault: false;
941
- enumValues: undefined;
942
- baseColumn: never;
943
- identity: undefined;
944
- generated: undefined;
945
- }, {}, {}>;
946
- name: PgColumn< {
947
- name: "name";
948
- tableName: "employees";
949
- dataType: "string";
950
- columnType: "PgText";
951
- data: string;
952
- driverParam: string;
953
- notNull: true;
954
- hasDefault: false;
955
- isPrimaryKey: false;
956
- isAutoincrement: false;
957
- hasRuntimeDefault: false;
958
- enumValues: [string, ...string[]];
959
- baseColumn: never;
960
- identity: undefined;
961
- generated: undefined;
962
- }, {}, {}>;
963
- email: PgColumn< {
964
- name: "email";
965
- tableName: "employees";
966
- dataType: "string";
967
- columnType: "PgText";
968
- data: string;
969
- driverParam: string;
970
- notNull: true;
971
- hasDefault: false;
972
- isPrimaryKey: false;
973
- isAutoincrement: false;
974
- hasRuntimeDefault: false;
975
- enumValues: [string, ...string[]];
976
- baseColumn: never;
977
- identity: undefined;
978
- generated: undefined;
979
- }, {}, {}>;
980
- active: PgColumn< {
981
- name: "active";
982
- tableName: "employees";
983
- dataType: "boolean";
984
- columnType: "PgBoolean";
985
- data: boolean;
986
- driverParam: boolean;
987
- notNull: false;
988
- hasDefault: true;
989
- isPrimaryKey: false;
990
- isAutoincrement: false;
991
- hasRuntimeDefault: false;
992
- enumValues: undefined;
993
- baseColumn: never;
994
- identity: undefined;
995
- generated: undefined;
996
- }, {}, {}>;
997
- fteBasis: PgColumn< {
998
- name: "fte_basis";
999
- tableName: "employees";
1000
- dataType: "string";
1001
- columnType: "PgNumeric";
1002
- data: string;
1003
- driverParam: string;
1004
- notNull: false;
1005
- hasDefault: true;
1006
- isPrimaryKey: false;
1007
- isAutoincrement: false;
1008
- hasRuntimeDefault: false;
1009
- enumValues: undefined;
1010
- baseColumn: never;
1011
- identity: undefined;
1012
- generated: undefined;
1013
- }, {}, {}>;
1014
- startDate: PgColumn< {
1015
- name: "start_date";
1016
- tableName: "employees";
1017
- dataType: "date";
1018
- columnType: "PgTimestamp";
1019
- data: Date;
1020
- driverParam: string;
1021
- notNull: false;
1022
- hasDefault: false;
1023
- isPrimaryKey: false;
1024
- isAutoincrement: false;
1025
- hasRuntimeDefault: false;
1026
- enumValues: undefined;
1027
- baseColumn: never;
1028
- identity: undefined;
1029
- generated: undefined;
1030
- }, {}, {}>;
1031
- endDate: PgColumn< {
1032
- name: "end_date";
1033
- tableName: "employees";
1034
- dataType: "date";
1035
- columnType: "PgTimestamp";
1036
- data: Date;
1037
- driverParam: string;
1038
- notNull: false;
1039
- hasDefault: false;
1040
- isPrimaryKey: false;
1041
- isAutoincrement: false;
1042
- hasRuntimeDefault: false;
1043
- enumValues: undefined;
1044
- baseColumn: never;
1045
- identity: undefined;
1046
- generated: undefined;
1047
- }, {}, {}>;
1048
- department: PgColumn< {
1049
- name: "department";
1050
- tableName: "employees";
1051
- dataType: "number";
1052
- columnType: "PgInteger";
1053
- data: number;
1054
- driverParam: string | number;
1055
- notNull: false;
1056
- hasDefault: false;
1057
- isPrimaryKey: false;
1058
- isAutoincrement: false;
1059
- hasRuntimeDefault: false;
1060
- enumValues: undefined;
1061
- baseColumn: never;
1062
- identity: undefined;
1063
- generated: undefined;
1064
- }, {}, {}>;
1065
- supplier: PgColumn< {
1066
- name: "supplier";
1067
- tableName: "employees";
1068
- dataType: "number";
1069
- columnType: "PgInteger";
1070
- data: number;
1071
- driverParam: string | number;
1072
- notNull: false;
1073
- hasDefault: false;
1074
- isPrimaryKey: false;
1075
- isAutoincrement: false;
1076
- hasRuntimeDefault: false;
1077
- enumValues: undefined;
1078
- baseColumn: never;
1079
- identity: undefined;
1080
- generated: undefined;
1081
- }, {}, {}>;
1082
- organisation: PgColumn< {
1083
- name: "organisation";
1084
- tableName: "employees";
1085
- dataType: "number";
1086
- columnType: "PgInteger";
1087
- data: number;
1088
- driverParam: string | number;
1089
- notNull: true;
1090
- hasDefault: false;
1091
- isPrimaryKey: false;
1092
- isAutoincrement: false;
1093
- hasRuntimeDefault: false;
1094
- enumValues: undefined;
1095
- baseColumn: never;
1096
- identity: undefined;
1097
- generated: undefined;
1098
- }, {}, {}>;
1099
- createdAt: PgColumn< {
1100
- name: "created_at";
1101
- tableName: "employees";
1102
- dataType: "date";
1103
- columnType: "PgTimestamp";
1104
- data: Date;
1105
- driverParam: string;
1106
- notNull: false;
1107
- hasDefault: true;
1108
- isPrimaryKey: false;
1109
- isAutoincrement: false;
1110
- hasRuntimeDefault: false;
1111
- enumValues: undefined;
1112
- baseColumn: never;
1113
- identity: undefined;
1114
- generated: undefined;
1115
- }, {}, {}>;
1116
- updatedAt: PgColumn< {
1117
- name: "updated_at";
1118
- tableName: "employees";
1119
- dataType: "date";
1120
- columnType: "PgTimestamp";
1121
- data: Date;
1122
- driverParam: string;
1123
- notNull: false;
1124
- hasDefault: true;
1125
- isPrimaryKey: false;
1126
- isAutoincrement: false;
1127
- hasRuntimeDefault: false;
1128
- enumValues: undefined;
1129
- baseColumn: never;
1130
- identity: undefined;
1131
- generated: undefined;
1132
- }, {}, {}>;
1133
- };
1134
- dialect: "pg";
1135
- }>;
1136
- organisationsRelations: Relations<"organisations", {
1137
- departments: Many<"departments">;
1138
- suppliers: Many<"suppliers">;
1139
- employees: Many<"employees">;
1140
- }>;
1141
- departmentsRelations: Relations<"departments", {
1142
- organisation: One<"organisations", true>;
1143
- employees: Many<"employees">;
1144
- }>;
1145
- suppliersRelations: Relations<"suppliers", {
1146
- organisation: One<"organisations", true>;
1147
- employees: Many<"employees">;
1148
- }>;
1149
- employeesRelations: Relations<"employees", {
1150
- organisation: One<"organisations", true>;
1151
- department: One<"departments", false>;
1152
- supplier: One<"suppliers", false>;
1153
- }>;
1154
- };
1155
-
1156
251
  /**
1157
252
  * Filter definitions with logical operators
1158
253
  */
@@ -1263,7 +358,7 @@ export declare class MultiCubeBuilder<TSchema extends Record<string, any> = Reco
1263
358
  /**
1264
359
  * Build a multi-cube query plan
1265
360
  */
1266
- buildMultiCubeQueryPlan(cubes: Map<string, CubeWithJoins<TSchema>>, query: SemanticQuery, ctx: QueryContext<TSchema>): MultiCubeQueryPlan<TSchema>;
361
+ buildMultiCubeQueryPlan(cubes: Map<string, Cube<TSchema>>, query: SemanticQuery, ctx: QueryContext<TSchema>): MultiCubeQueryPlan<TSchema>;
1267
362
  /**
1268
363
  * Choose the primary cube based on query analysis
1269
364
  */
@@ -1334,113 +429,18 @@ export declare interface MultiCubeQueryPlan<TSchema extends Record<string, any>
1334
429
  * Works with mysql2 driver
1335
430
  */
1336
431
  export declare class MySQLExecutor<TSchema extends Record<string, any> = Record<string, any>> extends BaseDatabaseExecutor<TSchema> {
1337
- execute<T = any[]>(query: SQL | any): Promise<T>;
432
+ execute<T = any[]>(query: SQL | any, measureFields?: string[]): Promise<T>;
433
+ /**
434
+ * Convert numeric string fields to numbers (only for measure fields)
435
+ */
436
+ private convertNumericFields;
437
+ /**
438
+ * Coerce a value to a number if it represents a numeric type
439
+ */
440
+ private coerceToNumber;
1338
441
  getEngineType(): 'mysql';
1339
442
  }
1340
443
 
1341
- /**
1342
- * Example schema for demonstrating Drizzle cube definitions
1343
- * This shows how to define cubes using actual Drizzle schema
1344
- */
1345
- export declare const organisations: PgTableWithColumns< {
1346
- name: "organisations";
1347
- schema: undefined;
1348
- columns: {
1349
- id: PgColumn< {
1350
- name: "id";
1351
- tableName: "organisations";
1352
- dataType: "number";
1353
- columnType: "PgInteger";
1354
- data: number;
1355
- driverParam: string | number;
1356
- notNull: true;
1357
- hasDefault: false;
1358
- isPrimaryKey: true;
1359
- isAutoincrement: false;
1360
- hasRuntimeDefault: false;
1361
- enumValues: undefined;
1362
- baseColumn: never;
1363
- identity: undefined;
1364
- generated: undefined;
1365
- }, {}, {}>;
1366
- name: PgColumn< {
1367
- name: "name";
1368
- tableName: "organisations";
1369
- dataType: "string";
1370
- columnType: "PgText";
1371
- data: string;
1372
- driverParam: string;
1373
- notNull: true;
1374
- hasDefault: false;
1375
- isPrimaryKey: false;
1376
- isAutoincrement: false;
1377
- hasRuntimeDefault: false;
1378
- enumValues: [string, ...string[]];
1379
- baseColumn: never;
1380
- identity: undefined;
1381
- generated: undefined;
1382
- }, {}, {}>;
1383
- description: PgColumn< {
1384
- name: "description";
1385
- tableName: "organisations";
1386
- dataType: "string";
1387
- columnType: "PgText";
1388
- data: string;
1389
- driverParam: string;
1390
- notNull: false;
1391
- hasDefault: false;
1392
- isPrimaryKey: false;
1393
- isAutoincrement: false;
1394
- hasRuntimeDefault: false;
1395
- enumValues: [string, ...string[]];
1396
- baseColumn: never;
1397
- identity: undefined;
1398
- generated: undefined;
1399
- }, {}, {}>;
1400
- createdAt: PgColumn< {
1401
- name: "created_at";
1402
- tableName: "organisations";
1403
- dataType: "date";
1404
- columnType: "PgTimestamp";
1405
- data: Date;
1406
- driverParam: string;
1407
- notNull: false;
1408
- hasDefault: true;
1409
- isPrimaryKey: false;
1410
- isAutoincrement: false;
1411
- hasRuntimeDefault: false;
1412
- enumValues: undefined;
1413
- baseColumn: never;
1414
- identity: undefined;
1415
- generated: undefined;
1416
- }, {}, {}>;
1417
- updatedAt: PgColumn< {
1418
- name: "updated_at";
1419
- tableName: "organisations";
1420
- dataType: "date";
1421
- columnType: "PgTimestamp";
1422
- data: Date;
1423
- driverParam: string;
1424
- notNull: false;
1425
- hasDefault: true;
1426
- isPrimaryKey: false;
1427
- isAutoincrement: false;
1428
- hasRuntimeDefault: false;
1429
- enumValues: undefined;
1430
- baseColumn: never;
1431
- identity: undefined;
1432
- generated: undefined;
1433
- }, {}, {}>;
1434
- };
1435
- dialect: "pg";
1436
- }>;
1437
-
1438
- export declare const organisationsRelations: Relations<"organisations", {
1439
- departments: Many<"departments">;
1440
- suppliers: Many<"suppliers">;
1441
- employees: Many<"employees">;
1442
- }>;
1443
-
1444
444
  /**
1445
445
  * Parse YAML content and return validation result with converted cubes
1446
446
  */
@@ -1451,11 +451,15 @@ export declare function parseYamlCubes(yamlContent: string): YamlValidationResul
1451
451
  * Works with postgres.js and Neon drivers
1452
452
  */
1453
453
  export declare class PostgresExecutor<TSchema extends Record<string, any> = Record<string, any>> extends BaseDatabaseExecutor<TSchema> {
1454
- execute<T = any[]>(query: SQL | any): Promise<T>;
454
+ execute<T = any[]>(query: SQL | any, measureFields?: string[]): Promise<T>;
1455
455
  /**
1456
- * Convert numeric string fields to numbers
456
+ * Convert numeric string fields to numbers (only for measure fields)
1457
457
  */
1458
458
  private convertNumericFields;
459
+ /**
460
+ * Coerce a value to a number if it represents a numeric type
461
+ */
462
+ private coerceToNumber;
1459
463
  getEngineType(): 'postgres';
1460
464
  }
1461
465
 
@@ -1478,7 +482,7 @@ export declare class QueryExecutor<TSchema extends Record<string, any> = Record<
1478
482
  /**
1479
483
  * Unified query execution method that handles both single and multi-cube queries
1480
484
  */
1481
- execute(cubes: Map<string, CubeWithJoins<TSchema>>, query: SemanticQuery, securityContext: SecurityContext): Promise<QueryResult>;
485
+ execute(cubes: Map<string, Cube<TSchema>>, query: SemanticQuery, securityContext: SecurityContext): Promise<QueryResult>;
1482
486
  /**
1483
487
  * Legacy interface for single cube queries
1484
488
  */
@@ -1502,6 +506,17 @@ export declare class QueryExecutor<TSchema extends Record<string, any> = Record<
1502
506
  sql: string;
1503
507
  params?: any[];
1504
508
  }>;
509
+ /**
510
+ * Generate raw SQL for multi-cube queries without execution
511
+ */
512
+ generateMultiCubeSQL(cubes: Map<string, Cube<TSchema>>, query: SemanticQuery, securityContext: SecurityContext): Promise<{
513
+ sql: string;
514
+ params?: any[];
515
+ }>;
516
+ /**
517
+ * Build multi-cube query (extracted from executeMultiCube for reuse)
518
+ */
519
+ private buildMultiCubeQuery;
1505
520
  /**
1506
521
  * Generate SQL for Cube
1507
522
  */
@@ -1530,12 +545,25 @@ export declare class QueryExecutor<TSchema extends Record<string, any> = Record<
1530
545
  * Build filter condition using Drizzle operators
1531
546
  */
1532
547
  private buildFilterCondition;
548
+ /**
549
+ * Build date range condition for time dimensions
550
+ */
551
+ private buildDateRangeCondition;
552
+ /**
553
+ * Parse relative date range expressions like "last 7 days", "this month"
554
+ */
555
+ private parseRelativeDateRange;
556
+ /**
557
+ * Normalize date values to handle both string and Date objects
558
+ * For PostgreSQL timestamp fields, Drizzle expects Date objects
559
+ */
560
+ private normalizeDate;
1533
561
  /**
1534
562
  * Build GROUP BY fields from dimensions and time dimensions (Cube)
1535
563
  */
1536
564
  private buildGroupByFields;
1537
565
  /**
1538
- * Build ORDER BY clause
566
+ * Build ORDER BY clause with automatic time dimension sorting
1539
567
  */
1540
568
  private buildOrderBy;
1541
569
  /**
@@ -1669,19 +697,19 @@ export declare class SemanticLayerCompiler<TSchema extends Record<string, any> =
1669
697
  /**
1670
698
  * Register a simplified cube with dynamic query building
1671
699
  */
1672
- registerCube(cube: CubeWithJoins<TSchema>): void;
700
+ registerCube(cube: Cube<TSchema>): void;
1673
701
  /**
1674
702
  * Get a cube by name
1675
703
  */
1676
- getCube(name: string): CubeWithJoins<TSchema> | undefined;
704
+ getCube(name: string): Cube<TSchema> | undefined;
1677
705
  /**
1678
706
  * Get all registered cubes
1679
707
  */
1680
- getAllCubes(): CubeWithJoins<TSchema>[];
708
+ getAllCubes(): Cube<TSchema>[];
1681
709
  /**
1682
710
  * Get all cubes as a Map for multi-cube queries
1683
711
  */
1684
- getAllCubesMap(): Map<string, CubeWithJoins<TSchema>>;
712
+ getAllCubesMap(): Map<string, Cube<TSchema>>;
1685
713
  /**
1686
714
  * Unified query execution method that handles both single and multi-cube queries
1687
715
  */
@@ -1709,6 +737,13 @@ export declare class SemanticLayerCompiler<TSchema extends Record<string, any> =
1709
737
  sql: string;
1710
738
  params?: any[];
1711
739
  }>;
740
+ /**
741
+ * Get SQL for a multi-cube query without executing it (debugging)
742
+ */
743
+ generateMultiCubeSQL(query: SemanticQuery, securityContext: SecurityContext): Promise<{
744
+ sql: string;
745
+ params?: any[];
746
+ }>;
1712
747
  /**
1713
748
  * Check if a cube exists
1714
749
  */
@@ -1725,6 +760,14 @@ export declare class SemanticLayerCompiler<TSchema extends Record<string, any> =
1725
760
  * Get cube names
1726
761
  */
1727
762
  getCubeNames(): string[];
763
+ /**
764
+ * Validate a query against registered cubes
765
+ * Ensures all referenced cubes and fields exist
766
+ */
767
+ validateQuery(query: SemanticQuery): {
768
+ isValid: boolean;
769
+ errors: string[];
770
+ };
1728
771
  }
1729
772
 
1730
773
  /**
@@ -2061,7 +1104,15 @@ export { SQL }
2061
1104
  * Works with better-sqlite3 driver
2062
1105
  */
2063
1106
  export declare class SQLiteExecutor<TSchema extends Record<string, any> = Record<string, any>> extends BaseDatabaseExecutor<TSchema> {
2064
- execute<T = any[]>(query: SQL | any): Promise<T>;
1107
+ execute<T = any[]>(query: SQL | any, measureFields?: string[]): Promise<T>;
1108
+ /**
1109
+ * Convert numeric string fields to numbers (only for measure fields)
1110
+ */
1111
+ private convertNumericFields;
1112
+ /**
1113
+ * Coerce a value to a number if it represents a numeric type
1114
+ */
1115
+ private coerceToNumber;
2065
1116
  getEngineType(): 'sqlite';
2066
1117
  }
2067
1118
 
@@ -2073,138 +1124,6 @@ export declare interface SqlResult {
2073
1124
  params?: any[];
2074
1125
  }
2075
1126
 
2076
- export declare const suppliers: PgTableWithColumns< {
2077
- name: "suppliers";
2078
- schema: undefined;
2079
- columns: {
2080
- id: PgColumn< {
2081
- name: "id";
2082
- tableName: "suppliers";
2083
- dataType: "number";
2084
- columnType: "PgInteger";
2085
- data: number;
2086
- driverParam: string | number;
2087
- notNull: true;
2088
- hasDefault: false;
2089
- isPrimaryKey: true;
2090
- isAutoincrement: false;
2091
- hasRuntimeDefault: false;
2092
- enumValues: undefined;
2093
- baseColumn: never;
2094
- identity: undefined;
2095
- generated: undefined;
2096
- }, {}, {}>;
2097
- name: PgColumn< {
2098
- name: "name";
2099
- tableName: "suppliers";
2100
- dataType: "string";
2101
- columnType: "PgText";
2102
- data: string;
2103
- driverParam: string;
2104
- notNull: true;
2105
- hasDefault: false;
2106
- isPrimaryKey: false;
2107
- isAutoincrement: false;
2108
- hasRuntimeDefault: false;
2109
- enumValues: [string, ...string[]];
2110
- baseColumn: never;
2111
- identity: undefined;
2112
- generated: undefined;
2113
- }, {}, {}>;
2114
- description: PgColumn< {
2115
- name: "description";
2116
- tableName: "suppliers";
2117
- dataType: "string";
2118
- columnType: "PgText";
2119
- data: string;
2120
- driverParam: string;
2121
- notNull: false;
2122
- hasDefault: false;
2123
- isPrimaryKey: false;
2124
- isAutoincrement: false;
2125
- hasRuntimeDefault: false;
2126
- enumValues: [string, ...string[]];
2127
- baseColumn: never;
2128
- identity: undefined;
2129
- generated: undefined;
2130
- }, {}, {}>;
2131
- internal: PgColumn< {
2132
- name: "internal";
2133
- tableName: "suppliers";
2134
- dataType: "boolean";
2135
- columnType: "PgBoolean";
2136
- data: boolean;
2137
- driverParam: boolean;
2138
- notNull: false;
2139
- hasDefault: true;
2140
- isPrimaryKey: false;
2141
- isAutoincrement: false;
2142
- hasRuntimeDefault: false;
2143
- enumValues: undefined;
2144
- baseColumn: never;
2145
- identity: undefined;
2146
- generated: undefined;
2147
- }, {}, {}>;
2148
- organisation: PgColumn< {
2149
- name: "organisation";
2150
- tableName: "suppliers";
2151
- dataType: "number";
2152
- columnType: "PgInteger";
2153
- data: number;
2154
- driverParam: string | number;
2155
- notNull: true;
2156
- hasDefault: false;
2157
- isPrimaryKey: false;
2158
- isAutoincrement: false;
2159
- hasRuntimeDefault: false;
2160
- enumValues: undefined;
2161
- baseColumn: never;
2162
- identity: undefined;
2163
- generated: undefined;
2164
- }, {}, {}>;
2165
- createdAt: PgColumn< {
2166
- name: "created_at";
2167
- tableName: "suppliers";
2168
- dataType: "date";
2169
- columnType: "PgTimestamp";
2170
- data: Date;
2171
- driverParam: string;
2172
- notNull: false;
2173
- hasDefault: true;
2174
- isPrimaryKey: false;
2175
- isAutoincrement: false;
2176
- hasRuntimeDefault: false;
2177
- enumValues: undefined;
2178
- baseColumn: never;
2179
- identity: undefined;
2180
- generated: undefined;
2181
- }, {}, {}>;
2182
- updatedAt: PgColumn< {
2183
- name: "updated_at";
2184
- tableName: "suppliers";
2185
- dataType: "date";
2186
- columnType: "PgTimestamp";
2187
- data: Date;
2188
- driverParam: string;
2189
- notNull: false;
2190
- hasDefault: true;
2191
- isPrimaryKey: false;
2192
- isAutoincrement: false;
2193
- hasRuntimeDefault: false;
2194
- enumValues: undefined;
2195
- baseColumn: never;
2196
- identity: undefined;
2197
- generated: undefined;
2198
- }, {}, {}>;
2199
- };
2200
- dialect: "pg";
2201
- }>;
2202
-
2203
- export declare const suppliersRelations: Relations<"suppliers", {
2204
- organisation: One<"organisations", true>;
2205
- employees: Many<"employees">;
2206
- }>;
2207
-
2208
1127
  /**
2209
1128
  * Time dimension with granularity
2210
1129
  */