@finos/legend-query-builder 4.14.30 → 4.14.31
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/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 ||
|