@finos/legend-query-builder 3.0.2 → 3.0.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.
- package/lib/components/QueryBuilderResultPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderResultPanel.js +6 -14
- package/lib/components/QueryBuilderResultPanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.js +3 -1
- package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js +2 -1
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js +8 -2
- package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js.map +1 -1
- package/lib/index.css +16 -0
- package/lib/package.json +1 -1
- package/lib/stores/QueryBuilderPropertyEditorState.js +6 -6
- package/lib/stores/QueryBuilderPropertyEditorState.js.map +1 -1
- package/lib/stores/QueryBuilderState.d.ts +1 -1
- package/lib/stores/QueryBuilderState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderState.js +3 -3
- package/lib/stores/QueryBuilderState.js.map +1 -1
- package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.d.ts.map +1 -1
- package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.js +3 -3
- package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.js.map +1 -1
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts +2 -1
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.js +2 -1
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.js.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts +9 -7
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js +15 -9
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeValueSpecificationBuilder.js +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeValueSpecificationBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts +2 -1
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js +9 -2
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js +2 -2
- package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.d.ts +8 -1
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.js +36 -4
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.js.map +1 -1
- package/lib/stores/filter/QueryBuilderFilterState.js +2 -2
- package/lib/stores/filter/QueryBuilderFilterState.js.map +1 -1
- package/lib/stores/workflows/ClassQueryBuilderState.js +3 -3
- package/lib/stores/workflows/ClassQueryBuilderState.js.map +1 -1
- package/lib/stores/workflows/MappingQueryBuilderState.js +3 -3
- package/lib/stores/workflows/MappingQueryBuilderState.js.map +1 -1
- package/lib/stores/workflows/ServiceQueryBuilderState.js +2 -2
- package/lib/stores/workflows/ServiceQueryBuilderState.js.map +1 -1
- package/package.json +9 -9
- package/src/components/QueryBuilderResultPanel.tsx +7 -15
- package/src/components/fetch-structure/QueryBuilderFetchStructurePanel.tsx +9 -3
- package/src/components/fetch-structure/QueryBuilderGraphFetchTreePanel.tsx +2 -4
- package/src/components/fetch-structure/QueryBuilderTDSWindowPanel.tsx +16 -4
- package/src/stores/QueryBuilderPropertyEditorState.ts +6 -6
- package/src/stores/QueryBuilderState.ts +3 -3
- package/src/stores/QueryBuilderValueSpecificationBuilderHelper.ts +3 -5
- package/src/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.ts +4 -2
- package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.ts +23 -15
- package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeValueSpecificationBuilder.ts +1 -1
- package/src/stores/fetch-structure/tds/QueryBuilderTDSState.ts +11 -2
- package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.ts +2 -2
- package/src/stores/fetch-structure/tds/window/QueryBuilderWindowState.ts +53 -4
- package/src/stores/filter/QueryBuilderFilterState.ts +2 -2
- package/src/stores/workflows/ClassQueryBuilderState.ts +3 -3
- package/src/stores/workflows/MappingQueryBuilderState.ts +3 -3
- package/src/stores/workflows/ServiceQueryBuilderState.ts +2 -2
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
400
|
+
issues.push(`Query has duplicated window columns`);
|
|
358
401
|
}
|
|
359
|
-
return
|
|
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,
|
|
@@ -19,7 +19,7 @@ import type { TreeNodeData, TreeData } from '@finos/legend-art';
|
|
|
19
19
|
import {
|
|
20
20
|
type GeneratorFn,
|
|
21
21
|
assertTrue,
|
|
22
|
-
|
|
22
|
+
getNullableFirstEntry,
|
|
23
23
|
guaranteeNonNullable,
|
|
24
24
|
guaranteeType,
|
|
25
25
|
IllegalStateError,
|
|
@@ -456,7 +456,7 @@ export class QueryBuilderFilterState
|
|
|
456
456
|
this.rootIds.length < 2,
|
|
457
457
|
'Query builder filter tree cannot have more than 1 root',
|
|
458
458
|
);
|
|
459
|
-
const rootId =
|
|
459
|
+
const rootId = getNullableFirstEntry(this.rootIds);
|
|
460
460
|
return rootId ? this.getNode(rootId) : undefined;
|
|
461
461
|
}
|
|
462
462
|
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
RuntimePointer,
|
|
23
23
|
PackageableElementExplicitReference,
|
|
24
24
|
} from '@finos/legend-graph';
|
|
25
|
-
import {
|
|
25
|
+
import { getNullableFirstEntry } from '@finos/legend-shared';
|
|
26
26
|
import type React from 'react';
|
|
27
27
|
import { renderClassQueryBuilderSetupPanelContent } from '../../components/workflows/ClassQueryBuilder.js';
|
|
28
28
|
import { QueryBuilderState } from '../QueryBuilderState.js';
|
|
@@ -49,7 +49,7 @@ export class ClassQueryBuilderState extends QueryBuilderState {
|
|
|
49
49
|
return;
|
|
50
50
|
}
|
|
51
51
|
// try to select the first compatible mapping
|
|
52
|
-
const possibleNewMapping =
|
|
52
|
+
const possibleNewMapping = getNullableFirstEntry(compatibleMappings);
|
|
53
53
|
if (possibleNewMapping) {
|
|
54
54
|
this.changeMapping(possibleNewMapping);
|
|
55
55
|
this.propagateMappingChange(possibleNewMapping);
|
|
@@ -68,7 +68,7 @@ export class ClassQueryBuilderState extends QueryBuilderState {
|
|
|
68
68
|
mapping,
|
|
69
69
|
this.graphManagerState.usableRuntimes,
|
|
70
70
|
);
|
|
71
|
-
const possibleNewRuntime =
|
|
71
|
+
const possibleNewRuntime = getNullableFirstEntry(compatibleRuntimes);
|
|
72
72
|
if (possibleNewRuntime) {
|
|
73
73
|
this.changeRuntime(
|
|
74
74
|
new RuntimePointer(
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
PackageableElementExplicitReference,
|
|
25
25
|
getMappingCompatibleClasses,
|
|
26
26
|
} from '@finos/legend-graph';
|
|
27
|
-
import {
|
|
27
|
+
import { getNullableFirstEntry } from '@finos/legend-shared';
|
|
28
28
|
import { renderMappingQueryBuilderSetupPanelContent } from '../../components/workflows/MappingQueryBuilder.js';
|
|
29
29
|
import { QueryBuilderState } from '../QueryBuilderState.js';
|
|
30
30
|
|
|
@@ -61,7 +61,7 @@ export class MappingQueryBuilderState extends QueryBuilderState {
|
|
|
61
61
|
mapping,
|
|
62
62
|
this.graphManagerState.usableRuntimes,
|
|
63
63
|
);
|
|
64
|
-
const possibleNewRuntime =
|
|
64
|
+
const possibleNewRuntime = getNullableFirstEntry(compatibleRuntimes);
|
|
65
65
|
if (possibleNewRuntime) {
|
|
66
66
|
this.changeRuntime(
|
|
67
67
|
new RuntimePointer(
|
|
@@ -77,7 +77,7 @@ export class MappingQueryBuilderState extends QueryBuilderState {
|
|
|
77
77
|
// if there is no chosen class or the chosen one is not compatible
|
|
78
78
|
// with the mapping then pick a compatible class if possible
|
|
79
79
|
if (!this.class || !compatibleClasses.includes(this.class)) {
|
|
80
|
-
const possibleNewClass =
|
|
80
|
+
const possibleNewClass = getNullableFirstEntry(compatibleClasses);
|
|
81
81
|
if (possibleNewClass) {
|
|
82
82
|
this.changeClass(possibleNewClass);
|
|
83
83
|
}
|
|
@@ -26,7 +26,7 @@ import {
|
|
|
26
26
|
} from '@finos/legend-graph';
|
|
27
27
|
import {
|
|
28
28
|
assertTrue,
|
|
29
|
-
|
|
29
|
+
getNullableFirstEntry,
|
|
30
30
|
guaranteeNonNullable,
|
|
31
31
|
IllegalStateError,
|
|
32
32
|
} from '@finos/legend-shared';
|
|
@@ -159,7 +159,7 @@ export class ServiceQueryBuilderState extends QueryBuilderState {
|
|
|
159
159
|
// if there is no chosen class or the chosen one is not compatible
|
|
160
160
|
// with the mapping then pick a compatible class if possible
|
|
161
161
|
if (!this.class || !compatibleClasses.includes(this.class)) {
|
|
162
|
-
const possibleNewClass =
|
|
162
|
+
const possibleNewClass = getNullableFirstEntry(compatibleClasses);
|
|
163
163
|
if (possibleNewClass) {
|
|
164
164
|
this.changeClass(possibleNewClass);
|
|
165
165
|
}
|