@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.
Files changed (69) hide show
  1. package/lib/application/LegendDataCubeApplicationConfig.d.ts +2 -0
  2. package/lib/application/LegendDataCubeApplicationConfig.d.ts.map +1 -1
  3. package/lib/application/LegendDataCubeApplicationConfig.js +2 -0
  4. package/lib/application/LegendDataCubeApplicationConfig.js.map +1 -1
  5. package/lib/application/__test-utils__/LegendDataCubeApplicationTestUtils.d.ts.map +1 -1
  6. package/lib/application/__test-utils__/LegendDataCubeApplicationTestUtils.js +1 -0
  7. package/lib/application/__test-utils__/LegendDataCubeApplicationTestUtils.js.map +1 -1
  8. package/lib/components/builder/LegendDataCubeCreator.d.ts.map +1 -1
  9. package/lib/components/builder/LegendDataCubeCreator.js +5 -1
  10. package/lib/components/builder/LegendDataCubeCreator.js.map +1 -1
  11. package/lib/components/builder/source/LakehouseConsumerDataCubeSourceBuilder.d.ts +5 -0
  12. package/lib/components/builder/source/LakehouseConsumerDataCubeSourceBuilder.d.ts.map +1 -0
  13. package/lib/components/builder/source/LakehouseConsumerDataCubeSourceBuilder.js +75 -0
  14. package/lib/components/builder/source/LakehouseConsumerDataCubeSourceBuilder.js.map +1 -0
  15. package/lib/index.css +1 -1
  16. package/lib/package.json +1 -1
  17. package/lib/stores/LegendDataCubeBaseStore.d.ts +2 -1
  18. package/lib/stores/LegendDataCubeBaseStore.d.ts.map +1 -1
  19. package/lib/stores/LegendDataCubeBaseStore.js +6 -1
  20. package/lib/stores/LegendDataCubeBaseStore.js.map +1 -1
  21. package/lib/stores/LegendDataCubeDataCubeEngine.d.ts +1 -0
  22. package/lib/stores/LegendDataCubeDataCubeEngine.d.ts.map +1 -1
  23. package/lib/stores/LegendDataCubeDataCubeEngine.js +74 -10
  24. package/lib/stores/LegendDataCubeDataCubeEngine.js.map +1 -1
  25. package/lib/stores/builder/LegendDataCubeBuilderStore.d.ts +2 -1
  26. package/lib/stores/builder/LegendDataCubeBuilderStore.d.ts.map +1 -1
  27. package/lib/stores/builder/LegendDataCubeBuilderStore.js +3 -1
  28. package/lib/stores/builder/LegendDataCubeBuilderStore.js.map +1 -1
  29. package/lib/stores/builder/LegendDataCubeCreatorState.d.ts.map +1 -1
  30. package/lib/stores/builder/LegendDataCubeCreatorState.js +3 -0
  31. package/lib/stores/builder/LegendDataCubeCreatorState.js.map +1 -1
  32. package/lib/stores/builder/source/LakehouseConsumerDataCubeSourceBuilderState.d.ts +58 -0
  33. package/lib/stores/builder/source/LakehouseConsumerDataCubeSourceBuilderState.d.ts.map +1 -0
  34. package/lib/stores/builder/source/LakehouseConsumerDataCubeSourceBuilderState.js +187 -0
  35. package/lib/stores/builder/source/LakehouseConsumerDataCubeSourceBuilderState.js.map +1 -0
  36. package/lib/stores/builder/source/LakehouseProducerDataCubeSourceBuilderState.js +3 -3
  37. package/lib/stores/builder/source/LakehouseProducerDataCubeSourceBuilderState.js.map +1 -1
  38. package/lib/stores/builder/source/LakehouseProducerDataCubeSourceLoaderState.js +4 -4
  39. package/lib/stores/builder/source/LakehouseProducerDataCubeSourceLoaderState.js.map +1 -1
  40. package/lib/stores/builder/source/LegendDataCubeSourceBuilderState.d.ts +2 -1
  41. package/lib/stores/builder/source/LegendDataCubeSourceBuilderState.d.ts.map +1 -1
  42. package/lib/stores/builder/source/LegendDataCubeSourceBuilderState.js +1 -0
  43. package/lib/stores/builder/source/LegendDataCubeSourceBuilderState.js.map +1 -1
  44. package/lib/stores/model/LakehouseConsumerDataCubeSource.d.ts +32 -0
  45. package/lib/stores/model/LakehouseConsumerDataCubeSource.d.ts.map +1 -0
  46. package/lib/stores/model/LakehouseConsumerDataCubeSource.js +38 -0
  47. package/lib/stores/model/LakehouseConsumerDataCubeSource.js.map +1 -0
  48. package/lib/stores/model/{IngestDefinitionDataCubeSource.d.ts → LakehouseProducerDataCubeSource.d.ts} +4 -4
  49. package/lib/stores/model/LakehouseProducerDataCubeSource.d.ts.map +1 -0
  50. package/lib/stores/model/{IngestDefinitionDataCubeSource.js → LakehouseProducerDataCubeSource.js} +4 -4
  51. package/lib/stores/model/LakehouseProducerDataCubeSource.js.map +1 -0
  52. package/package.json +9 -9
  53. package/src/application/LegendDataCubeApplicationConfig.ts +8 -0
  54. package/src/application/__test-utils__/LegendDataCubeApplicationTestUtils.ts +1 -0
  55. package/src/components/builder/LegendDataCubeCreator.tsx +9 -0
  56. package/src/components/builder/source/LakehouseConsumerDataCubeSourceBuilder.tsx +149 -0
  57. package/src/stores/LegendDataCubeBaseStore.ts +8 -0
  58. package/src/stores/LegendDataCubeDataCubeEngine.ts +128 -13
  59. package/src/stores/builder/LegendDataCubeBuilderStore.tsx +4 -1
  60. package/src/stores/builder/LegendDataCubeCreatorState.tsx +10 -0
  61. package/src/stores/builder/source/LakehouseConsumerDataCubeSourceBuilderState.ts +277 -0
  62. package/src/stores/builder/source/LakehouseProducerDataCubeSourceBuilderState.ts +3 -3
  63. package/src/stores/builder/source/LakehouseProducerDataCubeSourceLoaderState.ts +4 -4
  64. package/src/stores/builder/source/LegendDataCubeSourceBuilderState.ts +1 -0
  65. package/src/stores/model/LakehouseConsumerDataCubeSource.ts +52 -0
  66. package/src/stores/model/{IngestDefinitionDataCubeSource.ts → LakehouseProducerDataCubeSource.ts} +3 -3
  67. package/tsconfig.json +4 -1
  68. package/lib/stores/model/IngestDefinitionDataCubeSource.d.ts.map +0 -1
  69. 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
- IngestDefinitionDataCubeSource,
156
- RawIngestDefinitionDataCubeSource,
157
- } from './model/IngestDefinitionDataCubeSource.js';
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
- RawIngestDefinitionDataCubeSource.serialization.fromJson(source);
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
- RawIngestDefinitionDataCubeSource.serialization.fromJson(value);
704
+ RawLakehouseProducerDataCubeSource.serialization.fromJson(value);
683
705
 
684
- const source = new IngestDefinitionDataCubeSource();
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 IngestDefinitionDataCubeSource) {
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 IngestDefinitionDataCubeSource) {
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 IngestDefinitionDataCubeSource) {
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 IngestDefinitionDataCubeSource) {
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 IngestDefinitionDataCubeSource) {
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: RawIngestDefinitionDataCubeSource,
1554
- source: IngestDefinitionDataCubeSource,
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/IngestDefinitionDataCubeSource.js';
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}'`,