@finos/legend-application-data-cube 0.7.5 → 0.7.7

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 (60) hide show
  1. package/lib/__lib__/LegendDataCubeNavigation.d.ts +1 -0
  2. package/lib/__lib__/LegendDataCubeNavigation.d.ts.map +1 -1
  3. package/lib/__lib__/LegendDataCubeNavigation.js +1 -0
  4. package/lib/__lib__/LegendDataCubeNavigation.js.map +1 -1
  5. package/lib/components/builder/LegendDataCubeSourceViewer.d.ts.map +1 -1
  6. package/lib/components/builder/LegendDataCubeSourceViewer.js +5 -3
  7. package/lib/components/builder/LegendDataCubeSourceViewer.js.map +1 -1
  8. package/lib/components/builder/source/LakehouseConsumerDataCubeSourceBuilder.d.ts.map +1 -1
  9. package/lib/components/builder/source/LakehouseConsumerDataCubeSourceBuilder.js +16 -15
  10. package/lib/components/builder/source/LakehouseConsumerDataCubeSourceBuilder.js.map +1 -1
  11. package/lib/components/builder/source/LakehouseConsumerDataCubeSourceLoader.d.ts +22 -0
  12. package/lib/components/builder/source/LakehouseConsumerDataCubeSourceLoader.d.ts.map +1 -0
  13. package/lib/components/builder/source/LakehouseConsumerDataCubeSourceLoader.js +35 -0
  14. package/lib/components/builder/source/LakehouseConsumerDataCubeSourceLoader.js.map +1 -0
  15. package/lib/components/builder/source/LegendDataCubeSourceLoader.d.ts.map +1 -1
  16. package/lib/components/builder/source/LegendDataCubeSourceLoader.js +3 -1
  17. package/lib/components/builder/source/LegendDataCubeSourceLoader.js.map +1 -1
  18. package/lib/index.css +1 -1
  19. package/lib/package.json +1 -1
  20. package/lib/stores/LegendDataCubeDataCubeEngine.d.ts +2 -0
  21. package/lib/stores/LegendDataCubeDataCubeEngine.d.ts.map +1 -1
  22. package/lib/stores/LegendDataCubeDataCubeEngine.js +82 -8
  23. package/lib/stores/LegendDataCubeDataCubeEngine.js.map +1 -1
  24. package/lib/stores/builder/LegendDataCubeBuilderStore.d.ts.map +1 -1
  25. package/lib/stores/builder/LegendDataCubeBuilderStore.js +4 -0
  26. package/lib/stores/builder/LegendDataCubeBuilderStore.js.map +1 -1
  27. package/lib/stores/builder/source/LakehouseConsumerDataCubeSourceBuilderState.d.ts +10 -2
  28. package/lib/stores/builder/source/LakehouseConsumerDataCubeSourceBuilderState.d.ts.map +1 -1
  29. package/lib/stores/builder/source/LakehouseConsumerDataCubeSourceBuilderState.js +84 -22
  30. package/lib/stores/builder/source/LakehouseConsumerDataCubeSourceBuilderState.js.map +1 -1
  31. package/lib/stores/builder/source/LakehouseConsumerDataCubeSourceLoaderState.d.ts +38 -0
  32. package/lib/stores/builder/source/LakehouseConsumerDataCubeSourceLoaderState.d.ts.map +1 -0
  33. package/lib/stores/builder/source/LakehouseConsumerDataCubeSourceLoaderState.js +87 -0
  34. package/lib/stores/builder/source/LakehouseConsumerDataCubeSourceLoaderState.js.map +1 -0
  35. package/lib/stores/builder/source/LakehouseProducerDataCubeSourceLoaderState.d.ts +1 -2
  36. package/lib/stores/builder/source/LakehouseProducerDataCubeSourceLoaderState.d.ts.map +1 -1
  37. package/lib/stores/builder/source/LakehouseProducerDataCubeSourceLoaderState.js +1 -2
  38. package/lib/stores/builder/source/LakehouseProducerDataCubeSourceLoaderState.js.map +1 -1
  39. package/lib/stores/model/LakehouseConsumerDataCubeSource.d.ts +18 -3
  40. package/lib/stores/model/LakehouseConsumerDataCubeSource.d.ts.map +1 -1
  41. package/lib/stores/model/LakehouseConsumerDataCubeSource.js +60 -4
  42. package/lib/stores/model/LakehouseConsumerDataCubeSource.js.map +1 -1
  43. package/lib/stores/model/LakehouseProducerDataCubeSource.d.ts +3 -0
  44. package/lib/stores/model/LakehouseProducerDataCubeSource.d.ts.map +1 -1
  45. package/lib/stores/model/LakehouseProducerDataCubeSource.js +3 -0
  46. package/lib/stores/model/LakehouseProducerDataCubeSource.js.map +1 -1
  47. package/package.json +8 -8
  48. package/src/__lib__/LegendDataCubeNavigation.ts +7 -0
  49. package/src/components/builder/LegendDataCubeSourceViewer.tsx +19 -11
  50. package/src/components/builder/source/LakehouseConsumerDataCubeSourceBuilder.tsx +35 -34
  51. package/src/components/builder/source/LakehouseConsumerDataCubeSourceLoader.tsx +69 -0
  52. package/src/components/builder/source/LegendDataCubeSourceLoader.tsx +10 -0
  53. package/src/stores/LegendDataCubeDataCubeEngine.ts +88 -11
  54. package/src/stores/builder/LegendDataCubeBuilderStore.tsx +12 -0
  55. package/src/stores/builder/source/LakehouseConsumerDataCubeSourceBuilderState.ts +125 -29
  56. package/src/stores/builder/source/LakehouseConsumerDataCubeSourceLoaderState.ts +169 -0
  57. package/src/stores/builder/source/LakehouseProducerDataCubeSourceLoaderState.ts +0 -3
  58. package/src/stores/model/LakehouseConsumerDataCubeSource.ts +100 -7
  59. package/src/stores/model/LakehouseProducerDataCubeSource.ts +3 -0
  60. package/tsconfig.json +2 -0
@@ -0,0 +1,169 @@
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
+
17
+ import {
18
+ guaranteeNonNullable,
19
+ guaranteeType,
20
+ type PlainObject,
21
+ } from '@finos/legend-shared';
22
+ import type { LegendDataCubeApplicationStore } from '../../LegendDataCubeBaseStore.js';
23
+ import type { LegendDataCubeDataCubeEngine } from '../../LegendDataCubeDataCubeEngine.js';
24
+ import { LegendDataCubeSourceLoaderState } from './LegendDataCubeSourceLoaderState.js';
25
+ import type { DataCubeAlertService } from '@finos/legend-data-cube';
26
+ import {
27
+ V1_AdHocDeploymentDataProductOrigin,
28
+ V1_entitlementsDataProductDetailsResponseToDataProductDetails,
29
+ V1_EntitlementsLakehouseEnvironmentType,
30
+ type PersistentDataCube,
31
+ } from '@finos/legend-graph';
32
+ import type { LakehouseContractServerClient } from '@finos/legend-server-lakehouse';
33
+ import { action, makeObservable, observable } from 'mobx';
34
+ import { LegendDataCubeSourceBuilderType } from './LegendDataCubeSourceBuilderState.js';
35
+ import {
36
+ LakehouseEnvironmentType,
37
+ RawLakehouseConsumerDataCubeSource,
38
+ RawLakehouseSdlcOrigin,
39
+ } from '../../model/LakehouseConsumerDataCubeSource.js';
40
+
41
+ export class LakehouseConsumerDataCubeSourceLoaderState extends LegendDataCubeSourceLoaderState {
42
+ fullGraphGrammar: string | undefined;
43
+ dataProductId: string | undefined;
44
+ dpLoaded: boolean;
45
+ environment: string | undefined;
46
+
47
+ constructor(
48
+ application: LegendDataCubeApplicationStore,
49
+ engine: LegendDataCubeDataCubeEngine,
50
+ alertService: DataCubeAlertService,
51
+ sourceData: PlainObject,
52
+ persistentDataCube: PersistentDataCube,
53
+ onSuccess: () => Promise<void>,
54
+ onError: (error: unknown) => Promise<void>,
55
+ ) {
56
+ super(
57
+ application,
58
+ engine,
59
+ alertService,
60
+ sourceData,
61
+ persistentDataCube,
62
+ onSuccess,
63
+ onError,
64
+ );
65
+ this.dpLoaded = false;
66
+
67
+ makeObservable(this, {
68
+ dpLoaded: observable,
69
+ setDpLoaded: action,
70
+
71
+ dataProductId: observable,
72
+ setDataProductId: action,
73
+ });
74
+ }
75
+
76
+ setDpLoaded(dpLoaded: boolean) {
77
+ this.dpLoaded = dpLoaded;
78
+ }
79
+
80
+ setDataProductId(id: string | undefined) {
81
+ this.dataProductId = id;
82
+ }
83
+
84
+ override get isValid(): boolean {
85
+ return this.dpLoaded;
86
+ }
87
+
88
+ override get label() {
89
+ return LegendDataCubeSourceBuilderType.LAKEHOUSE_CONSUMER;
90
+ }
91
+
92
+ reset() {
93
+ const rawSource = RawLakehouseConsumerDataCubeSource.serialization.fromJson(
94
+ this.sourceData,
95
+ );
96
+ if (
97
+ !rawSource.origin ||
98
+ rawSource.origin instanceof RawLakehouseSdlcOrigin
99
+ ) {
100
+ this.setDpLoaded(true);
101
+ } else {
102
+ this.setDpLoaded(false);
103
+ }
104
+ this.setDataProductId(rawSource.paths[0]);
105
+ this.environment = rawSource.environment;
106
+ this.fullGraphGrammar = undefined;
107
+ }
108
+
109
+ async loadAdhocDataProduct(
110
+ access_token: string | undefined,
111
+ lakehouseContractServerClient: LakehouseContractServerClient,
112
+ ) {
113
+ const dataProducts =
114
+ V1_entitlementsDataProductDetailsResponseToDataProductDetails(
115
+ await lakehouseContractServerClient.getDataProduct(
116
+ this.dataProductId?.split('::').pop() ?? '',
117
+ access_token,
118
+ ),
119
+ );
120
+
121
+ const selectedEnv = guaranteeNonNullable(this.environment);
122
+
123
+ const dataProduct = selectedEnv.includes(
124
+ LakehouseEnvironmentType.DEVELOPMENT,
125
+ )
126
+ ? dataProducts.find(
127
+ (dp) =>
128
+ dp.lakehouseEnvironment?.type ===
129
+ V1_EntitlementsLakehouseEnvironmentType.DEVELOPMENT,
130
+ )
131
+ : selectedEnv.includes(LakehouseEnvironmentType.PRODUCTION_PARALLEL)
132
+ ? dataProducts.find(
133
+ (dp) =>
134
+ dp.lakehouseEnvironment?.type ===
135
+ V1_EntitlementsLakehouseEnvironmentType.PRODUCTION_PARALLEL,
136
+ )
137
+ : dataProducts.find(
138
+ (dp) =>
139
+ dp.lakehouseEnvironment?.type ===
140
+ V1_EntitlementsLakehouseEnvironmentType.PRODUCTION,
141
+ );
142
+
143
+ if (
144
+ dataProduct?.origin &&
145
+ dataProduct.origin instanceof V1_AdHocDeploymentDataProductOrigin
146
+ ) {
147
+ this.fullGraphGrammar = guaranteeType(
148
+ dataProduct.origin,
149
+ V1_AdHocDeploymentDataProductOrigin,
150
+ ).definition;
151
+ this.setDpLoaded(true);
152
+ }
153
+ }
154
+
155
+ override async load(source: PlainObject | undefined) {
156
+ const deserializedSource =
157
+ RawLakehouseConsumerDataCubeSource.serialization.fromJson(
158
+ guaranteeNonNullable(source),
159
+ );
160
+
161
+ if (this.fullGraphGrammar) {
162
+ this._engine.registerAdhocDataProductGraphGrammar(this.fullGraphGrammar);
163
+ }
164
+
165
+ return RawLakehouseConsumerDataCubeSource.serialization.toJson(
166
+ deserializedSource,
167
+ );
168
+ }
169
+ }
@@ -15,7 +15,6 @@
15
15
  */
16
16
 
17
17
  import {
18
- ActionState,
19
18
  guaranteeNonNullable,
20
19
  guaranteeType,
21
20
  type PlainObject,
@@ -38,8 +37,6 @@ import type { UserManagerSettings } from 'oidc-client-ts';
38
37
  import { SecondaryOAuthClient } from '../../model/SecondaryOauthClient.js';
39
38
 
40
39
  export class LakehouseProducerDataCubeSourceLoaderState extends LegendDataCubeSourceLoaderState {
41
- readonly processState = ActionState.create();
42
-
43
40
  ingestDefinition: PlainObject | undefined;
44
41
  ingestDefinitionUrn: string;
45
42
  ingestServerUrl: string;
@@ -15,42 +15,135 @@
15
15
  */
16
16
 
17
17
  import { DataCubeSource } from '@finos/legend-data-cube';
18
- import type { V1_PureModelContextData } from '@finos/legend-graph';
18
+ import {
19
+ V1_DataProductOriginType,
20
+ type V1_PureModelContextData,
21
+ } from '@finos/legend-graph';
19
22
  import { VersionedProjectData } from '@finos/legend-server-depot';
20
23
  import {
24
+ optionalCustom,
21
25
  SerializationFactory,
26
+ UnsupportedOperationError,
22
27
  usingConstantValueSchema,
23
28
  usingModelSchema,
24
29
  type PlainObject,
25
30
  } from '@finos/legend-shared';
26
- import { createModelSchema, list, primitive } from 'serializr';
31
+ import {
32
+ createModelSchema,
33
+ deserialize,
34
+ list,
35
+ optional,
36
+ primitive,
37
+ serialize,
38
+ } from 'serializr';
27
39
 
28
40
  export const LAKEHOUSE_CONSUMER_DATA_CUBE_SOURCE_TYPE = 'lakehouseConsumer';
29
41
 
30
42
  export class LakehouseConsumerDataCubeSource extends DataCubeSource {
31
43
  model!: PlainObject<V1_PureModelContextData>;
32
- dpCoordinates!: VersionedProjectData;
44
+ dpCoordinates?: VersionedProjectData;
33
45
  runtime!: string;
34
46
  warehouse!: string;
35
47
  environment!: string;
36
48
  paths!: string[];
49
+ deploymentId?: number | undefined;
37
50
  }
38
51
 
39
- export class RawLakehouseConsumerDataCubeSource {
52
+ export enum LakehouseEnvironmentType {
53
+ DEVELOPMENT = 'dev',
54
+ PRODUCTION_PARALLEL = 'pp',
55
+ }
56
+
57
+ export abstract class RawLakehouseOrigin {}
58
+
59
+ export class RawLakehouseAdhocOrigin extends RawLakehouseOrigin {
60
+ static readonly serialization = new SerializationFactory(
61
+ createModelSchema(RawLakehouseAdhocOrigin, {
62
+ _type: usingConstantValueSchema(
63
+ V1_DataProductOriginType.AD_HOC_DEPLOYMENT,
64
+ ),
65
+ }),
66
+ );
67
+ }
68
+
69
+ export class RawLakehouseSdlcOrigin extends RawLakehouseOrigin {
40
70
  dpCoordinates!: VersionedProjectData;
71
+
72
+ static readonly serialization = new SerializationFactory(
73
+ createModelSchema(RawLakehouseSdlcOrigin, {
74
+ _type: usingConstantValueSchema(V1_DataProductOriginType.SDLC_DEPLOYMENT),
75
+ dpCoordinates: usingModelSchema(
76
+ VersionedProjectData.serialization.schema,
77
+ ),
78
+ }),
79
+ );
80
+ }
81
+
82
+ export class RawLakehouseConsumerDataCubeSource {
41
83
  warehouse!: string;
42
84
  environment!: string;
43
85
  paths!: string[];
86
+ deploymentId?: number | undefined;
87
+ origin?: RawLakehouseOrigin;
44
88
 
45
89
  static readonly serialization = new SerializationFactory(
46
90
  createModelSchema(RawLakehouseConsumerDataCubeSource, {
47
91
  _type: usingConstantValueSchema(LAKEHOUSE_CONSUMER_DATA_CUBE_SOURCE_TYPE),
48
- dpCoordinates: usingModelSchema(
49
- VersionedProjectData.serialization.schema,
50
- ),
51
92
  warehouse: primitive(),
52
93
  environment: primitive(),
53
94
  paths: list(primitive()),
95
+ deploymentId: optional(primitive()),
96
+ origin: optionalCustom(
97
+ (value) => {
98
+ if (value instanceof RawLakehouseAdhocOrigin) {
99
+ return serialize(
100
+ RawLakehouseAdhocOrigin.serialization.schema,
101
+ value,
102
+ );
103
+ } else if (value instanceof RawLakehouseSdlcOrigin) {
104
+ return serialize(
105
+ RawLakehouseSdlcOrigin.serialization.schema,
106
+ value,
107
+ );
108
+ } else {
109
+ throw new Error(
110
+ `Can't serialize RawLakehouseOrigin: no compatible serialization schema available from the provided value`,
111
+ );
112
+ }
113
+ },
114
+ (jsonValue) => {
115
+ switch (jsonValue._type) {
116
+ case V1_DataProductOriginType.AD_HOC_DEPLOYMENT:
117
+ return deserialize(
118
+ RawLakehouseAdhocOrigin.serialization.schema,
119
+ jsonValue,
120
+ );
121
+ case V1_DataProductOriginType.SDLC_DEPLOYMENT:
122
+ return deserialize(
123
+ RawLakehouseSdlcOrigin.serialization.schema,
124
+ jsonValue,
125
+ );
126
+ default:
127
+ throw new UnsupportedOperationError(
128
+ `Can't deserialize RawLakehouseOrigin: no compatible deserialization schema for type '${jsonValue._type}'`,
129
+ );
130
+ }
131
+ },
132
+ {
133
+ beforeDeserialize: (callback, jsonValue, jsonParentValue) => {
134
+ /** backward compatibility for dpCoordinates */
135
+ if (!jsonValue && jsonParentValue.dpCoordinates) {
136
+ const origin = {
137
+ _type: V1_DataProductOriginType.SDLC_DEPLOYMENT,
138
+ dpCoordinates: jsonParentValue.dpCoordinates,
139
+ } as PlainObject;
140
+ callback(null, origin);
141
+ } else {
142
+ callback(null, jsonValue);
143
+ }
144
+ },
145
+ },
146
+ ),
54
147
  }),
55
148
  );
56
149
  }
@@ -29,6 +29,8 @@ export const LAKEHOUSE_PRODUCER_DATA_CUBE_SOURCE_TYPE = 'lakehouseProducer';
29
29
  export class LakehouseProducerDataCubeSource extends DataCubeSource {
30
30
  model!: PlainObject<V1_PureModelContextData>;
31
31
  runtime!: string;
32
+ paths!: string[];
33
+ warehouse!: string;
32
34
  }
33
35
 
34
36
  export class LakehouseProducerIcebergCachedDataCubeSource extends DataCubeSource {
@@ -37,6 +39,7 @@ export class LakehouseProducerIcebergCachedDataCubeSource extends DataCubeSource
37
39
  db!: string;
38
40
  schema!: string;
39
41
  table!: string;
42
+ paths!: string[];
40
43
  }
41
44
 
42
45
  export class IcebergConfig {
package/tsconfig.json CHANGED
@@ -68,6 +68,7 @@
68
68
  "./src/stores/LegendDataCubeDuckDBEngine.ts",
69
69
  "./src/stores/builder/source/FreeformTDSExpressionDataCubeSourceBuilderState.ts",
70
70
  "./src/stores/builder/source/LakehouseConsumerDataCubeSourceBuilderState.ts",
71
+ "./src/stores/builder/source/LakehouseConsumerDataCubeSourceLoaderState.ts",
71
72
  "./src/stores/builder/source/LakehouseProducerDataCubeSourceBuilderState.ts",
72
73
  "./src/stores/builder/source/LakehouseProducerDataCubeSourceLoaderState.ts",
73
74
  "./src/stores/builder/source/LegendDataCubeSourceBuilderState.ts",
@@ -96,6 +97,7 @@
96
97
  "./src/components/builder/LegendDataCubeSourceViewer.tsx",
97
98
  "./src/components/builder/source/FreeformTDSExpressionDataCubeSourceBuilder.tsx",
98
99
  "./src/components/builder/source/LakehouseConsumerDataCubeSourceBuilder.tsx",
100
+ "./src/components/builder/source/LakehouseConsumerDataCubeSourceLoader.tsx",
99
101
  "./src/components/builder/source/LakehouseProducerDataCubeSourceBuilder.tsx",
100
102
  "./src/components/builder/source/LakehouseProducerDataCubeSourceLoader.tsx",
101
103
  "./src/components/builder/source/LegendDataCubeSourceLoader.tsx",