@finos/legend-query-builder 3.0.1 → 3.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. package/lib/components/QueryBuilderResultPanel.d.ts.map +1 -1
  2. package/lib/components/QueryBuilderResultPanel.js +6 -14
  3. package/lib/components/QueryBuilderResultPanel.js.map +1 -1
  4. package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.d.ts.map +1 -1
  5. package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.js +3 -1
  6. package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.js.map +1 -1
  7. package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.d.ts.map +1 -1
  8. package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js +2 -1
  9. package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js.map +1 -1
  10. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.d.ts.map +1 -1
  11. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js +8 -2
  12. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js.map +1 -1
  13. package/lib/index.css +1 -1
  14. package/lib/package.json +1 -1
  15. package/lib/stores/QueryBuilderState.d.ts +1 -1
  16. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  17. package/lib/stores/QueryBuilderState.js +3 -3
  18. package/lib/stores/QueryBuilderState.js.map +1 -1
  19. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts +2 -1
  20. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts.map +1 -1
  21. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.js +2 -1
  22. package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.js.map +1 -1
  23. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts +9 -7
  24. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts.map +1 -1
  25. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js +15 -9
  26. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js.map +1 -1
  27. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeValueSpecificationBuilder.js +1 -1
  28. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeValueSpecificationBuilder.js.map +1 -1
  29. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts +2 -1
  30. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts.map +1 -1
  31. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js +9 -2
  32. package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js.map +1 -1
  33. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.d.ts +8 -1
  34. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.d.ts.map +1 -1
  35. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.js +36 -4
  36. package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.js.map +1 -1
  37. package/package.json +5 -5
  38. package/src/components/QueryBuilderResultPanel.tsx +7 -15
  39. package/src/components/fetch-structure/QueryBuilderFetchStructurePanel.tsx +9 -3
  40. package/src/components/fetch-structure/QueryBuilderGraphFetchTreePanel.tsx +2 -4
  41. package/src/components/fetch-structure/QueryBuilderTDSWindowPanel.tsx +16 -4
  42. package/src/stores/QueryBuilderState.ts +3 -3
  43. package/src/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.ts +4 -2
  44. package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.ts +23 -15
  45. package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeValueSpecificationBuilder.ts +1 -1
  46. package/src/stores/fetch-structure/tds/QueryBuilderTDSState.ts +11 -2
  47. package/src/stores/fetch-structure/tds/window/QueryBuilderWindowState.ts +53 -4
@@ -693,6 +693,12 @@ const QueryBuilderWindowColumnEditor = observer(
693
693
  const isDuplicatedColumnName =
694
694
  tdsState.isDuplicateColumn(windowColumnState);
695
695
 
696
+ const isInvalidColumnName = windowState.invalidWindowColumnNames.some(
697
+ (col) =>
698
+ col.invalidColumnName === windowColumnState.columnName ||
699
+ col.missingColumnName === windowColumnState.columnName,
700
+ );
701
+
696
702
  // window columns
697
703
  const windowOptions = windowColumnState.possibleReferencedColumns;
698
704
  const addWindowOptions = windowOptions.filter(
@@ -1082,7 +1088,11 @@ const QueryBuilderWindowColumnEditor = observer(
1082
1088
  value={windowColumnState.columnName}
1083
1089
  onChange={changeColumnName}
1084
1090
  validationErrorMessage={
1085
- isDuplicatedColumnName ? 'Duplicated column' : undefined
1091
+ isDuplicatedColumnName
1092
+ ? 'Duplicated column'
1093
+ : isInvalidColumnName
1094
+ ? 'Invalid column order'
1095
+ : undefined
1086
1096
  }
1087
1097
  />
1088
1098
  </div>
@@ -1175,9 +1185,11 @@ export const QueryBuilderTDSWindowPanel = observer(
1175
1185
  <div className="panel__header">
1176
1186
  <div className="panel__header__title">
1177
1187
  <div className="panel__header__title__label">Window Function</div>
1178
- <QueryBuilderPanelIssueCountBadge
1179
- issues={tdsWindowState.validationIssues}
1180
- />
1188
+ {tdsWindowState.windowValidationIssues.length && (
1189
+ <QueryBuilderPanelIssueCountBadge
1190
+ issues={tdsWindowState.windowValidationIssues}
1191
+ />
1192
+ )}
1181
1193
  </div>
1182
1194
  <div className="panel__header__actions">
1183
1195
  <button
@@ -145,7 +145,7 @@ export abstract class QueryBuilderState implements CommandRegistrar {
145
145
 
146
146
  sideBarClassName: computed,
147
147
  isQuerySupported: computed,
148
- validationIssues: computed,
148
+ allValidationIssues: computed,
149
149
 
150
150
  setShowFunctionsExplorerPanel: action,
151
151
  setShowParametersPanel: action,
@@ -554,8 +554,8 @@ export abstract class QueryBuilderState implements CommandRegistrar {
554
554
  }
555
555
  }
556
556
 
557
- get validationIssues(): string[] | undefined {
558
- return this.fetchStructureState.implementation.validationIssues;
557
+ get allValidationIssues(): string[] {
558
+ return this.fetchStructureState.implementation.allValidationIssues;
559
559
  }
560
560
 
561
561
  /**
@@ -45,7 +45,8 @@ export abstract class QueryBuilderFetchStructureImplementationState
45
45
  ) {
46
46
  makeObservable(this, {
47
47
  usedExplorerTreePropertyNodeIDs: computed,
48
- validationIssues: computed,
48
+ fetchStructureValidationIssues: computed,
49
+ allValidationIssues: computed,
49
50
  hashCode: computed,
50
51
  });
51
52
 
@@ -55,7 +56,8 @@ export abstract class QueryBuilderFetchStructureImplementationState
55
56
 
56
57
  abstract get type(): string;
57
58
  abstract get usedExplorerTreePropertyNodeIDs(): string[];
58
- abstract get validationIssues(): string[] | undefined;
59
+ abstract get fetchStructureValidationIssues(): string[];
60
+ abstract get allValidationIssues(): string[];
59
61
 
60
62
  abstract onClassChange(_class: Class | undefined): void;
61
63
  abstract revealCompilationError(compilationError: CompilationError): boolean;
@@ -72,22 +72,15 @@ const DEFAULT_PURE_CONFIG_TYPE_NAME = '@type';
72
72
 
73
73
  export class PureSerializationConfig {
74
74
  typeKeyName: string;
75
- includeType: boolean;
76
- includeEnumType: boolean;
77
- removePropertiesWithNullValues: boolean;
78
- removePropertiesWithEmptySets: boolean;
79
- fullyQualifiedTypePath: boolean;
80
- includeObjectReference: boolean;
75
+ includeType: boolean | undefined;
76
+ includeEnumType: boolean | undefined;
77
+ removePropertiesWithNullValues: boolean | undefined;
78
+ removePropertiesWithEmptySets: boolean | undefined;
79
+ fullyQualifiedTypePath: boolean | undefined;
80
+ includeObjectReference: boolean | undefined;
81
81
 
82
82
  constructor() {
83
- // default values
84
83
  this.typeKeyName = DEFAULT_PURE_CONFIG_TYPE_NAME;
85
- this.includeType = true;
86
- this.includeEnumType = true;
87
- this.removePropertiesWithNullValues = true;
88
- this.removePropertiesWithEmptySets = false;
89
- this.fullyQualifiedTypePath = true;
90
- this.includeObjectReference = false;
91
84
  makeObservable(this, {
92
85
  typeKeyName: observable,
93
86
  includeType: observable,
@@ -106,6 +99,17 @@ export class PureSerializationConfig {
106
99
  });
107
100
  }
108
101
 
102
+ static createDefault(): PureSerializationConfig {
103
+ const config = new PureSerializationConfig();
104
+ config.typeKeyName = DEFAULT_PURE_CONFIG_TYPE_NAME;
105
+ config.includeType = true;
106
+ config.includeEnumType = true;
107
+ config.removePropertiesWithNullValues = true;
108
+ config.removePropertiesWithEmptySets = false;
109
+ config.fullyQualifiedTypePath = true;
110
+ return config;
111
+ }
112
+
109
113
  setTypeName(val: string): void {
110
114
  this.typeKeyName = val;
111
115
  }
@@ -343,8 +347,12 @@ export class QueryBuilderGraphFetchTreeState
343
347
  return Array.from(new Set(ids).values());
344
348
  }
345
349
 
346
- get validationIssues(): string[] | undefined {
347
- return undefined;
350
+ get fetchStructureValidationIssues(): string[] {
351
+ return [];
352
+ }
353
+
354
+ get allValidationIssues(): string[] {
355
+ return [];
348
356
  }
349
357
 
350
358
  override initialize(): void {
@@ -122,7 +122,7 @@ export const buildPureSerializationConfig = (
122
122
  const property = Object.getOwnPropertyNames(config).find(
123
123
  (p) => p === classProperty.name,
124
124
  );
125
- if (property) {
125
+ if (property && config[property] !== undefined) {
126
126
  const keyExpressionInstance = new KeyExpressionInstanceValue();
127
127
  // key expression
128
128
  const keyInstance = new PrimitiveInstanceValue(
@@ -267,7 +267,7 @@ export class QueryBuilderTDSState
267
267
  return Array.from(new Set(nodeIDs).values());
268
268
  }
269
269
 
270
- get validationIssues(): string[] | undefined {
270
+ get fetchStructureValidationIssues(): string[] {
271
271
  const hasDuplicatedProjectionColumns = this.projectionColumns.some(
272
272
  (column) =>
273
273
  this.projectionColumns.filter((c) => c.columnName === column.columnName)
@@ -280,7 +280,16 @@ export class QueryBuilderTDSState
280
280
  if (hasNoProjectionColumns) {
281
281
  return ['Query has no projection columns'];
282
282
  }
283
- return undefined;
283
+ return [];
284
+ }
285
+
286
+ get allValidationIssues(): string[] {
287
+ const fetchStructureValidationIssues = [
288
+ ...this.fetchStructureValidationIssues,
289
+ ...this.windowState.windowValidationIssues,
290
+ ];
291
+
292
+ return fetchStructureValidationIssues;
284
293
  }
285
294
 
286
295
  get tdsColumns(): QueryBuilderTDSColumnState[] {
@@ -38,6 +38,11 @@ export interface QueryBuilderWindowColumnDragSource {
38
38
  columnState: QueryBuilderTDSColumnState;
39
39
  }
40
40
 
41
+ interface QueryBuilderInvalidWindowColumnName {
42
+ invalidColumnName: string;
43
+ missingColumnName: string;
44
+ }
45
+
41
46
  export type QueryBuilderWindowDropTarget =
42
47
  | QueryBuilderProjectionColumnDragSource
43
48
  | QueryBuilderWindowColumnDragSource;
@@ -333,7 +338,8 @@ export class QueryBuilderWindowState implements Hashable {
333
338
  makeObservable(this, {
334
339
  windowColumns: observable,
335
340
  editColumn: observable,
336
- validationIssues: computed,
341
+ invalidWindowColumnNames: computed,
342
+ windowValidationIssues: computed,
337
343
  addWindowColumn: action,
338
344
  removeColumn: action,
339
345
  moveColumn: action,
@@ -347,16 +353,53 @@ export class QueryBuilderWindowState implements Hashable {
347
353
  return !this.windowColumns.length;
348
354
  }
349
355
 
350
- get validationIssues(): string[] | undefined {
356
+ get invalidWindowColumnNames(): QueryBuilderInvalidWindowColumnName[] {
357
+ const invalidColNames: QueryBuilderInvalidWindowColumnName[] = [];
358
+ const windowCols = this.windowColumns;
359
+ windowCols.forEach((item, index) => {
360
+ if (
361
+ item.operationState instanceof
362
+ QueryBuilderTDS_WindowAggreationOperatorState
363
+ ) {
364
+ if (
365
+ item.operationState.columnState instanceof
366
+ QueryBuilderWindowColumnState
367
+ ) {
368
+ const windowColumnName = item.operationState.columnState.columnName;
369
+ const hasExistingColumn = item.windowState.isColumnOrderValid(
370
+ windowColumnName,
371
+ index,
372
+ );
373
+ if (!hasExistingColumn) {
374
+ invalidColNames.push({
375
+ invalidColumnName: item.columnName,
376
+ missingColumnName: windowColumnName,
377
+ });
378
+ }
379
+ }
380
+ }
381
+ });
382
+ return invalidColNames;
383
+ }
384
+
385
+ get windowValidationIssues(): string[] {
386
+ const invalidWindowColumnNames = this.invalidWindowColumnNames;
387
+ const issues = [];
388
+ invalidWindowColumnNames.forEach((item) => {
389
+ issues.push(
390
+ `Column '${item.invalidColumnName}' cannot exist before column name '${item.missingColumnName}'`,
391
+ );
392
+ });
393
+
351
394
  const hasDuplicatedWindowColumns = this.windowColumns.some(
352
395
  (column) =>
353
396
  this.windowColumns.filter((c) => c.columnName === column.columnName)
354
397
  .length > 1,
355
398
  );
356
399
  if (hasDuplicatedWindowColumns) {
357
- return ['Query has duplicated window columns'];
400
+ issues.push(`Query has duplicated window columns`);
358
401
  }
359
- return undefined;
402
+ return issues;
360
403
  }
361
404
 
362
405
  get referencedTDSColumns(): QueryBuilderTDSColumnState[] {
@@ -388,6 +431,12 @@ export class QueryBuilderWindowState implements Hashable {
388
431
  }
389
432
  }
390
433
 
434
+ isColumnOrderValid(columnName: string, indexRange: number): boolean {
435
+ return this.windowColumns
436
+ .slice(0, indexRange)
437
+ .some((col) => col.columnName === columnName);
438
+ }
439
+
391
440
  get hashCode(): string {
392
441
  return hashArray([
393
442
  QUERY_BUILDER_STATE_HASH_STRUCTURE.TDS_WINDOW_GROUPBY_STATE,