@finos/legend-query-builder 4.14.30 → 4.14.31
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/components/QueryBuilder.d.ts +1 -1
- package/lib/components/QueryBuilder.d.ts.map +1 -1
- package/lib/components/QueryBuilder.js +36 -3
- package/lib/components/QueryBuilder.js.map +1 -1
- package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.js +1 -1
- package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.js +5 -10
- package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.js.map +1 -1
- package/lib/graph/QueryBuilderMetaModelConst.d.ts +3 -0
- package/lib/graph/QueryBuilderMetaModelConst.d.ts.map +1 -1
- package/lib/graph/QueryBuilderMetaModelConst.js +5 -0
- package/lib/graph/QueryBuilderMetaModelConst.js.map +1 -1
- package/lib/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.js +4 -1
- package/lib/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.js.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.d.ts +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.js +51 -3
- package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.js.map +1 -1
- package/lib/index.css +17 -1
- package/lib/index.css.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/package.json +1 -1
- package/lib/stores/QueryBuilderResultState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderResultState.js +1 -0
- package/lib/stores/QueryBuilderResultState.js.map +1 -1
- package/lib/stores/QueryBuilderState.d.ts +4 -1
- package/lib/stores/QueryBuilderState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderState.js +12 -1
- package/lib/stores/QueryBuilderState.js.map +1 -1
- package/lib/stores/QueryBuilderStateBuilder.d.ts +2 -1
- package/lib/stores/QueryBuilderStateBuilder.d.ts.map +1 -1
- package/lib/stores/QueryBuilderStateBuilder.js +33 -4
- package/lib/stores/QueryBuilderStateBuilder.js.map +1 -1
- package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.d.ts +5 -0
- package/lib/stores/QueryBuilderValueSpecificationBuilderHelper.d.ts.map +1 -1
- package/lib/stores/__test-utils__/QueryBuilderStateTestUtils.js +1 -1
- package/lib/stores/__test-utils__/QueryBuilderStateTestUtils.js.map +1 -1
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts +1 -0
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.js.map +1 -1
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.d.ts +2 -1
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.js +7 -0
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.js.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts +1 -0
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js +4 -0
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js.map +1 -1
- package/lib/stores/fetch-structure/tds/QueryBuilderAdvancedWorkflowState.d.ts +2 -0
- package/lib/stores/fetch-structure/tds/QueryBuilderAdvancedWorkflowState.d.ts.map +1 -0
- package/lib/stores/fetch-structure/tds/QueryBuilderAdvancedWorkflowState.js +2 -0
- package/lib/stores/fetch-structure/tds/QueryBuilderAdvancedWorkflowState.js.map +1 -0
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js +4 -0
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.d.ts +4 -3
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.js +35 -3
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.d.ts +2 -9
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js +45 -36
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js.map +1 -1
- package/{src/stores/workflow/QueryBuilderWorkFlowState.ts → lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuidler.d.ts} +5 -12
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuidler.d.ts.map +1 -0
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuidler.js +55 -0
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuidler.js.map +1 -0
- package/lib/stores/{workflow → query-workflow}/QueryBuilderWorkFlowState.d.ts +12 -0
- package/lib/stores/query-workflow/QueryBuilderWorkFlowState.d.ts.map +1 -0
- package/lib/stores/{workflow → query-workflow}/QueryBuilderWorkFlowState.js +18 -0
- package/lib/stores/query-workflow/QueryBuilderWorkFlowState.js.map +1 -0
- package/lib/stores/workflows/FunctionQueryBuilderState.d.ts +1 -1
- package/lib/stores/workflows/FunctionQueryBuilderState.d.ts.map +1 -1
- package/lib/stores/workflows/MappingQueryBuilderState.d.ts +1 -1
- package/lib/stores/workflows/MappingQueryBuilderState.d.ts.map +1 -1
- package/lib/stores/workflows/ServiceQueryBuilderState.d.ts +1 -1
- package/lib/stores/workflows/ServiceQueryBuilderState.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/components/QueryBuilder.tsx +77 -2
- package/src/components/__test-utils__/QueryBuilderComponentTestUtils.tsx +1 -1
- package/src/components/fetch-structure/QueryBuilderFetchStructurePanel.tsx +29 -29
- package/src/graph/QueryBuilderMetaModelConst.ts +7 -0
- package/src/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.ts +3 -3
- package/src/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.ts +122 -1
- package/src/index.ts +1 -1
- package/src/stores/QueryBuilderResultState.ts +1 -0
- package/src/stores/QueryBuilderState.ts +17 -1
- package/src/stores/QueryBuilderStateBuilder.ts +65 -5
- package/src/stores/QueryBuilderValueSpecificationBuilderHelper.ts +5 -0
- package/src/stores/__test-utils__/QueryBuilderStateTestUtils.ts +1 -1
- package/src/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.ts +1 -0
- package/src/stores/fetch-structure/QueryBuilderFetchStructureState.ts +15 -0
- package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.ts +5 -0
- package/src/stores/fetch-structure/tds/QueryBuilderAdvancedWorkflowState.ts +0 -0
- package/src/stores/fetch-structure/tds/QueryBuilderTDSState.ts +5 -0
- package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.ts +76 -2
- package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.ts +90 -81
- package/src/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuidler.ts +108 -0
- package/src/stores/query-workflow/QueryBuilderWorkFlowState.ts +64 -0
- package/src/stores/workflows/FunctionQueryBuilderState.ts +1 -1
- package/src/stores/workflows/MappingQueryBuilderState.ts +1 -1
- package/src/stores/workflows/ServiceQueryBuilderState.ts +1 -1
- package/tsconfig.json +3 -1
- package/lib/stores/workflow/QueryBuilderWorkFlowState.d.ts.map +0 -1
- package/lib/stores/workflow/QueryBuilderWorkFlowState.js.map +0 -1
@@ -32,6 +32,7 @@ import { QueryBuilderGraphFetchTreeState } from '../../stores/fetch-structure/gr
|
|
32
32
|
import { QueryBuilderPanelIssueCountBadge } from '../shared/QueryBuilderPanelIssueCountBadge.js';
|
33
33
|
import { FETCH_STRUCTURE_IMPLEMENTATION } from '../../stores/fetch-structure/QueryBuilderFetchStructureImplementationState.js';
|
34
34
|
import { QUERY_BUILDER_TEST_ID } from '../../__lib__/QueryBuilderTesting.js';
|
35
|
+
import { onChangeFetchStructureImplementation } from '../../stores/fetch-structure/QueryBuilderFetchStructureState.js';
|
35
36
|
|
36
37
|
const QueryBuilderFetchStructureEditor = observer(
|
37
38
|
(props: { queryBuilderState: QueryBuilderState }) => {
|
@@ -68,24 +69,18 @@ export const QueryBuilderFetchStructurePanel = observer(
|
|
68
69
|
(props: { queryBuilderState: QueryBuilderState }) => {
|
69
70
|
const { queryBuilderState } = props;
|
70
71
|
const fetchStructureState = queryBuilderState.fetchStructureState;
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
if (fetchStructureState.implementation.type !== implementationType) {
|
76
|
-
fetchStructureState.implementation.checkBeforeChangingImplementation(
|
77
|
-
() => {
|
78
|
-
fetchStructureState.changeImplementation(implementationType);
|
79
|
-
},
|
80
|
-
);
|
81
|
-
}
|
82
|
-
};
|
72
|
+
const fetchConfig =
|
73
|
+
queryBuilderState.workflowState.getFetchStructureLayoutConfig(
|
74
|
+
queryBuilderState,
|
75
|
+
);
|
83
76
|
|
84
77
|
return (
|
85
78
|
<Panel data-testid={QUERY_BUILDER_TEST_ID.QUERY_BUILDER_FETCH_STRUCTURE}>
|
86
79
|
<PanelHeader>
|
87
80
|
<div className="panel__header__title">
|
88
|
-
<div className="panel__header__title__label">
|
81
|
+
<div className="panel__header__title__label">
|
82
|
+
{fetchConfig.label}
|
83
|
+
</div>
|
89
84
|
{fetchStructureState.implementation.fetchStructureValidationIssues
|
90
85
|
.length !== 0 && (
|
91
86
|
<QueryBuilderPanelIssueCountBadge
|
@@ -96,22 +91,27 @@ export const QueryBuilderFetchStructurePanel = observer(
|
|
96
91
|
/>
|
97
92
|
)}
|
98
93
|
</div>
|
99
|
-
|
100
|
-
<
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
94
|
+
{fetchConfig.showInFetchPanel ? (
|
95
|
+
<PanelHeaderActions>
|
96
|
+
<div className="query-builder__fetch__structure__modes">
|
97
|
+
{Object.values(FETCH_STRUCTURE_IMPLEMENTATION).map((type) => (
|
98
|
+
<button
|
99
|
+
onClick={onChangeFetchStructureImplementation(
|
100
|
+
type,
|
101
|
+
fetchStructureState,
|
102
|
+
)}
|
103
|
+
className={clsx('query-builder__fetch__structure__mode', {
|
104
|
+
'query-builder__fetch__structure__mode--selected':
|
105
|
+
type === fetchStructureState.implementation.type,
|
106
|
+
})}
|
107
|
+
key={type}
|
108
|
+
>
|
109
|
+
{prettyCONSTName(type)}
|
110
|
+
</button>
|
111
|
+
))}
|
112
|
+
</div>
|
113
|
+
</PanelHeaderActions>
|
114
|
+
) : null}
|
115
115
|
</PanelHeader>
|
116
116
|
<QueryBuilderFetchStructureEditor
|
117
117
|
queryBuilderState={queryBuilderState}
|
@@ -24,6 +24,8 @@ export enum QUERY_BUILDER_PURE_PATH {
|
|
24
24
|
DURATION_UNIT = 'meta::pure::functions::date::DurationUnit',
|
25
25
|
DAY_OF_WEEK = 'meta::pure::functions::date::DayOfWeek',
|
26
26
|
|
27
|
+
// RELATION
|
28
|
+
RELATION = 'meta::pure::metamodel::relation::Relation',
|
27
29
|
// serialization
|
28
30
|
SERIALIZE_CONFIG = 'meta::pure::graphFetch::execution::AlloySerializationConfig',
|
29
31
|
}
|
@@ -31,6 +33,7 @@ export enum QUERY_BUILDER_PURE_PATH {
|
|
31
33
|
export enum QUERY_BUILDER_SUPPORTED_CALENDAR_AGGREGATION_FUNCTIONS {
|
32
34
|
CALENDAR_ANNUALIZED = 'meta::pure::functions::date::calendar::annualized',
|
33
35
|
CALENDAR_CME = ' meta::pure::functions::date::calendar::cme',
|
36
|
+
|
34
37
|
CALENDAR_CW = 'meta::pure::functions::date::calendar::cw',
|
35
38
|
CALENDAR_CW_FM = 'meta::pure::functions::date::calendar::cw_fm',
|
36
39
|
CALENDAR_CY_MINUS2 = 'meta::pure::functions::date::calendar::CYMinus2',
|
@@ -114,6 +117,10 @@ export enum QUERY_BUILDER_SUPPORTED_FUNCTIONS {
|
|
114
117
|
TDS_RESTRICT = 'meta::pure::tds::restrict',
|
115
118
|
TDS_FUNC = 'meta::pure::tds::func',
|
116
119
|
|
120
|
+
// Relation
|
121
|
+
RELATION_PROJECT = 'meta::pure::functions::relation::project',
|
122
|
+
RELATION_LIMIT = 'meta::pure::functions::relation::limit',
|
123
|
+
|
117
124
|
// filter
|
118
125
|
CONTAINS = 'meta::pure::functions::string::contains',
|
119
126
|
ENDS_WITH = 'meta::pure::functions::string::endsWith',
|
@@ -146,10 +146,10 @@ export class QueryBuilder_PureProtocolProcessorPlugin extends PureProtocolProces
|
|
146
146
|
processingContext,
|
147
147
|
);
|
148
148
|
} else if (
|
149
|
-
matchFunctionName(
|
150
|
-
functionName,
|
149
|
+
matchFunctionName(functionName, [
|
151
150
|
QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_PROJECT,
|
152
|
-
|
151
|
+
QUERY_BUILDER_SUPPORTED_FUNCTIONS.RELATION_PROJECT,
|
152
|
+
])
|
153
153
|
) {
|
154
154
|
return V1_buildProjectFunctionExpression(
|
155
155
|
functionName,
|
@@ -21,6 +21,7 @@ import {
|
|
21
21
|
filterByType,
|
22
22
|
guaranteeNonNullable,
|
23
23
|
guaranteeType,
|
24
|
+
isNonNullable,
|
24
25
|
returnUndefOnError,
|
25
26
|
} from '@finos/legend-shared';
|
26
27
|
import {
|
@@ -56,6 +57,11 @@ import {
|
|
56
57
|
LambdaFunction,
|
57
58
|
LambdaFunctionInstanceValue,
|
58
59
|
PackageableElementExplicitReference,
|
60
|
+
V1_ClassInstance,
|
61
|
+
V1_ColSpecArray,
|
62
|
+
ColSpecArrayInstance,
|
63
|
+
ColSpecArray,
|
64
|
+
ColSpec,
|
59
65
|
} from '@finos/legend-graph';
|
60
66
|
import {
|
61
67
|
QUERY_BUILDER_PURE_PATH,
|
@@ -574,6 +580,110 @@ export const V1_buildFilterFunctionExpression = (
|
|
574
580
|
return expression;
|
575
581
|
};
|
576
582
|
|
583
|
+
export const V1_buildTypedProjectFunctionExpression = (
|
584
|
+
functionName: string,
|
585
|
+
parameters: V1_ValueSpecification[],
|
586
|
+
openVariables: string[],
|
587
|
+
compileContext: V1_GraphBuilderContext,
|
588
|
+
processingContext: V1_ProcessingContext,
|
589
|
+
): SimpleFunctionExpression => {
|
590
|
+
assertTrue(
|
591
|
+
parameters.length === 2,
|
592
|
+
`Can't build relation project() expression: project() expects 2 arguments`,
|
593
|
+
);
|
594
|
+
|
595
|
+
let topLevelLambdaParameters: V1_Variable[] = [];
|
596
|
+
const precedingExperession = (
|
597
|
+
parameters[0] as V1_ValueSpecification
|
598
|
+
).accept_ValueSpecificationVisitor(
|
599
|
+
new V1_ValueSpecificationBuilder(
|
600
|
+
compileContext,
|
601
|
+
processingContext,
|
602
|
+
openVariables,
|
603
|
+
),
|
604
|
+
);
|
605
|
+
assertNonNullable(
|
606
|
+
precedingExperession.genericType,
|
607
|
+
`Can't build relation project() expression: preceding expression return type is missing`,
|
608
|
+
);
|
609
|
+
|
610
|
+
const classInstance = parameters[1];
|
611
|
+
assertType(
|
612
|
+
classInstance,
|
613
|
+
V1_ClassInstance,
|
614
|
+
`Can't build relation project() expression: project() expects argument #1 to be a ClassInstance`,
|
615
|
+
);
|
616
|
+
const specArray = guaranteeType(
|
617
|
+
classInstance.value,
|
618
|
+
V1_ColSpecArray,
|
619
|
+
`Can't build relation project() expression: project() expects argument #1 to hold spec array instances value`,
|
620
|
+
);
|
621
|
+
|
622
|
+
topLevelLambdaParameters = specArray.colSpecs
|
623
|
+
.map((e) => e.function1)
|
624
|
+
.filter(isNonNullable)
|
625
|
+
.filter(filterByType(V1_Lambda))
|
626
|
+
.map((lambda) => lambda.parameters)
|
627
|
+
.flat();
|
628
|
+
|
629
|
+
const variables = new Set<string>();
|
630
|
+
// Make sure top-level lambdas have their lambda parameter types set properly
|
631
|
+
topLevelLambdaParameters.forEach((variable) => {
|
632
|
+
if (!variables.has(variable.name) && !variable.class) {
|
633
|
+
const variableExpression = new VariableExpression(
|
634
|
+
variable.name,
|
635
|
+
precedingExperession.multiplicity,
|
636
|
+
);
|
637
|
+
variableExpression.genericType = precedingExperession.genericType;
|
638
|
+
processingContext.addInferredVariables(variable.name, variableExpression);
|
639
|
+
}
|
640
|
+
});
|
641
|
+
const processedExpression = new ColSpecArrayInstance(Multiplicity.ONE);
|
642
|
+
const processedColSpecArray = new ColSpecArray();
|
643
|
+
processedExpression.values = [processedColSpecArray];
|
644
|
+
|
645
|
+
processedColSpecArray.colSpecs = specArray.colSpecs.map((colSpec) => {
|
646
|
+
const pColSpec = new ColSpec();
|
647
|
+
let lambda: ValueSpecification;
|
648
|
+
const _funct = guaranteeType(
|
649
|
+
colSpec.function1,
|
650
|
+
V1_ValueSpecification,
|
651
|
+
`Can't build relation col spec() expression: expects function1 to be a lambda`,
|
652
|
+
);
|
653
|
+
try {
|
654
|
+
lambda = buildProjectionColumnLambda(
|
655
|
+
_funct,
|
656
|
+
openVariables,
|
657
|
+
compileContext,
|
658
|
+
processingContext,
|
659
|
+
);
|
660
|
+
} catch {
|
661
|
+
lambda = new INTERNAL__UnknownValueSpecification(
|
662
|
+
V1_serializeValueSpecification(
|
663
|
+
_funct,
|
664
|
+
compileContext.extensions.plugins,
|
665
|
+
),
|
666
|
+
);
|
667
|
+
}
|
668
|
+
pColSpec.function1 = lambda;
|
669
|
+
pColSpec.name = colSpec.name;
|
670
|
+
return pColSpec;
|
671
|
+
});
|
672
|
+
|
673
|
+
const expression = V1_buildBaseSimpleFunctionExpression(
|
674
|
+
[precedingExperession, processedExpression],
|
675
|
+
functionName,
|
676
|
+
compileContext,
|
677
|
+
);
|
678
|
+
expression.genericType = GenericTypeExplicitReference.create(
|
679
|
+
new GenericType(
|
680
|
+
compileContext.resolveType(QUERY_BUILDER_PURE_PATH.RELATION).value,
|
681
|
+
),
|
682
|
+
);
|
683
|
+
|
684
|
+
return expression;
|
685
|
+
};
|
686
|
+
|
577
687
|
export const V1_buildProjectFunctionExpression = (
|
578
688
|
functionName: string,
|
579
689
|
parameters: V1_ValueSpecification[],
|
@@ -581,8 +691,19 @@ export const V1_buildProjectFunctionExpression = (
|
|
581
691
|
compileContext: V1_GraphBuilderContext,
|
582
692
|
processingContext: V1_ProcessingContext,
|
583
693
|
): SimpleFunctionExpression => {
|
694
|
+
if (parameters.length === 2) {
|
695
|
+
return V1_buildTypedProjectFunctionExpression(
|
696
|
+
functionName,
|
697
|
+
parameters,
|
698
|
+
openVariables,
|
699
|
+
compileContext,
|
700
|
+
processingContext,
|
701
|
+
);
|
702
|
+
}
|
703
|
+
|
704
|
+
const length = parameters.length;
|
584
705
|
assertTrue(
|
585
|
-
|
706
|
+
length === 3 || length === 2,
|
586
707
|
`Can't build project() expression: project() expects 2 arguments`,
|
587
708
|
);
|
588
709
|
|
package/src/index.ts
CHANGED
@@ -93,4 +93,4 @@ export * from './stores/QueryBuilder_LegendApplicationPlugin_Extension.js';
|
|
93
93
|
|
94
94
|
export * from './stores/data-access/DataAccessState.js';
|
95
95
|
export * from './components/data-access/DataAccessOverview.js';
|
96
|
-
export * from './stores/workflow/QueryBuilderWorkFlowState.js';
|
96
|
+
export * from './stores/query-workflow/QueryBuilderWorkFlowState.js';
|
@@ -312,6 +312,7 @@ export class QueryBuilderResultState {
|
|
312
312
|
if (this.queryBuilderState.isQuerySupported) {
|
313
313
|
const lambdaFunction = buildLambdaFunction(this.queryBuilderState, {
|
314
314
|
isBuildingExecutionQuery: true,
|
315
|
+
useTypedRelationFunctions: this.queryBuilderState.isFetchStructureTyped,
|
315
316
|
...executionOptions,
|
316
317
|
});
|
317
318
|
query = buildRawLambdaFromLambdaFunction(
|
@@ -109,7 +109,7 @@ import {
|
|
109
109
|
import type { QueryBuilderConfig } from '../graph-manager/QueryBuilderConfig.js';
|
110
110
|
import { QUERY_BUILDER_EVENT } from '../__lib__/QueryBuilderEvent.js';
|
111
111
|
import { QueryBuilderChangeHistoryState } from './QueryBuilderChangeHistoryState.js';
|
112
|
-
import { type QueryBuilderWorkflowState } from './workflow/QueryBuilderWorkFlowState.js';
|
112
|
+
import { type QueryBuilderWorkflowState } from './query-workflow/QueryBuilderWorkFlowState.js';
|
113
113
|
|
114
114
|
export interface QuerySDLC {}
|
115
115
|
|
@@ -157,6 +157,8 @@ export abstract class QueryBuilderState implements CommandRegistrar {
|
|
157
157
|
isQueryChatOpened = false;
|
158
158
|
isLocalModeEnabled = false;
|
159
159
|
|
160
|
+
lambdaWriteMode = QUERY_BUILDER_LAMBDA_WRITER_MODE.STANDARD;
|
161
|
+
|
160
162
|
class?: Class | undefined;
|
161
163
|
getAllFunction: QUERY_BUILDER_SUPPORTED_GET_ALL_FUNCTIONS =
|
162
164
|
QUERY_BUILDER_SUPPORTED_GET_ALL_FUNCTIONS.GET_ALL;
|
@@ -204,6 +206,7 @@ export abstract class QueryBuilderState implements CommandRegistrar {
|
|
204
206
|
isQueryChatOpened: observable,
|
205
207
|
isLocalModeEnabled: observable,
|
206
208
|
getAllFunction: observable,
|
209
|
+
lambdaWriteMode: observable,
|
207
210
|
|
208
211
|
sideBarClassName: computed,
|
209
212
|
isQuerySupported: computed,
|
@@ -218,6 +221,7 @@ export abstract class QueryBuilderState implements CommandRegistrar {
|
|
218
221
|
setIsQueryChatOpened: action,
|
219
222
|
setIsLocalModeEnabled: action,
|
220
223
|
setGetAllFunction: action,
|
224
|
+
setLambdaWriteMode: action,
|
221
225
|
|
222
226
|
resetQueryResult: action,
|
223
227
|
resetQueryContent: action,
|
@@ -300,6 +304,17 @@ export abstract class QueryBuilderState implements CommandRegistrar {
|
|
300
304
|
return this.allVariables.map((e) => e.name);
|
301
305
|
}
|
302
306
|
|
307
|
+
get isFetchStructureTyped(): boolean {
|
308
|
+
return (
|
309
|
+
this.lambdaWriteMode ===
|
310
|
+
QUERY_BUILDER_LAMBDA_WRITER_MODE.TYPED_FETCH_STRUCTURE
|
311
|
+
);
|
312
|
+
}
|
313
|
+
|
314
|
+
setLambdaWriteMode(val: QUERY_BUILDER_LAMBDA_WRITER_MODE): void {
|
315
|
+
this.lambdaWriteMode = val;
|
316
|
+
}
|
317
|
+
|
303
318
|
getQueryExecutionContext(): QueryExecutionContext {
|
304
319
|
const queryExeContext = new QueryExplicitExecutionContext();
|
305
320
|
const runtimeValue = guaranteeType(
|
@@ -538,6 +553,7 @@ export abstract class QueryBuilderState implements CommandRegistrar {
|
|
538
553
|
return buildRawLambdaFromLambdaFunction(
|
539
554
|
buildLambdaFunction(this, {
|
540
555
|
keepSourceInformation: Boolean(options?.keepSourceInformation),
|
556
|
+
useTypedRelationFunctions: this.isFetchStructureTyped,
|
541
557
|
}),
|
542
558
|
this.graphManagerState,
|
543
559
|
);
|
@@ -26,7 +26,7 @@ import {
|
|
26
26
|
} from '@finos/legend-shared';
|
27
27
|
import type { QueryBuilderState } from './QueryBuilderState.js';
|
28
28
|
import {
|
29
|
-
|
29
|
+
AbstractPropertyExpression,
|
30
30
|
type EnumValueInstanceValue,
|
31
31
|
type FunctionExpression,
|
32
32
|
type GraphFetchTreeInstanceValue,
|
@@ -36,7 +36,8 @@ import {
|
|
36
36
|
type INTERNAL__PropagatedValue,
|
37
37
|
type ValueSpecification,
|
38
38
|
type CollectionInstanceValue,
|
39
|
-
|
39
|
+
LambdaFunctionInstanceValue,
|
40
|
+
type ColSpecArrayInstance,
|
40
41
|
InstanceValue,
|
41
42
|
INTERNAL__UnknownValueSpecification,
|
42
43
|
matchFunctionName,
|
@@ -481,6 +482,7 @@ export class QueryBuilderValueSpecificationProcessor
|
|
481
482
|
) {
|
482
483
|
processTDSProjectionDerivationExpression(
|
483
484
|
valueSpecification,
|
485
|
+
undefined,
|
484
486
|
this.parentExpression,
|
485
487
|
this.queryBuilderState,
|
486
488
|
);
|
@@ -637,10 +639,10 @@ export class QueryBuilderValueSpecificationProcessor
|
|
637
639
|
);
|
638
640
|
return;
|
639
641
|
} else if (
|
640
|
-
matchFunctionName(
|
641
|
-
functionName,
|
642
|
+
matchFunctionName(functionName, [
|
642
643
|
QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_PROJECT,
|
643
|
-
|
644
|
+
QUERY_BUILDER_SUPPORTED_FUNCTIONS.RELATION_PROJECT,
|
645
|
+
])
|
644
646
|
) {
|
645
647
|
processTDSProjectExpression(
|
646
648
|
valueSpecification,
|
@@ -835,6 +837,7 @@ export class QueryBuilderValueSpecificationProcessor
|
|
835
837
|
if (
|
836
838
|
matchFunctionName(this.parentExpression.functionName, [
|
837
839
|
QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_PROJECT,
|
840
|
+
QUERY_BUILDER_SUPPORTED_FUNCTIONS.RELATION_PROJECT,
|
838
841
|
QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_GROUP_BY,
|
839
842
|
QUERY_BUILDER_SUPPORTED_FUNCTIONS.TDS_AGG,
|
840
843
|
...Object.values(
|
@@ -844,6 +847,7 @@ export class QueryBuilderValueSpecificationProcessor
|
|
844
847
|
) {
|
845
848
|
processTDSProjectionColumnPropertyExpression(
|
846
849
|
valueSpecification,
|
850
|
+
undefined,
|
847
851
|
this.queryBuilderState,
|
848
852
|
);
|
849
853
|
return;
|
@@ -903,6 +907,62 @@ export class QueryBuilderValueSpecificationProcessor
|
|
903
907
|
): void {
|
904
908
|
throw new UnsupportedOperationError();
|
905
909
|
}
|
910
|
+
|
911
|
+
visit_ColSpecArrayInstance(valueSpecification: ColSpecArrayInstance): void {
|
912
|
+
assertNonNullable(
|
913
|
+
this.parentExpression,
|
914
|
+
`Can't process col spec aray instance: parent expression cannot be retrieved`,
|
915
|
+
);
|
916
|
+
|
917
|
+
if (
|
918
|
+
matchFunctionName(this.parentExpression.functionName, [
|
919
|
+
QUERY_BUILDER_SUPPORTED_FUNCTIONS.RELATION_PROJECT,
|
920
|
+
])
|
921
|
+
) {
|
922
|
+
const spec = valueSpecification.values;
|
923
|
+
assertTrue(
|
924
|
+
spec.length === 1,
|
925
|
+
`Can't process col spec array instance: value expected to be of size 1`,
|
926
|
+
);
|
927
|
+
guaranteeNonNullable(spec[0]).colSpecs.forEach((col) => {
|
928
|
+
const _function1 = guaranteeType(
|
929
|
+
col.function1,
|
930
|
+
LambdaFunctionInstanceValue,
|
931
|
+
`Can't process col spec: function1 not a lambda function instance value`,
|
932
|
+
);
|
933
|
+
assertTrue(_function1.values.length === 1);
|
934
|
+
const lambdaVal = guaranteeNonNullable(_function1.values[0]);
|
935
|
+
assertTrue(lambdaVal.expressionSequence.length === 1);
|
936
|
+
const expression = guaranteeNonNullable(
|
937
|
+
lambdaVal.expressionSequence[0],
|
938
|
+
);
|
939
|
+
|
940
|
+
if (expression instanceof AbstractPropertyExpression) {
|
941
|
+
processTDSProjectionColumnPropertyExpression(
|
942
|
+
expression,
|
943
|
+
col.name,
|
944
|
+
this.queryBuilderState,
|
945
|
+
);
|
946
|
+
} else if (expression instanceof INTERNAL__UnknownValueSpecification) {
|
947
|
+
assertNonNullable(
|
948
|
+
this.parentExpression,
|
949
|
+
`Can't process unknown value: parent expression cannot be retrieved`,
|
950
|
+
);
|
951
|
+
processTDSProjectionDerivationExpression(
|
952
|
+
expression,
|
953
|
+
col.name,
|
954
|
+
this.parentExpression,
|
955
|
+
this.queryBuilderState,
|
956
|
+
);
|
957
|
+
}
|
958
|
+
});
|
959
|
+
|
960
|
+
return;
|
961
|
+
}
|
962
|
+
throw new UnsupportedOperationError(
|
963
|
+
`Can't process col spec array expression with parent expression of function ${this.parentExpression.functionName}()`,
|
964
|
+
);
|
965
|
+
}
|
906
966
|
}
|
907
967
|
|
908
968
|
export const processParameters = (
|
@@ -205,4 +205,9 @@ export type LambdaFunctionBuilderOption = {
|
|
205
205
|
* limit for the query results if it exists so the exported results contain all the data
|
206
206
|
*/
|
207
207
|
isExportingResult?: boolean | undefined;
|
208
|
+
/**
|
209
|
+
* Set this flag to `true` when you want to write to typed TDS function using the `Relation`
|
210
|
+
* typed in engine. This is still an experimental feature, hence we should only enable this flag when user wants to enable this directly.
|
211
|
+
*/
|
212
|
+
useTypedRelationFunctions?: boolean | undefined;
|
208
213
|
};
|
@@ -41,7 +41,7 @@ import {
|
|
41
41
|
INTERNAL__BasicQueryBuilderState,
|
42
42
|
type QueryBuilderState,
|
43
43
|
} from '../QueryBuilderState.js';
|
44
|
-
import { QueryBuilderAdvancedWorkflowState } from '../workflow/QueryBuilderWorkFlowState.js';
|
44
|
+
import { QueryBuilderAdvancedWorkflowState } from '../query-workflow/QueryBuilderWorkFlowState.js';
|
45
45
|
|
46
46
|
export class TEST__LegendApplicationPluginManager
|
47
47
|
extends LegendApplicationPluginManager<LegendApplicationPlugin>
|
@@ -58,6 +58,7 @@ export abstract class QueryBuilderFetchStructureImplementationState
|
|
58
58
|
abstract get usedExplorerTreePropertyNodeIDs(): string[];
|
59
59
|
abstract get fetchStructureValidationIssues(): string[];
|
60
60
|
abstract get allValidationIssues(): string[];
|
61
|
+
abstract get fetchLabel(): string;
|
61
62
|
|
62
63
|
abstract onClassChange(_class: Class | undefined): void;
|
63
64
|
abstract revealCompilationError(compilationError: CompilationError): boolean;
|
@@ -29,6 +29,21 @@ import {
|
|
29
29
|
type QueryBuilderFetchStructureImplementationState,
|
30
30
|
} from './QueryBuilderFetchStructureImplementationState.js';
|
31
31
|
|
32
|
+
export const onChangeFetchStructureImplementation =
|
33
|
+
(
|
34
|
+
implementationType: FETCH_STRUCTURE_IMPLEMENTATION,
|
35
|
+
fetchStructureState: QueryBuilderFetchStructureState,
|
36
|
+
): (() => void) =>
|
37
|
+
(): void => {
|
38
|
+
if (fetchStructureState.implementation.type !== implementationType) {
|
39
|
+
fetchStructureState.implementation.checkBeforeChangingImplementation(
|
40
|
+
() => {
|
41
|
+
fetchStructureState.changeImplementation(implementationType);
|
42
|
+
},
|
43
|
+
);
|
44
|
+
}
|
45
|
+
};
|
46
|
+
|
32
47
|
export class QueryBuilderFetchStructureState {
|
33
48
|
readonly queryBuilderState: QueryBuilderState;
|
34
49
|
implementation: QueryBuilderFetchStructureImplementationState;
|
@@ -292,6 +292,7 @@ export class QueryBuilderGraphFetchTreeState
|
|
292
292
|
setSerializationState: action,
|
293
293
|
setChecked: action,
|
294
294
|
initialize: action,
|
295
|
+
checkBeforeChangingImplementation: action,
|
295
296
|
});
|
296
297
|
|
297
298
|
// try to initialize the graph-fetch tree data using the setup class
|
@@ -304,6 +305,10 @@ export class QueryBuilderGraphFetchTreeState
|
|
304
305
|
return FETCH_STRUCTURE_IMPLEMENTATION.GRAPH_FETCH;
|
305
306
|
}
|
306
307
|
|
308
|
+
override get fetchLabel(): string {
|
309
|
+
return 'Class Properties';
|
310
|
+
}
|
311
|
+
|
307
312
|
get usedExplorerTreePropertyNodeIDs(): string[] {
|
308
313
|
if (!this.treeData) {
|
309
314
|
return [];
|
File without changes
|
@@ -154,6 +154,7 @@ export class QueryBuilderTDSState
|
|
154
154
|
initializeWithQuery: action,
|
155
155
|
setShowPostFilterPanel: action,
|
156
156
|
setShowWindowFuncPanel: action,
|
157
|
+
checkBeforeChangingImplementation: action,
|
157
158
|
convertDerivationProjectionObjects: flow,
|
158
159
|
fetchDerivedReturnTypes: flow,
|
159
160
|
});
|
@@ -194,6 +195,10 @@ export class QueryBuilderTDSState
|
|
194
195
|
);
|
195
196
|
}
|
196
197
|
|
198
|
+
override get fetchLabel(): string {
|
199
|
+
return 'Columns';
|
200
|
+
}
|
201
|
+
|
197
202
|
override get TEMPORARY__showPostFetchStructurePanel(): boolean {
|
198
203
|
return (
|
199
204
|
this.queryBuilderState.filterState.showPanel ||
|