@finos/legend-query-builder 4.10.1 → 4.10.2

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 (102) hide show
  1. package/lib/__lib__/QueryBuilderEvent.d.ts +2 -1
  2. package/lib/__lib__/QueryBuilderEvent.d.ts.map +1 -1
  3. package/lib/__lib__/QueryBuilderEvent.js +1 -0
  4. package/lib/__lib__/QueryBuilderEvent.js.map +1 -1
  5. package/lib/components/QueryBuilderResultPanel.d.ts.map +1 -1
  6. package/lib/components/QueryBuilderResultPanel.js +57 -44
  7. package/lib/components/QueryBuilderResultPanel.js.map +1 -1
  8. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.d.ts.map +1 -1
  9. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js +2 -1
  10. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js.map +1 -1
  11. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js +1 -1
  12. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js.map +1 -1
  13. package/lib/graph/QueryBuilderMetaModelConst.d.ts +22 -1
  14. package/lib/graph/QueryBuilderMetaModelConst.d.ts.map +1 -1
  15. package/lib/graph/QueryBuilderMetaModelConst.js +24 -0
  16. package/lib/graph/QueryBuilderMetaModelConst.js.map +1 -1
  17. package/lib/index.css +0 -16
  18. package/lib/index.d.ts +2 -1
  19. package/lib/index.d.ts.map +1 -1
  20. package/lib/index.js +2 -1
  21. package/lib/index.js.map +1 -1
  22. package/lib/package.json +1 -1
  23. package/lib/stores/QueryBuilderPreviewDataHelper.d.ts.map +1 -1
  24. package/lib/stores/QueryBuilderPreviewDataHelper.js +2 -1
  25. package/lib/stores/QueryBuilderPreviewDataHelper.js.map +1 -1
  26. package/lib/stores/QueryBuilderResultState.d.ts +0 -3
  27. package/lib/stores/QueryBuilderResultState.d.ts.map +1 -1
  28. package/lib/stores/QueryBuilderResultState.js +2 -31
  29. package/lib/stores/QueryBuilderResultState.js.map +1 -1
  30. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  31. package/lib/stores/QueryBuilderState.js +2 -0
  32. package/lib/stores/QueryBuilderState.js.map +1 -1
  33. package/lib/stores/QueryBuilderTypeaheadHelper.d.ts.map +1 -1
  34. package/lib/stores/QueryBuilderTypeaheadHelper.js +1 -1
  35. package/lib/stores/QueryBuilderTypeaheadHelper.js.map +1 -1
  36. package/lib/stores/fetch-structure/tds/QueryBuilderTDSHelper.d.ts +4 -1
  37. package/lib/stores/fetch-structure/tds/QueryBuilderTDSHelper.d.ts.map +1 -1
  38. package/lib/stores/fetch-structure/tds/QueryBuilderTDSHelper.js +37 -3
  39. package/lib/stores/fetch-structure/tds/QueryBuilderTDSHelper.js.map +1 -1
  40. package/lib/stores/fetch-structure/tds/QueryResultSetModifierState.d.ts +1 -4
  41. package/lib/stores/fetch-structure/tds/QueryResultSetModifierState.d.ts.map +1 -1
  42. package/lib/stores/fetch-structure/tds/QueryResultSetModifierState.js +1 -5
  43. package/lib/stores/fetch-structure/tds/QueryResultSetModifierState.js.map +1 -1
  44. package/lib/stores/fetch-structure/tds/aggregation/QueryBuilderAggregateOperator.d.ts +1 -1
  45. package/lib/stores/fetch-structure/tds/aggregation/QueryBuilderAggregateOperator.d.ts.map +1 -1
  46. package/lib/stores/fetch-structure/tds/aggregation/QueryBuilderAggregateOperator.js +2 -2
  47. package/lib/stores/fetch-structure/tds/aggregation/QueryBuilderAggregateOperator.js.map +1 -1
  48. package/lib/stores/fetch-structure/tds/aggregation/QueryBuilderAggregationState.d.ts +3 -2
  49. package/lib/stores/fetch-structure/tds/aggregation/QueryBuilderAggregationState.d.ts.map +1 -1
  50. package/lib/stores/fetch-structure/tds/aggregation/QueryBuilderAggregationState.js +9 -0
  51. package/lib/stores/fetch-structure/tds/aggregation/QueryBuilderAggregationState.js.map +1 -1
  52. package/lib/stores/fetch-structure/tds/aggregation/operators/QueryBuilderAggregateOperator_DistinctCount.d.ts.map +1 -1
  53. package/lib/stores/fetch-structure/tds/aggregation/operators/QueryBuilderAggregateOperator_DistinctCount.js +2 -4
  54. package/lib/stores/fetch-structure/tds/aggregation/operators/QueryBuilderAggregateOperator_DistinctCount.js.map +1 -1
  55. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterOperator.d.ts +2 -1
  56. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterOperator.d.ts.map +1 -1
  57. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.d.ts +1 -15
  58. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.d.ts.map +1 -1
  59. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js +3 -44
  60. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js.map +1 -1
  61. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterStateBuilder.d.ts.map +1 -1
  62. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterStateBuilder.js +13 -3
  63. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterStateBuilder.js.map +1 -1
  64. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperatorValueSpecificationBuilder.d.ts.map +1 -1
  65. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperatorValueSpecificationBuilder.js +3 -2
  66. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperatorValueSpecificationBuilder.js.map +1 -1
  67. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_IsEmpty.d.ts +2 -1
  68. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_IsEmpty.d.ts.map +1 -1
  69. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_IsEmpty.js +2 -1
  70. package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_IsEmpty.js.map +1 -1
  71. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.d.ts.map +1 -1
  72. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.js +2 -2
  73. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.js.map +1 -1
  74. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.d.ts.map +1 -1
  75. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js +3 -10
  76. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js.map +1 -1
  77. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.d.ts +1 -1
  78. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.d.ts.map +1 -1
  79. package/package.json +3 -3
  80. package/src/__lib__/QueryBuilderEvent.ts +1 -0
  81. package/src/components/QueryBuilderResultPanel.tsx +76 -63
  82. package/src/components/fetch-structure/QueryBuilderResultModifierPanel.tsx +2 -4
  83. package/src/components/fetch-structure/QueryBuilderTDSWindowPanel.tsx +1 -1
  84. package/src/graph/QueryBuilderMetaModelConst.ts +25 -0
  85. package/src/index.ts +9 -2
  86. package/src/stores/QueryBuilderPreviewDataHelper.ts +2 -4
  87. package/src/stores/QueryBuilderResultState.ts +1 -36
  88. package/src/stores/QueryBuilderState.ts +5 -0
  89. package/src/stores/QueryBuilderTypeaheadHelper.ts +2 -4
  90. package/src/stores/fetch-structure/tds/QueryBuilderTDSHelper.ts +58 -2
  91. package/src/stores/fetch-structure/tds/QueryResultSetModifierState.ts +1 -5
  92. package/src/stores/fetch-structure/tds/aggregation/QueryBuilderAggregateOperator.ts +5 -9
  93. package/src/stores/fetch-structure/tds/aggregation/QueryBuilderAggregationState.ts +16 -2
  94. package/src/stores/fetch-structure/tds/aggregation/operators/QueryBuilderAggregateOperator_DistinctCount.ts +2 -4
  95. package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterOperator.ts +1 -1
  96. package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.ts +1 -50
  97. package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterStateBuilder.ts +22 -4
  98. package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperatorValueSpecificationBuilder.ts +4 -4
  99. package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_IsEmpty.ts +1 -1
  100. package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.ts +5 -5
  101. package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.ts +5 -15
  102. package/src/stores/fetch-structure/tds/window/QueryBuilderWindowState.ts +1 -1
@@ -26,6 +26,7 @@ export enum QUERY_BUILDER_EVENT {
26
26
 
27
27
  MAPPING_MODEL_COVERAGE_ANALYSYS__LAUNCH = 'query-builder.mapping-model-coverage-analysis.launch',
28
28
  MAPPING_MODEL_COVERAGE_ANALYSYS__SUCCESS = 'query-builder.mapping-model-coverage-analysis.success',
29
+ UNSUPPORTED_QUERY_LAUNCH = 'query-builder.unsupported-query.lanuch',
29
30
  }
30
31
 
31
32
  export enum QUERY_BUILDER_FILTER_EVENT {
@@ -52,6 +52,7 @@ import {
52
52
  EnumValueInstanceValue,
53
53
  EnumValueExplicitReference,
54
54
  RelationalExecutionActivities,
55
+ getTDSRowRankByColumnInAsc,
55
56
  } from '@finos/legend-graph';
56
57
  import {
57
58
  ActionAlertActionType,
@@ -62,6 +63,8 @@ import {
62
63
  import {
63
64
  assertErrorThrown,
64
65
  guaranteeNonNullable,
66
+ isBoolean,
67
+ type PlainObject,
65
68
  prettyDuration,
66
69
  filterByType,
67
70
  isValidURL,
@@ -417,7 +420,9 @@ const QueryBuilderGridResultContextMenu = observer(
417
420
  ),
418
421
  );
419
422
 
420
- const findSelectedCellRowData = (): string => {
423
+ const findRowFromRowIndex = (
424
+ rowIndex: number,
425
+ ): (string | number | boolean | null)[] => {
421
426
  if (
422
427
  !tdsState.queryBuilderState.resultState.executionResult ||
423
428
  !(
@@ -425,31 +430,21 @@ const QueryBuilderGridResultContextMenu = observer(
425
430
  TDSExecutionResult
426
431
  )
427
432
  ) {
428
- return '';
433
+ return [''];
429
434
  }
430
- const rowData = tdsState.queryBuilderState.resultState.rowData.find(
431
- (rData) =>
432
- rData.rowNumber ===
433
- tdsState.queryBuilderState.resultState.selectedCells[0]?.coordinates
434
- .rowIndex,
435
+ return (
436
+ tdsState.queryBuilderState.resultState.executionResult.result.rows[
437
+ rowIndex
438
+ ]?.values ?? ['']
435
439
  );
436
- // try to get the entire row value separated by comma
437
- // rowData is in format of {columnName: value, columnName1: value, ...., rowNumber:value}
438
- const valueArr: (string | number | boolean | null | undefined)[] = [];
439
- if (rowData) {
440
- Object.entries(rowData).forEach((entry) => {
441
- if (entry[0] !== 'rowNumber') {
442
- valueArr.push(entry[1]);
443
- }
444
- });
445
- return valueArr.join(',');
446
- }
447
- return '';
448
440
  };
449
441
 
450
442
  const handleCopyRowValue = applicationStore.guardUnhandledError(() =>
451
443
  applicationStore.clipboardService.copyTextToClipboard(
452
- findSelectedCellRowData(),
444
+ findRowFromRowIndex(
445
+ tdsState.queryBuilderState.resultState.selectedCells[0]?.coordinates
446
+ .rowIndex ?? 0,
447
+ ).toString(),
453
448
  ),
454
449
  );
455
450
 
@@ -507,18 +502,18 @@ const QueryResultCellRenderer = observer(
507
502
  isString(cellValue) && isValidURL(cellValue) ? cellValue : undefined;
508
503
  const columnName = params.column?.getColId() ?? '';
509
504
  const findCoordinatesFromResultValue = (
510
- colName: string,
505
+ colId: string,
511
506
  rowNumber: number,
512
507
  ): QueryBuilderTDSResultCellCoordinate => {
513
508
  const colIndex = tdsExecutionResult.result.columns.findIndex(
514
- (col) => col === colName,
509
+ (col) => col === colId,
515
510
  );
516
511
  return { rowIndex: rowNumber, colIndex: colIndex };
517
512
  };
518
513
 
519
514
  const currentCellCoordinates = findCoordinatesFromResultValue(
520
515
  columnName,
521
- params.data.rowNumber,
516
+ params.rowIndex,
522
517
  );
523
518
  const cellInFilteredResults = resultState.selectedCells.some(
524
519
  (result) =>
@@ -526,9 +521,9 @@ const QueryResultCellRenderer = observer(
526
521
  result.coordinates.rowIndex === currentCellCoordinates.rowIndex,
527
522
  );
528
523
 
529
- const findColumnNameFromColumnIndex = (
524
+ const findColumnFromCoordinates = (
530
525
  colIndex: number,
531
- ): string | undefined => {
526
+ ): string | number | boolean | null | undefined => {
532
527
  if (
533
528
  !resultState.executionResult ||
534
529
  !(resultState.executionResult instanceof TDSExecutionResult)
@@ -539,12 +534,30 @@ const QueryResultCellRenderer = observer(
539
534
  };
540
535
 
541
536
  const findResultValueFromCoordinates = (
542
- rowIndex: number,
543
- colName: string,
544
- ): string | number | boolean | null | undefined =>
545
- resultState.rowData.find((data) => data.rowNumber === rowIndex)![
546
- colName
547
- ] as string | number | boolean | null | undefined;
537
+ resultCoordinate: [number, number],
538
+ ): string | number | boolean | null | undefined => {
539
+ const rowIndex = resultCoordinate[0];
540
+ const colIndex = resultCoordinate[1];
541
+
542
+ if (
543
+ !resultState.executionResult ||
544
+ !(resultState.executionResult instanceof TDSExecutionResult)
545
+ ) {
546
+ return undefined;
547
+ }
548
+ if (params.columnApi.getColumnState()[colIndex]?.sort === 'asc') {
549
+ resultState.executionResult.result.rows.sort((a, b) =>
550
+ getTDSRowRankByColumnInAsc(a, b, colIndex),
551
+ );
552
+ } else if (params.columnApi.getColumnState()[colIndex]?.sort === 'desc') {
553
+ resultState.executionResult.result.rows.sort((a, b) =>
554
+ getTDSRowRankByColumnInAsc(b, a, colIndex),
555
+ );
556
+ }
557
+ return resultState.executionResult.result.rows[rowIndex]?.values[
558
+ colIndex
559
+ ];
560
+ };
548
561
 
549
562
  const isCoordinatesSelected = (
550
563
  resultCoordinate: QueryBuilderTDSResultCellCoordinate,
@@ -561,12 +574,12 @@ const QueryResultCellRenderer = observer(
561
574
  if (event.shiftKey) {
562
575
  const coordinates = findCoordinatesFromResultValue(
563
576
  columnName,
564
- params.data.rowNumber,
577
+ params.rowIndex,
565
578
  );
566
- const actualValue = findResultValueFromCoordinates(
579
+ const actualValue = findResultValueFromCoordinates([
567
580
  coordinates.rowIndex,
568
- columnName,
569
- );
581
+ coordinates.colIndex,
582
+ ]);
570
583
  resultState.addSelectedCell({
571
584
  value: actualValue,
572
585
  columnName: columnName,
@@ -580,12 +593,12 @@ const QueryResultCellRenderer = observer(
580
593
  resultState.setSelectedCells([]);
581
594
  const coordinates = findCoordinatesFromResultValue(
582
595
  columnName,
583
- params.data.rowNumber,
596
+ params.rowIndex,
584
597
  );
585
- const actualValue = findResultValueFromCoordinates(
598
+ const actualValue = findResultValueFromCoordinates([
586
599
  coordinates.rowIndex,
587
- columnName,
588
- );
600
+ coordinates.colIndex,
601
+ ]);
589
602
  resultState.setSelectedCells([
590
603
  {
591
604
  value: actualValue,
@@ -599,14 +612,14 @@ const QueryResultCellRenderer = observer(
599
612
  if (event.button === 2) {
600
613
  const coordinates = findCoordinatesFromResultValue(
601
614
  columnName,
602
- params.data.rowNumber,
615
+ params.rowIndex,
603
616
  );
604
617
  const isInSelected = isCoordinatesSelected(coordinates);
605
618
  if (!isInSelected) {
606
- const actualValue = findResultValueFromCoordinates(
619
+ const actualValue = findResultValueFromCoordinates([
607
620
  coordinates.rowIndex,
608
- columnName,
609
- );
621
+ coordinates.colIndex,
622
+ ]);
610
623
  resultState.setSelectedCells([
611
624
  {
612
625
  value: actualValue,
@@ -636,7 +649,7 @@ const QueryResultCellRenderer = observer(
636
649
  const firstCorner = results.coordinates;
637
650
  const secondCorner = findCoordinatesFromResultValue(
638
651
  columnName,
639
- params.data.rowNumber,
652
+ params.rowIndex,
640
653
  );
641
654
 
642
655
  resultState.setSelectedCells([results]);
@@ -648,13 +661,11 @@ const QueryResultCellRenderer = observer(
648
661
 
649
662
  for (let x = minRow; x <= maxRow; x++) {
650
663
  for (let y = minCol; y <= maxCol; y++) {
651
- const actualValue = findResultValueFromCoordinates(
652
- x,
653
- findColumnNameFromColumnIndex(y) as string,
654
- );
664
+ const actualValue = findResultValueFromCoordinates([x, y]);
665
+
655
666
  const valueAndColumnId = {
656
667
  value: actualValue,
657
- columnName: findColumnNameFromColumnIndex(y),
668
+ columnName: findColumnFromCoordinates(y),
658
669
  coordinates: {
659
670
  rowIndex: x,
660
671
  colIndex: y,
@@ -673,6 +684,7 @@ const QueryResultCellRenderer = observer(
673
684
  }
674
685
  }
675
686
  }
687
+
676
688
  resultState.setMouseOverCell(resultState.selectedCells[0] ?? null);
677
689
  };
678
690
 
@@ -729,6 +741,20 @@ const QueryBuilderGridResult = observer(
729
741
 
730
742
  const resultState = queryBuilderState.resultState;
731
743
 
744
+ const rowData = executionResult.result.rows.map((_row, rowIdx) => {
745
+ const row: PlainObject = {};
746
+ const cols = executionResult.result.columns;
747
+ _row.values.forEach((value, colIdx) => {
748
+ // `ag-grid` shows `false` value as empty string so we have
749
+ // call `.toString()` to avoid this behavior.
750
+ // See https://github.com/finos/legend-studio/issues/1008
751
+ row[cols[colIdx] as string] = isBoolean(value) ? String(value) : value;
752
+ });
753
+
754
+ row.rowNumber = rowIdx;
755
+ return row;
756
+ });
757
+
732
758
  return (
733
759
  <div className="query-builder__result__values__table">
734
760
  <div
@@ -737,20 +763,7 @@ const QueryBuilderGridResult = observer(
737
763
  )}
738
764
  >
739
765
  <DataGrid
740
- rowData={queryBuilderState.resultState.getRowData()}
741
- onSortChanged={(params) => {
742
- const sortedData: Record<
743
- string,
744
- string | number | boolean | null
745
- >[] = [];
746
- params.api.forEachNodeAfterFilterAndSort((node, index) => {
747
- node.rowIndex = index;
748
- // rowNumber has to be manually updated after sorting the column
749
- node.data.rowNumber = index;
750
- sortedData.push(node.data);
751
- });
752
- queryBuilderState.resultState.setRowData(sortedData);
753
- }}
766
+ rowData={rowData}
754
767
  gridOptions={{
755
768
  suppressScrollOnNewData: true,
756
769
  getRowId: (data) => data.data.rowNumber,
@@ -32,14 +32,12 @@ import {
32
32
  MenuContentItem,
33
33
  ModalFooterButton,
34
34
  } from '@finos/legend-art';
35
- import {
36
- COLUMN_SORT_TYPE,
37
- SortColumnState,
38
- } from '../../stores/fetch-structure/tds/QueryResultSetModifierState.js';
35
+ import { SortColumnState } from '../../stores/fetch-structure/tds/QueryResultSetModifierState.js';
39
36
  import { guaranteeNonNullable } from '@finos/legend-shared';
40
37
  import { useApplicationStore } from '@finos/legend-application';
41
38
  import type { QueryBuilderTDSState } from '../../stores/fetch-structure/tds/QueryBuilderTDSState.js';
42
39
  import type { QueryBuilderTDSColumnState } from '../../stores/fetch-structure/tds/QueryBuilderTDSColumnState.js';
40
+ import { COLUMN_SORT_TYPE } from '../../graph/QueryBuilderMetaModelConst.js';
43
41
 
44
42
  const ColumnSortEditor = observer(
45
43
  (props: { tdsState: QueryBuilderTDSState; sortState: SortColumnState }) => {
@@ -66,9 +66,9 @@ import {
66
66
  import { QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE } from '../../stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.js';
67
67
  import type { QueryBuilderTDSColumnState } from '../../stores/fetch-structure/tds/QueryBuilderTDSColumnState.js';
68
68
  import type { QueryBuilderTDSState } from '../../stores/fetch-structure/tds/QueryBuilderTDSState.js';
69
- import { COLUMN_SORT_TYPE } from '../../stores/fetch-structure/tds/QueryResultSetModifierState.js';
70
69
  import { QUERY_BUILDER_TEST_ID } from '../../__lib__/QueryBuilderTesting.js';
71
70
  import { QueryBuilderPanelIssueCountBadge } from '../shared/QueryBuilderPanelIssueCountBadge.js';
71
+ import { COLUMN_SORT_TYPE } from '../../graph/QueryBuilderMetaModelConst.js';
72
72
 
73
73
  // helpers
74
74
  const createWindowColumnState = (
@@ -105,6 +105,7 @@ export enum QUERY_BUILDER_SUPPORTED_FUNCTIONS {
105
105
  TDS_GROUP_BY = 'meta::pure::tds::groupBy',
106
106
  TDS_SORT = 'meta::pure::tds::sort',
107
107
  TDS_TAKE = 'meta::pure::tds::take',
108
+ TDS_RESTRICT = 'meta::pure::tds::restrict',
108
109
  TDS_FUNC = 'meta::pure::tds::func',
109
110
 
110
111
  // filter
@@ -149,4 +150,28 @@ export enum QUERY_BUILDER_SUPPORTED_FUNCTIONS {
149
150
  FROM = 'meta::pure::mapping::from',
150
151
  CHECKED = 'meta::pure::dataQuality::checked',
151
152
  MERGERUNTIMES = 'meta::pure::runtime::mergeRuntimes',
153
+
154
+ // TOTDS
155
+ TABLE_TO_TDS = 'meta::pure::tds::tableToTDS',
156
+ TABLE_REFERENCE = 'meta::relational::functions::database::tableReference',
157
+ }
158
+
159
+ export enum TDS_COLUMN_GETTER {
160
+ GET_STRING = 'getString',
161
+ GET_NUMBER = 'getNumber',
162
+ GET_INTEGER = 'getInteger',
163
+ GET_FLOAT = 'getFloat',
164
+ GET_DECIMAL = 'getDecimal',
165
+ GET_DATE = 'getDate',
166
+ GET_DATETIME = 'getDateTime',
167
+ GET_STRICTDATE = 'getStrictDate',
168
+ GET_BOOLEAN = 'getBoolean',
169
+ GET_ENUM = 'getEnum',
170
+ IS_NULL = 'isNull',
171
+ IS_NOT_NULL = 'isNotNull',
172
+ }
173
+
174
+ export enum COLUMN_SORT_TYPE {
175
+ ASC = 'ASC',
176
+ DESC = 'DESC',
152
177
  }
package/src/index.ts CHANGED
@@ -29,7 +29,10 @@ export { QueryBuilderNavigationBlocker } from './components/QueryBuilderNavigati
29
29
  export { QueryBuilder } from './components/QueryBuilder.js';
30
30
  export { QUERY_BUILDER_COMPONENT_ELEMENT_ID } from './components/QueryBuilderComponentElement.js';
31
31
  export { QueryBuilderState } from './stores/QueryBuilderState.js';
32
-
32
+ export {
33
+ getTDSColumnDerivedProperyFromType,
34
+ buildTDSSortTypeExpression,
35
+ } from './stores/fetch-structure/tds/QueryBuilderTDSHelper.js';
33
36
  export { QueryBuilderPropertySearchState } from './stores/explorer/QueryBuilderPropertySearchState.js';
34
37
  export {
35
38
  QueryBuilderClassSelector,
@@ -43,7 +46,11 @@ export {
43
46
  type ServiceExecutionContext,
44
47
  ServiceQueryBuilderState,
45
48
  } from './stores/workflows/ServiceQueryBuilderState.js';
46
- export { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from './graph/QueryBuilderMetaModelConst.js';
49
+ export {
50
+ TDS_COLUMN_GETTER,
51
+ COLUMN_SORT_TYPE,
52
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS,
53
+ } from './graph/QueryBuilderMetaModelConst.js';
47
54
  export { getQueryBuilderGraphManagerExtension } from './graph-manager/protocol/pure/QueryBuilder_PureGraphManagerExtension.js';
48
55
  export type { ServiceExecutionAnalysisResult } from './graph-manager/action/analytics/ServiceExecutionAnalysis.js';
49
56
  export type { MappingRuntimeCompatibilityAnalysisResult } from './graph-manager/action/analytics/MappingRuntimeCompatibilityAnalysis.js';
@@ -29,12 +29,10 @@ import { QueryBuilderAggregateOperator_StdDev_Sample } from './fetch-structure/t
29
29
  import { QueryBuilderAggregateOperator_Sum } from './fetch-structure/tds/aggregation/operators/QueryBuilderAggregateOperator_Sum.js';
30
30
  import { QueryBuilderSimpleProjectionColumnState } from './fetch-structure/tds/projection/QueryBuilderProjectionColumnState.js';
31
31
  import type { QueryBuilderState } from './QueryBuilderState.js';
32
- import {
33
- COLUMN_SORT_TYPE,
34
- SortColumnState,
35
- } from './fetch-structure/tds/QueryResultSetModifierState.js';
32
+ import { SortColumnState } from './fetch-structure/tds/QueryResultSetModifierState.js';
36
33
  import type { QueryBuilderAggregateOperator } from './fetch-structure/tds/aggregation/QueryBuilderAggregateOperator.js';
37
34
  import { QueryBuilderTDSState } from './fetch-structure/tds/QueryBuilderTDSState.js';
35
+ import { COLUMN_SORT_TYPE } from '../graph/QueryBuilderMetaModelConst.js';
38
36
 
39
37
  const PREVIEW_DATA_TAKE_LIMIT = 10;
40
38
  const PREVIEW_DATA_NON_NUMERIC_VALUE_COLUMN_NAME = 'Value';
@@ -17,15 +17,14 @@
17
17
  import { action, flow, makeObservable, observable } from 'mobx';
18
18
  import {
19
19
  type GeneratorFn,
20
- type ContentType,
21
20
  assertErrorThrown,
22
21
  LogEvent,
23
22
  guaranteeNonNullable,
23
+ type ContentType,
24
24
  downloadFileUsingDataURI,
25
25
  ActionState,
26
26
  StopWatch,
27
27
  getContentTypeFileExtension,
28
- isBoolean,
29
28
  } from '@finos/legend-shared';
30
29
  import type { QueryBuilderState } from './QueryBuilderState.js';
31
30
  import {
@@ -38,7 +37,6 @@ import {
38
37
  buildRawLambdaFromLambdaFunction,
39
38
  reportGraphAnalytics,
40
39
  extractExecutionResultValues,
41
- TDSExecutionResult,
42
40
  } from '@finos/legend-graph';
43
41
  import { buildLambdaFunction } from './QueryBuilderValueSpecificationBuilder.js';
44
42
  import { DEFAULT_TAB_SIZE } from '@finos/legend-application';
@@ -83,7 +81,6 @@ export class QueryBuilderResultState {
83
81
  latestRunHashCode?: string | undefined;
84
82
  queryRunPromise: Promise<ExecutionResult> | undefined = undefined;
85
83
  isQueryUsageViewerOpened = false;
86
- rowData: Record<string, string | number | boolean | null>[] = [];
87
84
 
88
85
  selectedCells: QueryBuilderTDSResultCellData[];
89
86
  mousedOverCell: QueryBuilderTDSResultCellData | null = null;
@@ -113,8 +110,6 @@ export class QueryBuilderResultState {
113
110
  setQueryRunPromise: action,
114
111
  setIsQueryUsageViewerOpened: action,
115
112
  exportData: flow,
116
- getRowData: action,
117
- setRowData: action,
118
113
  runQuery: flow,
119
114
  cancelQuery: flow,
120
115
  generatePlan: flow,
@@ -129,36 +124,6 @@ export class QueryBuilderResultState {
129
124
  );
130
125
  }
131
126
 
132
- getRowData(): Record<string, string | number | boolean | null>[] {
133
- if (
134
- this.executionResult &&
135
- this.executionResult instanceof TDSExecutionResult
136
- ) {
137
- const data = this.executionResult.result.rows.map((_row, rowIdx) => {
138
- const row: Record<string, string | number | boolean | null> = {};
139
- const cols = (this.executionResult as TDSExecutionResult).result
140
- .columns;
141
- _row.values.forEach((value, colIdx) => {
142
- // `ag-grid` shows `false` value as empty string so we have
143
- // call `.toString()` to avoid this behavior.
144
- // See https://github.com/finos/legend-studio/issues/1008
145
- row[cols[colIdx] as string] = isBoolean(value)
146
- ? String(value)
147
- : value;
148
- });
149
- row.rowNumber = rowIdx;
150
- return row;
151
- });
152
- this.rowData = data;
153
- return data;
154
- }
155
- return [];
156
- }
157
-
158
- setRowData(val: Record<string, string | number | boolean | null>[]): void {
159
- this.rowData = val;
160
- }
161
-
162
127
  setIsSelectingCells(val: boolean): void {
163
128
  this.isSelectingCells = val;
164
129
  }
@@ -100,6 +100,7 @@ import {
100
100
  type QueryBuilderExecutionContextState,
101
101
  } from './QueryBuilderExecutionContextState.js';
102
102
  import type { QueryBuilderConfig } from '../graph-manager/QueryBuilderConfig.js';
103
+ import { QUERY_BUILDER_EVENT } from '../__lib__/QueryBuilderEvent.js';
103
104
 
104
105
  export abstract class QueryBuilderState implements CommandRegistrar {
105
106
  readonly applicationStore: GenericLegendApplicationStore;
@@ -555,6 +556,10 @@ export abstract class QueryBuilderState implements CommandRegistrar {
555
556
  this.fetchStructureState.initializeWithQuery();
556
557
  } catch (error) {
557
558
  assertErrorThrown(error);
559
+ this.applicationStore.logService.error(
560
+ LogEvent.create(QUERY_BUILDER_EVENT.UNSUPPORTED_QUERY_LAUNCH),
561
+ error,
562
+ );
558
563
  this.resetQueryResult({ preserveResult: options?.preserveResult });
559
564
  this.resetQueryContent();
560
565
  this.unsupportedQueryState.setLambdaError(error);
@@ -58,10 +58,6 @@ import {
58
58
  } from '@finos/legend-shared';
59
59
  import { QueryBuilderPostFilterOperator_StartWith } from './fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_StartWith.js';
60
60
  import type { QueryBuilderAggregateColumnState } from './fetch-structure/tds/aggregation/QueryBuilderAggregationState.js';
61
- import {
62
- getTDSColumnDerivedProperyFromType,
63
- type TDS_COLUMN_GETTER,
64
- } from './fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js';
65
61
  import {
66
62
  QueryBuilderDerivationProjectionColumnState,
67
63
  QueryBuilderProjectionColumnState,
@@ -75,6 +71,7 @@ import {
75
71
  import {
76
72
  QUERY_BUILDER_PURE_PATH,
77
73
  QUERY_BUILDER_SUPPORTED_FUNCTIONS,
74
+ type TDS_COLUMN_GETTER,
78
75
  } from '../graph/QueryBuilderMetaModelConst.js';
79
76
  import {
80
77
  functionExpression_setParametersValues,
@@ -89,6 +86,7 @@ import {
89
86
  DEFAULT_POST_FILTER_LAMBDA_VARIABLE_NAME,
90
87
  } from './QueryBuilderConfig.js';
91
88
  import type { QueryBuilderAggregateOperator } from './fetch-structure/tds/aggregation/QueryBuilderAggregateOperator.js';
89
+ import { getTDSColumnDerivedProperyFromType } from './fetch-structure/tds/QueryBuilderTDSHelper.js';
92
90
 
93
91
  const buildPropertyExpressionChainWithDefaultMilestoningDates = (
94
92
  propertyExpression: AbstractPropertyExpression,
@@ -15,6 +15,11 @@
15
15
  */
16
16
 
17
17
  import {
18
+ type Type,
19
+ Enumeration,
20
+ PRIMITIVE_TYPE,
21
+ SimpleFunctionExpression,
22
+ createPrimitiveInstance_String,
18
23
  extractElementNameFromPath,
19
24
  matchFunctionName,
20
25
  } from '@finos/legend-graph';
@@ -22,10 +27,13 @@ import {
22
27
  guaranteeNonNullable,
23
28
  UnsupportedOperationError,
24
29
  } from '@finos/legend-shared';
25
- import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../../../graph/QueryBuilderMetaModelConst.js';
30
+ import {
31
+ COLUMN_SORT_TYPE,
32
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS,
33
+ TDS_COLUMN_GETTER,
34
+ } from '../../../graph/QueryBuilderMetaModelConst.js';
26
35
  import type { QueryBuilderTDSState } from './QueryBuilderTDSState.js';
27
36
  import type { QueryBuilderTDSColumnState } from './QueryBuilderTDSColumnState.js';
28
- import { COLUMN_SORT_TYPE } from './QueryResultSetModifierState.js';
29
37
 
30
38
  export const findTDSColumnState = (
31
39
  projectionState: QueryBuilderTDSState,
@@ -77,3 +85,51 @@ export const getFunctionNameFromTDSSortColumn = (
77
85
  );
78
86
  }
79
87
  };
88
+
89
+ export const buildTDSSortTypeExpression = (
90
+ sortType: COLUMN_SORT_TYPE,
91
+ column: string,
92
+ ): SimpleFunctionExpression => {
93
+ const sortColumnFunction = new SimpleFunctionExpression(
94
+ extractElementNameFromPath(
95
+ sortType === COLUMN_SORT_TYPE.ASC
96
+ ? QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_ASC
97
+ : QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_DESC,
98
+ ),
99
+ );
100
+ const sortColumnName = createPrimitiveInstance_String(column);
101
+ sortColumnFunction.parametersValues[0] = sortColumnName;
102
+ return sortColumnFunction;
103
+ };
104
+
105
+ export const getTDSColumnDerivedProperyFromType = (
106
+ type: Type,
107
+ ): TDS_COLUMN_GETTER => {
108
+ if (type instanceof Enumeration) {
109
+ return TDS_COLUMN_GETTER.GET_ENUM;
110
+ }
111
+ switch (type.path) {
112
+ case PRIMITIVE_TYPE.STRING:
113
+ return TDS_COLUMN_GETTER.GET_STRING;
114
+ case PRIMITIVE_TYPE.NUMBER:
115
+ return TDS_COLUMN_GETTER.GET_NUMBER;
116
+ case PRIMITIVE_TYPE.INTEGER:
117
+ return TDS_COLUMN_GETTER.GET_INTEGER;
118
+ case PRIMITIVE_TYPE.FLOAT:
119
+ return TDS_COLUMN_GETTER.GET_FLOAT;
120
+ case PRIMITIVE_TYPE.DECIMAL:
121
+ return TDS_COLUMN_GETTER.GET_DECIMAL;
122
+ case PRIMITIVE_TYPE.DATE:
123
+ return TDS_COLUMN_GETTER.GET_DATE;
124
+ case PRIMITIVE_TYPE.DATETIME:
125
+ return TDS_COLUMN_GETTER.GET_DATETIME;
126
+ case PRIMITIVE_TYPE.STRICTDATE:
127
+ return TDS_COLUMN_GETTER.GET_STRICTDATE;
128
+ case PRIMITIVE_TYPE.BOOLEAN:
129
+ return TDS_COLUMN_GETTER.GET_BOOLEAN;
130
+ default:
131
+ throw new UnsupportedOperationError(
132
+ `Can't find TDS column derived property name for type: '${type.path}'`,
133
+ );
134
+ }
135
+ };
@@ -24,11 +24,7 @@ import {
24
24
  } from '@finos/legend-shared';
25
25
  import { QUERY_BUILDER_STATE_HASH_STRUCTURE } from '../../QueryBuilderStateHashUtils.js';
26
26
  import type { QueryBuilderTDSColumnState } from './QueryBuilderTDSColumnState.js';
27
-
28
- export enum COLUMN_SORT_TYPE {
29
- ASC = 'ASC',
30
- DESC = 'DESC',
31
- }
27
+ import { COLUMN_SORT_TYPE } from '../../../graph/QueryBuilderMetaModelConst.js';
32
28
 
33
29
  export class SortColumnState implements Hashable {
34
30
  columnState: QueryBuilderTDSColumnState;
@@ -14,11 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import {
18
- uuid,
19
- guaranteeNonNullable,
20
- type Hashable,
21
- } from '@finos/legend-shared';
17
+ import { uuid, type Hashable } from '@finos/legend-shared';
22
18
  import type {
23
19
  AbstractPropertyExpression,
24
20
  PureModel,
@@ -82,10 +78,10 @@ export abstract class QueryBuilderAggregateOperator implements Hashable {
82
78
  * Returns the expected return type of the operator.
83
79
  * defaults to using the return type of the projection column state which is being aggregated.
84
80
  */
85
- getReturnType(aggregateColumnState: QueryBuilderAggregateColumnState): Type {
86
- return guaranteeNonNullable(
87
- aggregateColumnState.projectionColumnState.getColumnType(),
88
- );
81
+ getReturnType(
82
+ aggregateColumnState: QueryBuilderAggregateColumnState,
83
+ ): Type | undefined {
84
+ return aggregateColumnState.projectionColumnState.getColumnType();
89
85
  }
90
86
 
91
87
  abstract get hashCode(): string;
@@ -25,7 +25,10 @@ import type { Type } from '@finos/legend-graph';
25
25
  import { DEFAULT_LAMBDA_VARIABLE_NAME } from '../../../QueryBuilderConfig.js';
26
26
  import type { QueryBuilderTDSState } from '../QueryBuilderTDSState.js';
27
27
  import type { QueryBuilderAggregateOperator } from './QueryBuilderAggregateOperator.js';
28
- import type { QueryBuilderProjectionColumnState } from '../projection/QueryBuilderProjectionColumnState.js';
28
+ import {
29
+ QueryBuilderDerivationProjectionColumnState,
30
+ type QueryBuilderProjectionColumnState,
31
+ } from '../projection/QueryBuilderProjectionColumnState.js';
29
32
  import { QUERY_BUILDER_STATE_HASH_STRUCTURE } from '../../../QueryBuilderStateHashUtils.js';
30
33
  import { QueryBuilderTDSColumnState } from '../QueryBuilderTDSColumnState.js';
31
34
  import type { QueryBuilderAggregateCalendarFunction } from './QueryBuilderAggregateCalendarFunction.js';
@@ -58,6 +61,7 @@ export class QueryBuilderAggregateColumnState
58
61
  setLambdaParameterName: action,
59
62
  setOperator: action,
60
63
  setCalendarFunction: action,
64
+ handleUsedPostFilterType: action,
61
65
  hashCode: computed,
62
66
  });
63
67
 
@@ -88,10 +92,20 @@ export class QueryBuilderAggregateColumnState
88
92
  this.operator = val;
89
93
  }
90
94
 
91
- getColumnType(): Type {
95
+ getColumnType(): Type | undefined {
92
96
  return this.operator.getReturnType(this);
93
97
  }
94
98
 
99
+ handleUsedPostFilterType(type: Type): void {
100
+ if (
101
+ this.getColumnType() === undefined &&
102
+ this.projectionColumnState instanceof
103
+ QueryBuilderDerivationProjectionColumnState
104
+ ) {
105
+ this.projectionColumnState.setReturnType(type);
106
+ }
107
+ }
108
+
95
109
  get hashCode(): string {
96
110
  return hashArray([
97
111
  QUERY_BUILDER_STATE_HASH_STRUCTURE.AGGREGATE_COLUMN_STATE,