Skip to content

Commit

Permalink
support data cube with parameter inputs (#3587)
Browse files Browse the repository at this point in the history
  • Loading branch information
MauricioUyaguari authored Oct 10, 2024
1 parent ca895ff commit 17e37a5
Show file tree
Hide file tree
Showing 8 changed files with 65 additions and 20 deletions.
5 changes: 5 additions & 0 deletions .changeset/fluffy-pumas-kneel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@finos/legend-application-studio-bootstrap': patch
'@finos/legend-application-query': patch
'@finos/legend-query-builder': patch
---
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,10 @@ export class ExistingQueryDataCubeEditorStore {
(yield this.graphManagerState.graphManager.pureCodeToLambda(
content,
)) as unknown as RawLambda;
// TODO: we should be able to call engine and convert lambda to relation if not one.
const engine = new QueryBuilderDataCubeEngine(
lambda,
undefined,
execConext.mapping,
execConext.runtime,
this.graphManagerState,
Expand Down
3 changes: 3 additions & 0 deletions packages/legend-application-studio-bootstrap/scripts/setup.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,9 @@ export const setup = (outputDir) => {
// ],
TEMPORARY__enableLocalConnectionBuilder: false,
NonProductionFeatureFlag: true,
queryBuilderConfig: {
TEMPORARY__enableExportToCube: true,
},
},
},
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,31 +27,19 @@ import {
WindowMaximizeIcon,
} from '@finos/legend-art';
import { useState } from 'react';
import { RuntimePointer } from '@finos/legend-graph';
import { QueryBuilderDataCubeEngine } from '../../stores/data-cube/QueryBuilderDataCubeEngine.js';
import { createDataCubeEngineFromQueryBuilder } from '../../stores/data-cube/QueryBuilderDataCubeEngineHelper.js';

const QueryBuilderDataCube = observer(
(props: { queryBuilderState: QueryBuilderState }) => {
const { queryBuilderState } = props;
const applicationStore = new QueryBuilderDataCubeApplicationEngine(
queryBuilderState.applicationStore,
);
const runtime =
queryBuilderState.executionContextState.runtimeValue instanceof
RuntimePointer
? queryBuilderState.executionContextState.runtimeValue
.packageableRuntime.value.path
: undefined;
if (!runtime) {
// TODO: add better message
const queryBuilderEngine =
createDataCubeEngineFromQueryBuilder(queryBuilderState);
if (!queryBuilderEngine) {
return null;
}
const queryBuilderEngine = new QueryBuilderDataCubeEngine(
queryBuilderState.buildQuery(),
queryBuilderState.executionContextState.mapping?.path,
runtime,
queryBuilderState.graphManagerState,
);

return (
<DataCubeProvider
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,28 @@ export const QueryBuilderResultPanel = observer(
}
resultState.pressedRunQuery.complete();
};

const openDataCube = (): void => {
if (
queryParametersState.parameterStates.length &&
queryParametersState.parameterStates.find(
(param) =>
!queryBuilderState.milestoningState.isMilestoningParameter(
param.parameter,
),
)
) {
queryParametersState.parameterValuesEditorState.open(
(): Promise<void> => {
queryBuilderState.setIsCubeEnabled(true);
return Promise.resolve();
},
PARAMETER_SUBMIT_ACTION.DATA_CUBE,
);
} else {
queryBuilderState.setIsCubeEnabled(true);
}
};
const cancelQuery = applicationStore.guardUnhandledError(() =>
flowResult(resultState.cancelQuery()),
);
Expand Down Expand Up @@ -841,9 +863,7 @@ export const QueryBuilderResultPanel = observer(
</MenuContentItem>
{queryBuilderState.config?.TEMPORARY__enableExportToCube && (
<MenuContentItem
onClick={(): void =>
queryBuilderState.setIsCubeEnabled(true)
}
onClick={openDataCube}
disabled={
!queryBuilderState.fetchStructureState.implementation
.canBeExportedToCube ||
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import {
type GraphManagerState,
type PureModel,
type V1_ValueSpecification,
type ParameterValue,
} from '@finos/legend-graph';
import {
_elementPtr,
Expand Down Expand Up @@ -67,9 +68,13 @@ export class QueryBuilderDataCubeEngine extends DataCubeEngine {
readonly graphState: GraphManagerState;
readonly selectInitialQuery: RawLambda;
readonly mappingPath: string | undefined;
readonly parameterValues: ParameterValue[] | undefined;
readonly runtimePath: string;
_parameters: object | undefined;

constructor(
selectQuery: RawLambda,
parameterValues: ParameterValue[] | undefined,
mappingPath: string | undefined,
runtimePath: string,
graphManagerState: GraphManagerState,
Expand All @@ -79,6 +84,7 @@ export class QueryBuilderDataCubeEngine extends DataCubeEngine {
this.selectInitialQuery = selectQuery;
this.mappingPath = mappingPath;
this.runtimePath = runtimePath;
this.parameterValues = parameterValues;
}

get sourceLabel(): string {
Expand All @@ -105,6 +111,7 @@ export class QueryBuilderDataCubeEngine extends DataCubeEngine {
) {
srcFuncExp = srcFuncExp.body[0];
}
this._parameters = this.selectInitialQuery.parameters;
const fromFuncExp = new V1_AppliedFunction();
fromFuncExp.function = _functionName(SUPPORTED_FUNCTIONS.FROM);
fromFuncExp.parameters = [srcFuncExp];
Expand Down Expand Up @@ -239,12 +246,16 @@ export class QueryBuilderDataCubeEngine extends DataCubeEngine {
executedSQL: string;
}> {
const lambda = this.buildRawLambdaFromValueSpec(query);
lambda.parameters = this._parameters;
const [executionWithMetadata, queryString] = await Promise.all([
this.graphState.graphManager.runQuery(
lambda,
undefined,
undefined,
this.graph,
{
parameterValues: this.parameterValues ?? [],
},
),
this.graphState.graphManager.lambdaToPureCode(lambda),
]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,13 @@
*/

import { type DataCubeEngine } from '@finos/legend-data-cube';
import type { QueryBuilderState } from '../QueryBuilderState.js';
import {
QUERY_BUILDER_LAMBDA_WRITER_MODE,
type QueryBuilderState,
} from '../QueryBuilderState.js';
import { RuntimePointer } from '@finos/legend-graph';
import { QueryBuilderDataCubeEngine } from './QueryBuilderDataCubeEngine.js';
import { buildExecutionParameterValues } from '../shared/LambdaParameterState.js';

export const createDataCubeEngineFromQueryBuilder = (
queryBuilderState: QueryBuilderState,
Expand All @@ -31,11 +35,22 @@ export const createDataCubeEngineFromQueryBuilder = (
if (!runtime) {
return undefined;
}
const currentLambdaWriterMode = queryBuilderState.lambdaWriteMode;
// ensure we write in new tds mode
queryBuilderState.setLambdaWriteMode(
QUERY_BUILDER_LAMBDA_WRITER_MODE.TYPED_FETCH_STRUCTURE,
);
const parameterValues = buildExecutionParameterValues(
queryBuilderState.parametersState.parameterStates,
queryBuilderState.graphManagerState,
);
const queryBuilderEngine = new QueryBuilderDataCubeEngine(
queryBuilderState.buildQuery(),
parameterValues,
queryBuilderState.executionContextState.mapping?.path,
runtime,
queryBuilderState.graphManagerState,
);
queryBuilderState.setLambdaWriteMode(currentLambdaWriterMode);
return queryBuilderEngine;
};
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ import {
export enum PARAMETER_SUBMIT_ACTION {
RUN = 'RUN',
EXPORT = 'EXPORT',
DATA_CUBE = 'DATA_CUBE',
}

enum LAMABA_PARAMETER_HASH_STRUCTURE {
Expand Down

0 comments on commit 17e37a5

Please sign in to comment.