@finos/legend-application-data-cube 0.5.6 → 0.6.0
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/application/LegendDataCubeApplicationConfig.d.ts +2 -0
- package/lib/application/LegendDataCubeApplicationConfig.d.ts.map +1 -1
- package/lib/application/LegendDataCubeApplicationConfig.js +2 -0
- package/lib/application/LegendDataCubeApplicationConfig.js.map +1 -1
- package/lib/application/__test-utils__/LegendDataCubeApplicationTestUtils.d.ts.map +1 -1
- package/lib/application/__test-utils__/LegendDataCubeApplicationTestUtils.js +1 -0
- package/lib/application/__test-utils__/LegendDataCubeApplicationTestUtils.js.map +1 -1
- package/lib/components/builder/LegendDataCubeCreator.d.ts.map +1 -1
- package/lib/components/builder/LegendDataCubeCreator.js +5 -1
- package/lib/components/builder/LegendDataCubeCreator.js.map +1 -1
- package/lib/components/builder/source/LakehouseConsumerDataCubeSourceBuilder.d.ts +5 -0
- package/lib/components/builder/source/LakehouseConsumerDataCubeSourceBuilder.d.ts.map +1 -0
- package/lib/components/builder/source/LakehouseConsumerDataCubeSourceBuilder.js +75 -0
- package/lib/components/builder/source/LakehouseConsumerDataCubeSourceBuilder.js.map +1 -0
- package/lib/index.css +1 -1
- package/lib/package.json +1 -1
- package/lib/stores/LegendDataCubeBaseStore.d.ts +2 -1
- package/lib/stores/LegendDataCubeBaseStore.d.ts.map +1 -1
- package/lib/stores/LegendDataCubeBaseStore.js +6 -1
- package/lib/stores/LegendDataCubeBaseStore.js.map +1 -1
- package/lib/stores/LegendDataCubeDataCubeEngine.d.ts +1 -0
- package/lib/stores/LegendDataCubeDataCubeEngine.d.ts.map +1 -1
- package/lib/stores/LegendDataCubeDataCubeEngine.js +74 -10
- package/lib/stores/LegendDataCubeDataCubeEngine.js.map +1 -1
- package/lib/stores/builder/LegendDataCubeBuilderStore.d.ts +2 -1
- package/lib/stores/builder/LegendDataCubeBuilderStore.d.ts.map +1 -1
- package/lib/stores/builder/LegendDataCubeBuilderStore.js +3 -1
- package/lib/stores/builder/LegendDataCubeBuilderStore.js.map +1 -1
- package/lib/stores/builder/LegendDataCubeCreatorState.d.ts.map +1 -1
- package/lib/stores/builder/LegendDataCubeCreatorState.js +3 -0
- package/lib/stores/builder/LegendDataCubeCreatorState.js.map +1 -1
- package/lib/stores/builder/source/LakehouseConsumerDataCubeSourceBuilderState.d.ts +58 -0
- package/lib/stores/builder/source/LakehouseConsumerDataCubeSourceBuilderState.d.ts.map +1 -0
- package/lib/stores/builder/source/LakehouseConsumerDataCubeSourceBuilderState.js +187 -0
- package/lib/stores/builder/source/LakehouseConsumerDataCubeSourceBuilderState.js.map +1 -0
- package/lib/stores/builder/source/LakehouseProducerDataCubeSourceBuilderState.js +3 -3
- package/lib/stores/builder/source/LakehouseProducerDataCubeSourceBuilderState.js.map +1 -1
- package/lib/stores/builder/source/LakehouseProducerDataCubeSourceLoaderState.js +4 -4
- package/lib/stores/builder/source/LakehouseProducerDataCubeSourceLoaderState.js.map +1 -1
- package/lib/stores/builder/source/LegendDataCubeSourceBuilderState.d.ts +2 -1
- package/lib/stores/builder/source/LegendDataCubeSourceBuilderState.d.ts.map +1 -1
- package/lib/stores/builder/source/LegendDataCubeSourceBuilderState.js +1 -0
- package/lib/stores/builder/source/LegendDataCubeSourceBuilderState.js.map +1 -1
- package/lib/stores/model/LakehouseConsumerDataCubeSource.d.ts +32 -0
- package/lib/stores/model/LakehouseConsumerDataCubeSource.d.ts.map +1 -0
- package/lib/stores/model/LakehouseConsumerDataCubeSource.js +38 -0
- package/lib/stores/model/LakehouseConsumerDataCubeSource.js.map +1 -0
- package/lib/stores/model/{IngestDefinitionDataCubeSource.d.ts → LakehouseProducerDataCubeSource.d.ts} +4 -4
- package/lib/stores/model/LakehouseProducerDataCubeSource.d.ts.map +1 -0
- package/lib/stores/model/{IngestDefinitionDataCubeSource.js → LakehouseProducerDataCubeSource.js} +4 -4
- package/lib/stores/model/LakehouseProducerDataCubeSource.js.map +1 -0
- package/package.json +9 -9
- package/src/application/LegendDataCubeApplicationConfig.ts +8 -0
- package/src/application/__test-utils__/LegendDataCubeApplicationTestUtils.ts +1 -0
- package/src/components/builder/LegendDataCubeCreator.tsx +9 -0
- package/src/components/builder/source/LakehouseConsumerDataCubeSourceBuilder.tsx +149 -0
- package/src/stores/LegendDataCubeBaseStore.ts +8 -0
- package/src/stores/LegendDataCubeDataCubeEngine.ts +128 -13
- package/src/stores/builder/LegendDataCubeBuilderStore.tsx +4 -1
- package/src/stores/builder/LegendDataCubeCreatorState.tsx +10 -0
- package/src/stores/builder/source/LakehouseConsumerDataCubeSourceBuilderState.ts +277 -0
- package/src/stores/builder/source/LakehouseProducerDataCubeSourceBuilderState.ts +3 -3
- package/src/stores/builder/source/LakehouseProducerDataCubeSourceLoaderState.ts +4 -4
- package/src/stores/builder/source/LegendDataCubeSourceBuilderState.ts +1 -0
- package/src/stores/model/LakehouseConsumerDataCubeSource.ts +52 -0
- package/src/stores/model/{IngestDefinitionDataCubeSource.ts → LakehouseProducerDataCubeSource.ts} +3 -3
- package/tsconfig.json +4 -1
- package/lib/stores/model/IngestDefinitionDataCubeSource.d.ts.map +0 -1
- package/lib/stores/model/IngestDefinitionDataCubeSource.js.map +0 -1
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025-present, Goldman Sachs
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { observer } from 'mobx-react-lite';
|
|
17
|
+
import { FormTextInput } from '@finos/legend-data-cube';
|
|
18
|
+
import { CustomSelectorInput } from '@finos/legend-art';
|
|
19
|
+
import { useAuth } from 'react-oidc-context';
|
|
20
|
+
import { useLegendDataCubeBuilderStore } from '../LegendDataCubeBuilderStoreProvider.js';
|
|
21
|
+
import { assertErrorThrown, guaranteeNonNullable } from '@finos/legend-shared';
|
|
22
|
+
import { useEffect } from 'react';
|
|
23
|
+
import type { LakehouseConsumerDataCubeSourceBuilderState } from '../../../stores/builder/source/LakehouseConsumerDataCubeSourceBuilderState.js';
|
|
24
|
+
|
|
25
|
+
export const LakehouseConsumerDataCubeSourceBuilder: React.FC<{
|
|
26
|
+
sourceBuilder: LakehouseConsumerDataCubeSourceBuilderState;
|
|
27
|
+
}> = observer(({ sourceBuilder: state }) => {
|
|
28
|
+
const auth = useAuth();
|
|
29
|
+
const store = useLegendDataCubeBuilderStore();
|
|
30
|
+
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
state.reset();
|
|
33
|
+
state.loadDataProducts();
|
|
34
|
+
}, [state]);
|
|
35
|
+
|
|
36
|
+
return (
|
|
37
|
+
<div className="flex h-full w-full">
|
|
38
|
+
<div className="m-3 flex w-full flex-col items-stretch gap-2 text-neutral-500">
|
|
39
|
+
{state.dataProducts.length > 0 && (
|
|
40
|
+
<div className="query-setup__wizard__group mt-3">
|
|
41
|
+
<div className="query-setup__wizard__group__title">
|
|
42
|
+
Data Product
|
|
43
|
+
</div>
|
|
44
|
+
<CustomSelectorInput
|
|
45
|
+
className="query-setup__wizard__selector text-nowrap"
|
|
46
|
+
options={state.dataProducts.map((dataProduct) => ({
|
|
47
|
+
label: guaranteeNonNullable(dataProduct.path),
|
|
48
|
+
value: guaranteeNonNullable(dataProduct.path),
|
|
49
|
+
}))}
|
|
50
|
+
disabled={false}
|
|
51
|
+
isLoading={false}
|
|
52
|
+
onChange={(newValue: { label: string; value: string } | null) => {
|
|
53
|
+
state.setSelectedDataProduct(newValue?.value ?? '');
|
|
54
|
+
state.fetchDataProductEnvironments(auth.user?.access_token);
|
|
55
|
+
}}
|
|
56
|
+
value={
|
|
57
|
+
state.selectedDataProduct
|
|
58
|
+
? {
|
|
59
|
+
label: state.selectedDataProduct,
|
|
60
|
+
value: state.selectedDataProduct,
|
|
61
|
+
}
|
|
62
|
+
: null
|
|
63
|
+
}
|
|
64
|
+
isClearable={false}
|
|
65
|
+
escapeClearsValue={true}
|
|
66
|
+
/>
|
|
67
|
+
</div>
|
|
68
|
+
)}
|
|
69
|
+
{state.environments.length > 0 && (
|
|
70
|
+
<div className="query-setup__wizard__group mt-2">
|
|
71
|
+
<div className="query-setup__wizard__group__title">Environment</div>
|
|
72
|
+
<CustomSelectorInput
|
|
73
|
+
className="query-setup__wizard__selector"
|
|
74
|
+
options={state.environments.map((env) => ({
|
|
75
|
+
label: env,
|
|
76
|
+
value: env,
|
|
77
|
+
}))}
|
|
78
|
+
disabled={false}
|
|
79
|
+
isLoading={false}
|
|
80
|
+
onChange={(newValue: { label: string; value: string } | null) => {
|
|
81
|
+
const env = newValue?.value ?? '';
|
|
82
|
+
state.setSelectedEnvironment(env);
|
|
83
|
+
state.fetchAccessPoints();
|
|
84
|
+
}}
|
|
85
|
+
value={
|
|
86
|
+
state.selectedEnvironment
|
|
87
|
+
? {
|
|
88
|
+
label: state.selectedEnvironment,
|
|
89
|
+
value: state.selectedEnvironment,
|
|
90
|
+
}
|
|
91
|
+
: null
|
|
92
|
+
}
|
|
93
|
+
isClearable={false}
|
|
94
|
+
escapeClearsValue={true}
|
|
95
|
+
/>
|
|
96
|
+
</div>
|
|
97
|
+
)}
|
|
98
|
+
{state.accessPoints.length > 0 && (
|
|
99
|
+
<div className="query-setup__wizard__group mt-2">
|
|
100
|
+
<div className="query-setup__wizard__group__title">
|
|
101
|
+
Access Points
|
|
102
|
+
</div>
|
|
103
|
+
<CustomSelectorInput
|
|
104
|
+
className="query-setup__wizard__selector"
|
|
105
|
+
options={state.accessPoints.map((accessPoint) => ({
|
|
106
|
+
label: accessPoint,
|
|
107
|
+
value: accessPoint,
|
|
108
|
+
}))}
|
|
109
|
+
disabled={false}
|
|
110
|
+
isLoading={false}
|
|
111
|
+
onChange={(newValue: { label: string; value: string } | null) => {
|
|
112
|
+
const accessPoint = newValue?.value ?? '';
|
|
113
|
+
state.setSelectedAccessPoint(accessPoint);
|
|
114
|
+
state
|
|
115
|
+
.fetchEnvironment(auth.user?.access_token)
|
|
116
|
+
.catch((error) => {
|
|
117
|
+
assertErrorThrown(error);
|
|
118
|
+
store.alertService.alertUnhandledError(error);
|
|
119
|
+
});
|
|
120
|
+
}}
|
|
121
|
+
value={
|
|
122
|
+
state.selectedAccessPoint
|
|
123
|
+
? {
|
|
124
|
+
label: state.selectedAccessPoint,
|
|
125
|
+
value: state.selectedAccessPoint,
|
|
126
|
+
}
|
|
127
|
+
: null
|
|
128
|
+
}
|
|
129
|
+
isClearable={false}
|
|
130
|
+
escapeClearsValue={true}
|
|
131
|
+
/>
|
|
132
|
+
</div>
|
|
133
|
+
)}
|
|
134
|
+
{state.selectedAccessPoint && (
|
|
135
|
+
<div className="query-setup__wizard__group mt-2">
|
|
136
|
+
<div className="query-setup__wizard__group__title">Warehouse</div>
|
|
137
|
+
<FormTextInput
|
|
138
|
+
className="w-full text-base text-black"
|
|
139
|
+
value={state.warehouse}
|
|
140
|
+
onChange={(event) => {
|
|
141
|
+
state.setWarehouse(event.target.value);
|
|
142
|
+
}}
|
|
143
|
+
/>
|
|
144
|
+
</div>
|
|
145
|
+
)}
|
|
146
|
+
</div>
|
|
147
|
+
</div>
|
|
148
|
+
);
|
|
149
|
+
});
|
|
@@ -36,6 +36,7 @@ import {
|
|
|
36
36
|
guaranteeIsString,
|
|
37
37
|
} from '@finos/legend-shared';
|
|
38
38
|
import {
|
|
39
|
+
LakehouseContractServerClient,
|
|
39
40
|
LakehouseIngestServerClient,
|
|
40
41
|
LakehousePlatformServerClient,
|
|
41
42
|
} from '@finos/legend-server-lakehouse';
|
|
@@ -68,6 +69,7 @@ export class LegendDataCubeBaseStore {
|
|
|
68
69
|
readonly depotServerClient: DepotServerClient;
|
|
69
70
|
readonly lakehousePlatformServerClient: LakehousePlatformServerClient;
|
|
70
71
|
readonly lakehouseIngestServerClient: LakehouseIngestServerClient;
|
|
72
|
+
readonly lakehouseContractServerClient: LakehouseContractServerClient;
|
|
71
73
|
readonly graphManager: V1_PureGraphManager;
|
|
72
74
|
readonly remoteEngine: V1_RemoteEngine;
|
|
73
75
|
readonly engineServerClient: V1_EngineServerClient;
|
|
@@ -102,6 +104,12 @@ export class LegendDataCubeBaseStore {
|
|
|
102
104
|
this.lakehouseIngestServerClient.setTracerService(
|
|
103
105
|
application.tracerService,
|
|
104
106
|
);
|
|
107
|
+
this.lakehouseContractServerClient = new LakehouseContractServerClient({
|
|
108
|
+
baseUrl: this.application.config.lakehouseContractUrl,
|
|
109
|
+
});
|
|
110
|
+
this.lakehouseContractServerClient.setTracerService(
|
|
111
|
+
application.tracerService,
|
|
112
|
+
);
|
|
105
113
|
|
|
106
114
|
this.graphManager = new V1_PureGraphManager(
|
|
107
115
|
this.application.pluginManager,
|
|
@@ -89,6 +89,9 @@ import {
|
|
|
89
89
|
EXECUTION_SERIALIZATION_FORMAT,
|
|
90
90
|
V1_LakehouseRuntime,
|
|
91
91
|
V1_IngestDefinition,
|
|
92
|
+
V1_DataProduct,
|
|
93
|
+
V1_LakehouseAccessPoint,
|
|
94
|
+
V1_serializeRawValueSpecification,
|
|
92
95
|
} from '@finos/legend-graph';
|
|
93
96
|
import {
|
|
94
97
|
_elementPtr,
|
|
@@ -152,9 +155,14 @@ import {
|
|
|
152
155
|
import { QUERY_BUILDER_PURE_PATH } from '@finos/legend-query-builder';
|
|
153
156
|
import {
|
|
154
157
|
LAKEHOUSE_PRODUCER_DATA_CUBE_SOURCE_TYPE,
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
} from './model/
|
|
158
|
+
LakehouseProducerDataCubeSource,
|
|
159
|
+
RawLakehouseProducerDataCubeSource,
|
|
160
|
+
} from './model/LakehouseProducerDataCubeSource.js';
|
|
161
|
+
import {
|
|
162
|
+
LAKEHOUSE_CONSUMER_DATA_CUBE_SOURCE_TYPE,
|
|
163
|
+
LakehouseConsumerDataCubeSource,
|
|
164
|
+
RawLakehouseConsumerDataCubeSource,
|
|
165
|
+
} from './model/LakehouseConsumerDataCubeSource.js';
|
|
158
166
|
|
|
159
167
|
export class LegendDataCubeDataCubeEngine extends DataCubeEngine {
|
|
160
168
|
private readonly _application: LegendDataCubeApplicationStore;
|
|
@@ -362,7 +370,7 @@ export class LegendDataCubeDataCubeEngine extends DataCubeEngine {
|
|
|
362
370
|
};
|
|
363
371
|
} else if (source.type === LAKEHOUSE_PRODUCER_DATA_CUBE_SOURCE_TYPE) {
|
|
364
372
|
const rawSource =
|
|
365
|
-
|
|
373
|
+
RawLakehouseProducerDataCubeSource.serialization.fromJson(source);
|
|
366
374
|
|
|
367
375
|
return {
|
|
368
376
|
ingestDefinition: {
|
|
@@ -372,6 +380,20 @@ export class LegendDataCubeDataCubeEngine extends DataCubeEngine {
|
|
|
372
380
|
},
|
|
373
381
|
sourceType: source._type,
|
|
374
382
|
};
|
|
383
|
+
} else if (source.type === LAKEHOUSE_CONSUMER_DATA_CUBE_SOURCE_TYPE) {
|
|
384
|
+
const rawSource =
|
|
385
|
+
RawLakehouseConsumerDataCubeSource.serialization.fromJson(source);
|
|
386
|
+
|
|
387
|
+
return {
|
|
388
|
+
dataProduct: {
|
|
389
|
+
environment: rawSource.environment,
|
|
390
|
+
warehouse: rawSource.warehouse,
|
|
391
|
+
path: rawSource.paths[0],
|
|
392
|
+
accessPoint: rawSource.paths[1],
|
|
393
|
+
dpCoordinates: rawSource.dpCoordinates,
|
|
394
|
+
},
|
|
395
|
+
sourceType: source._type,
|
|
396
|
+
};
|
|
375
397
|
}
|
|
376
398
|
return {};
|
|
377
399
|
}
|
|
@@ -679,9 +701,9 @@ export class LegendDataCubeDataCubeEngine extends DataCubeEngine {
|
|
|
679
701
|
}
|
|
680
702
|
case LAKEHOUSE_PRODUCER_DATA_CUBE_SOURCE_TYPE: {
|
|
681
703
|
const rawSource =
|
|
682
|
-
|
|
704
|
+
RawLakehouseProducerDataCubeSource.serialization.fromJson(value);
|
|
683
705
|
|
|
684
|
-
const source = new
|
|
706
|
+
const source = new LakehouseProducerDataCubeSource();
|
|
685
707
|
|
|
686
708
|
const query = new V1_ClassInstance();
|
|
687
709
|
query.type = V1_ClassInstanceType.INGEST_ACCESSOR;
|
|
@@ -709,6 +731,33 @@ export class LegendDataCubeDataCubeEngine extends DataCubeEngine {
|
|
|
709
731
|
}
|
|
710
732
|
return source;
|
|
711
733
|
}
|
|
734
|
+
case LAKEHOUSE_CONSUMER_DATA_CUBE_SOURCE_TYPE: {
|
|
735
|
+
const rawSource =
|
|
736
|
+
RawLakehouseConsumerDataCubeSource.serialization.fromJson(value);
|
|
737
|
+
|
|
738
|
+
const source = new LakehouseConsumerDataCubeSource();
|
|
739
|
+
|
|
740
|
+
source.model = await this._synthesizeLakehouseConsumerPMCD(
|
|
741
|
+
rawSource,
|
|
742
|
+
source,
|
|
743
|
+
);
|
|
744
|
+
|
|
745
|
+
//TODO: add support for parameters
|
|
746
|
+
try {
|
|
747
|
+
source.columns = (
|
|
748
|
+
await this._getLambdaRelationType(
|
|
749
|
+
this.serializeValueSpecification(_lambda([], [source.query])),
|
|
750
|
+
source.model,
|
|
751
|
+
)
|
|
752
|
+
).columns;
|
|
753
|
+
} catch (error) {
|
|
754
|
+
assertErrorThrown(error);
|
|
755
|
+
throw new Error(
|
|
756
|
+
`Can't get query result columns. Make sure the source query return a relation (i.e. typed TDS). Error: ${error.message}`,
|
|
757
|
+
);
|
|
758
|
+
}
|
|
759
|
+
return source;
|
|
760
|
+
}
|
|
712
761
|
default:
|
|
713
762
|
throw new UnsupportedOperationError(
|
|
714
763
|
`Can't process query source of type '${value._type}'`,
|
|
@@ -789,7 +838,14 @@ export class LegendDataCubeDataCubeEngine extends DataCubeEngine {
|
|
|
789
838
|
model: context.model,
|
|
790
839
|
})
|
|
791
840
|
).completions as CompletionItem[];
|
|
792
|
-
} else if (context instanceof
|
|
841
|
+
} else if (context instanceof LakehouseProducerDataCubeSource) {
|
|
842
|
+
return (
|
|
843
|
+
await this._engineServerClient.completeCode({
|
|
844
|
+
codeBlock,
|
|
845
|
+
model: context.model,
|
|
846
|
+
})
|
|
847
|
+
).completions as CompletionItem[];
|
|
848
|
+
} else if (context instanceof LakehouseConsumerDataCubeSource) {
|
|
793
849
|
return (
|
|
794
850
|
await this._engineServerClient.completeCode({
|
|
795
851
|
codeBlock,
|
|
@@ -889,7 +945,9 @@ export class LegendDataCubeDataCubeEngine extends DataCubeEngine {
|
|
|
889
945
|
result = await this._runQuery(query, source.model, undefined, options);
|
|
890
946
|
} else if (source instanceof UserDefinedFunctionDataCubeSource) {
|
|
891
947
|
result = await this._runQuery(query, source.model, undefined, options);
|
|
892
|
-
} else if (source instanceof
|
|
948
|
+
} else if (source instanceof LakehouseProducerDataCubeSource) {
|
|
949
|
+
result = await this._runQuery(query, source.model, undefined, options);
|
|
950
|
+
} else if (source instanceof LakehouseConsumerDataCubeSource) {
|
|
893
951
|
result = await this._runQuery(query, source.model, undefined, options);
|
|
894
952
|
} else if (source instanceof LegendQueryDataCubeSource) {
|
|
895
953
|
const filteredParameterValues = await this._processLegendQueryParams(
|
|
@@ -1013,7 +1071,15 @@ export class LegendDataCubeDataCubeEngine extends DataCubeEngine {
|
|
|
1013
1071
|
undefined,
|
|
1014
1072
|
options,
|
|
1015
1073
|
)) as Response;
|
|
1016
|
-
} else if (source instanceof
|
|
1074
|
+
} else if (source instanceof LakehouseProducerDataCubeSource) {
|
|
1075
|
+
return (await this._runExportQuery(
|
|
1076
|
+
query,
|
|
1077
|
+
source.model,
|
|
1078
|
+
format,
|
|
1079
|
+
undefined,
|
|
1080
|
+
options,
|
|
1081
|
+
)) as Response;
|
|
1082
|
+
} else if (source instanceof LakehouseConsumerDataCubeSource) {
|
|
1017
1083
|
return (await this._runExportQuery(
|
|
1018
1084
|
query,
|
|
1019
1085
|
source.model,
|
|
@@ -1135,7 +1201,12 @@ export class LegendDataCubeDataCubeEngine extends DataCubeEngine {
|
|
|
1135
1201
|
DataCubeFunction.FROM,
|
|
1136
1202
|
[_elementPtr(source.runtime)].filter(isNonNullable),
|
|
1137
1203
|
);
|
|
1138
|
-
} else if (source instanceof
|
|
1204
|
+
} else if (source instanceof LakehouseProducerDataCubeSource) {
|
|
1205
|
+
return _function(
|
|
1206
|
+
DataCubeFunction.FROM,
|
|
1207
|
+
[_elementPtr(source.runtime)].filter(isNonNullable),
|
|
1208
|
+
);
|
|
1209
|
+
} else if (source instanceof LakehouseConsumerDataCubeSource) {
|
|
1139
1210
|
return _function(
|
|
1140
1211
|
DataCubeFunction.FROM,
|
|
1141
1212
|
[_elementPtr(source.runtime)].filter(isNonNullable),
|
|
@@ -1259,7 +1330,9 @@ export class LegendDataCubeDataCubeEngine extends DataCubeEngine {
|
|
|
1259
1330
|
return this._getLambdaRelationType(query, source.model);
|
|
1260
1331
|
} else if (source instanceof LocalFileDataCubeSource) {
|
|
1261
1332
|
return this._getLambdaRelationType(query, source.model);
|
|
1262
|
-
} else if (source instanceof
|
|
1333
|
+
} else if (source instanceof LakehouseProducerDataCubeSource) {
|
|
1334
|
+
return this._getLambdaRelationType(query, source.model);
|
|
1335
|
+
} else if (source instanceof LakehouseConsumerDataCubeSource) {
|
|
1263
1336
|
return this._getLambdaRelationType(query, source.model);
|
|
1264
1337
|
}
|
|
1265
1338
|
throw new UnsupportedOperationError(
|
|
@@ -1550,8 +1623,8 @@ export class LegendDataCubeDataCubeEngine extends DataCubeEngine {
|
|
|
1550
1623
|
}
|
|
1551
1624
|
|
|
1552
1625
|
private _synthesizeLakehouseProducerPMCD(
|
|
1553
|
-
rawSource:
|
|
1554
|
-
source:
|
|
1626
|
+
rawSource: RawLakehouseProducerDataCubeSource,
|
|
1627
|
+
source: LakehouseProducerDataCubeSource,
|
|
1555
1628
|
) {
|
|
1556
1629
|
const runtime = new V1_LakehouseRuntime();
|
|
1557
1630
|
runtime.warehouse = rawSource.warehouse;
|
|
@@ -1580,6 +1653,48 @@ export class LegendDataCubeDataCubeEngine extends DataCubeEngine {
|
|
|
1580
1653
|
return model;
|
|
1581
1654
|
}
|
|
1582
1655
|
|
|
1656
|
+
private async _synthesizeLakehouseConsumerPMCD(
|
|
1657
|
+
rawSource: RawLakehouseConsumerDataCubeSource,
|
|
1658
|
+
source: LakehouseConsumerDataCubeSource,
|
|
1659
|
+
) {
|
|
1660
|
+
const pmcd = await this._depotServerClient.getPureModelContextData(
|
|
1661
|
+
rawSource.dpCoordinates.groupId,
|
|
1662
|
+
rawSource.dpCoordinates.artifactId,
|
|
1663
|
+
rawSource.dpCoordinates.versionId,
|
|
1664
|
+
true,
|
|
1665
|
+
);
|
|
1666
|
+
const deserializedPMCD = guaranteeType(
|
|
1667
|
+
V1_deserializePureModelContext(pmcd),
|
|
1668
|
+
V1_PureModelContextData,
|
|
1669
|
+
);
|
|
1670
|
+
const runtime = new V1_LakehouseRuntime();
|
|
1671
|
+
runtime.warehouse = rawSource.warehouse;
|
|
1672
|
+
runtime.environment = rawSource.environment;
|
|
1673
|
+
|
|
1674
|
+
const packageableRuntime = new V1_PackageableRuntime();
|
|
1675
|
+
packageableRuntime.runtimeValue = runtime;
|
|
1676
|
+
packageableRuntime.name = 'lakehouseConsumer';
|
|
1677
|
+
packageableRuntime.package = 'runtime';
|
|
1678
|
+
source.runtime = packageableRuntime.path;
|
|
1679
|
+
|
|
1680
|
+
deserializedPMCD.elements.push(packageableRuntime);
|
|
1681
|
+
|
|
1682
|
+
const dataProduct = guaranteeType(
|
|
1683
|
+
deserializedPMCD.elements.find((pe) => pe.path === rawSource.paths[0]),
|
|
1684
|
+
V1_DataProduct,
|
|
1685
|
+
);
|
|
1686
|
+
const accessPoint = guaranteeType(
|
|
1687
|
+
dataProduct.accessPointGroups.map((group) =>
|
|
1688
|
+
group.accessPoints.find((point) => point.id === rawSource.paths[1]),
|
|
1689
|
+
)[0],
|
|
1690
|
+
V1_LakehouseAccessPoint,
|
|
1691
|
+
);
|
|
1692
|
+
const lambda = V1_serializeRawValueSpecification(accessPoint.func);
|
|
1693
|
+
source.query = this.deserializeValueSpecification(lambda);
|
|
1694
|
+
|
|
1695
|
+
return V1_serializePureModelContext(deserializedPMCD);
|
|
1696
|
+
}
|
|
1697
|
+
|
|
1583
1698
|
// ---------------------------------- APPLICATION ----------------------------------
|
|
1584
1699
|
|
|
1585
1700
|
override logDebug(message: string, ...data: unknown[]) {
|
|
@@ -71,10 +71,11 @@ import { LocalFileDataCubeSourceLoaderState } from './source/LocalFileDataCubeSo
|
|
|
71
71
|
import { LEGEND_DATACUBE_APP_EVENT } from '../../__lib__/LegendDataCubeEvent.js';
|
|
72
72
|
import { LegendDataCubeQueryEditor } from '../../components/builder/LegendDataCubeQueryEditor.js';
|
|
73
73
|
import type {
|
|
74
|
+
LakehouseContractServerClient,
|
|
74
75
|
LakehouseIngestServerClient,
|
|
75
76
|
LakehousePlatformServerClient,
|
|
76
77
|
} from '@finos/legend-server-lakehouse';
|
|
77
|
-
import { LAKEHOUSE_PRODUCER_DATA_CUBE_SOURCE_TYPE } from '../model/
|
|
78
|
+
import { LAKEHOUSE_PRODUCER_DATA_CUBE_SOURCE_TYPE } from '../model/LakehouseProducerDataCubeSource.js';
|
|
78
79
|
import { LakehouseProducerDataCubeSourceLoaderState } from './source/LakehouseProducerDataCubeSourceLoaderState.js';
|
|
79
80
|
|
|
80
81
|
export class LegendDataCubeBuilderState {
|
|
@@ -134,6 +135,7 @@ export class LegendDataCubeBuilderStore {
|
|
|
134
135
|
readonly depotServerClient: DepotServerClient;
|
|
135
136
|
readonly platformServerClient: LakehousePlatformServerClient;
|
|
136
137
|
readonly ingestServerClient: LakehouseIngestServerClient;
|
|
138
|
+
readonly contractServerClient: LakehouseContractServerClient;
|
|
137
139
|
readonly engineServerClient: V1_EngineServerClient;
|
|
138
140
|
readonly graphManager: V1_PureGraphManager;
|
|
139
141
|
readonly taskService: DataCubeTaskService;
|
|
@@ -185,6 +187,7 @@ export class LegendDataCubeBuilderStore {
|
|
|
185
187
|
this.engineServerClient = baseStore.engineServerClient;
|
|
186
188
|
this.platformServerClient = baseStore.lakehousePlatformServerClient;
|
|
187
189
|
this.ingestServerClient = baseStore.lakehouseIngestServerClient;
|
|
190
|
+
this.contractServerClient = baseStore.lakehouseContractServerClient;
|
|
188
191
|
this.graphManager = baseStore.graphManager;
|
|
189
192
|
this.taskService = baseStore.taskService;
|
|
190
193
|
this.alertService = baseStore.alertService;
|
|
@@ -45,6 +45,7 @@ import { LocalFileDataCubeSourceBuilderState } from './source/LocalFileDataCubeS
|
|
|
45
45
|
import { UserDefinedFunctionDataCubeSourceBuilderState } from './source/UserDefinedFunctionDataCubeSourceBuilderState.js';
|
|
46
46
|
import { LEGEND_DATACUBE_APP_EVENT } from '../../__lib__/LegendDataCubeEvent.js';
|
|
47
47
|
import { LakehouseProducerDataCubeSourceBuilderState } from './source/LakehouseProducerDataCubeSourceBuilderState.js';
|
|
48
|
+
import { LakehouseConsumerDataCubeSourceBuilderState } from './source/LakehouseConsumerDataCubeSourceBuilderState.js';
|
|
48
49
|
|
|
49
50
|
const DEFAULT_SOURCE_TYPE = LegendDataCubeSourceBuilderType.LEGEND_QUERY;
|
|
50
51
|
|
|
@@ -133,6 +134,15 @@ export class LegendDataCubeCreatorState {
|
|
|
133
134
|
this._store.ingestServerClient,
|
|
134
135
|
this._alertService,
|
|
135
136
|
);
|
|
137
|
+
case LegendDataCubeSourceBuilderType.LAKEHOUSE_CONSUMER:
|
|
138
|
+
return new LakehouseConsumerDataCubeSourceBuilderState(
|
|
139
|
+
this._application,
|
|
140
|
+
this._engine,
|
|
141
|
+
this._store.depotServerClient,
|
|
142
|
+
this._store.platformServerClient,
|
|
143
|
+
this._store.contractServerClient,
|
|
144
|
+
this._alertService,
|
|
145
|
+
);
|
|
136
146
|
default:
|
|
137
147
|
throw new UnsupportedOperationError(
|
|
138
148
|
`Can't create source builder for unsupported type '${type}'`,
|