@finos/legend-query-builder 3.0.2 → 3.0.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
}
|