From 24aef953fceb7c964fc42a5f217a9e3d5d0bde3a Mon Sep 17 00:00:00 2001 From: Janeen Yamak <88203072+janeenyamak1@users.noreply.github.com> Date: Mon, 17 Jul 2023 10:39:09 -0500 Subject: [PATCH] fix match in mapping (#1996) --- .../m2m/tests/legend/functionInMapping.pure | 46 +++++++++++++++++++ .../planConventions/langLibrary.pure | 2 +- .../executionPlanTest.pure | 12 +++++ 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/legend-engine-pure-code/legend-engine-pure-code-compiled-core/src/main/resources/core/store/m2m/tests/legend/functionInMapping.pure b/legend-engine-pure-code/legend-engine-pure-code-compiled-core/src/main/resources/core/store/m2m/tests/legend/functionInMapping.pure index 5b6d90fc7ae..57e0b44ade1 100644 --- a/legend-engine-pure-code/legend-engine-pure-code-compiled-core/src/main/resources/core/store/m2m/tests/legend/functionInMapping.pure +++ b/legend-engine-pure-code/legend-engine-pure-code-compiled-core/src/main/resources/core/store/m2m/tests/legend/functionInMapping.pure @@ -96,6 +96,18 @@ meta::pure::mapping::modelToModel::test::alloy::simple::testConflictVariableInMa assertEquals($expected, $json); } +function <> +{ serverVersion.start='v1_19_0'} +meta::pure::mapping::modelToModel::test::alloy::simple::testMatchInMapping(): Boolean[1] +{ + let runtime = testJsonRuntime(Firm, '[{"employees":[{"@type":"PersonA","role":"developer","firstNameA":"Smith","firstName":"testFirstName","lastName":"testLastName"}]}]'); + let lambda = {|AllEmployees.all()->meta::pure::graphFetch::execution::graphFetch(#{meta::pure::mapping::modelToModel::test::alloy::simple::function::AllEmployees{names}}#)->meta::pure::graphFetch::execution::serialize(#{meta::pure::mapping::modelToModel::test::alloy::simple::function::AllEmployees{names}}#)}; + let result = execute($lambda, meta::pure::mapping::modelToModel::test::alloy::simple::function::MatchMappingTest, $runtime, meta::pure::extension::defaultExtensions()); + let json = $result.values->toOne(); + let expected = '{"names":[]}'; + assert(meta::json::jsonEquivalent($expected->meta::json::parseJSON(), $json->meta::json::parseJSON())); +} + Class meta::pure::mapping::modelToModel::test::alloy::simple::function::Firm { name: String[0..1]; @@ -109,11 +121,27 @@ Class meta::pure::mapping::modelToModel::test::alloy::simple::function::Person role: meta::pure::mapping::modelToModel::test::alloy::simple::function::EmployeeRole[0..1]; } +Class meta::pure::mapping::modelToModel::test::alloy::simple::function::PersonA extends Person +{ + firstNameA: String[1]; +} + +Class meta::pure::mapping::modelToModel::test::alloy::simple::function::PersonB extends Person +{ + firstNameB: String[1]; + middleNames: String[*]; +} + Class meta::pure::mapping::modelToModel::test::alloy::simple::function::FirstEmployee { name: String[0..1]; } +Class meta::pure::mapping::modelToModel::test::alloy::simple::function::AllEmployees +{ + names: String[*]; +} + Enum meta::pure::mapping::modelToModel::test::alloy::simple::function::EmployeeRole { developer, @@ -153,3 +181,21 @@ Mapping meta::pure::mapping::modelToModel::test::alloy::simple::function::defaul name: $src.employees->filter(x|$x.role.name == 'developer')->first().firstName } ) + +###Mapping + + Mapping meta::pure::mapping::modelToModel::test::alloy::simple::function::MatchMappingTest + ( + meta::pure::mapping::modelToModel::test::alloy::simple::function::AllEmployees: Pure + { + ~src meta::pure::mapping::modelToModel::test::alloy::simple::function::Firm + names: $src.employees->map( + c|$c->match( + [ + personA: meta::pure::mapping::modelToModel::test::alloy::simple::function::PersonA[1]|[], + personB: meta::pure::mapping::modelToModel::test::alloy::simple::function::PersonB[1]|$personB.firstNameB + ] + ) + ) + } + ) \ No newline at end of file diff --git a/legend-engine-xt-javaPlatformBinding-pure/src/main/resources/core_java_platform_binding/legendJavaPlatformBinding/planConventions/langLibrary.pure b/legend-engine-xt-javaPlatformBinding-pure/src/main/resources/core_java_platform_binding/legendJavaPlatformBinding/planConventions/langLibrary.pure index f895120ed71..8301df933d3 100644 --- a/legend-engine-xt-javaPlatformBinding-pure/src/main/resources/core_java_platform_binding/legendJavaPlatformBinding/planConventions/langLibrary.pure +++ b/legend-engine-xt-javaPlatformBinding-pure/src/main/resources/core_java_platform_binding/legendJavaPlatformBinding/planConventions/langLibrary.pure @@ -142,7 +142,7 @@ function meta::pure::executionPlan::platformBinding::legendJava::library::lang:: )->j_cast(javaFunction(javaObject(), $type)); let mainTemp = $v->cast(@LambdaFunction)->processLambda($ctx.conventions, noDebug()); - let main = if($v->cast(@LambdaFunction).expressionSequence->last()->toOne()->isNil(), + let main = if($v->cast(@LambdaFunction).expressionSequence->last()->toOne()->isNil() && !$ctx.returnType->isJavaList(), | let params = $mainTemp->cast(@Lambda).parameters; j_lambda($params, j_null()->j_cast($ctx.returnType), javaFunctionType($params.type, $ctx.returnType));, | $mainTemp); diff --git a/legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-javaPlatformBinding-pure/src/main/resources/core_relational_java_platform_binding/legendJavaPlatformBinding/executionPlanTest.pure b/legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-javaPlatformBinding-pure/src/main/resources/core_relational_java_platform_binding/legendJavaPlatformBinding/executionPlanTest.pure index 6d95312a3bb..7fd95d60899 100644 --- a/legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-javaPlatformBinding-pure/src/main/resources/core_relational_java_platform_binding/legendJavaPlatformBinding/executionPlanTest.pure +++ b/legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-javaPlatformBinding-pure/src/main/resources/core_relational_java_platform_binding/legendJavaPlatformBinding/executionPlanTest.pure @@ -555,6 +555,18 @@ function <> meta::relational::executionPlan::platformBinding::legendJ assertEquals($expectedJava, $withJava->planToString(true, meta::relational::extension::relationalExtensions())); } +function <> meta::relational::executionPlan::platformBinding::legendJava::tests::javaGenerationWithMatchInMapping() : Boolean[1] +{ + let runtime = meta::pure::mapping::modelToModel::test::alloy::utils::testJsonRuntime(meta::pure::mapping::modelToModel::test::alloy::simple::function::Firm, '[{"employees":[{"@type":"PersonA","role":"developer","firstNameA":"Smith","firstName":"testFirstName","lastName":"testLastName"}]}]'); + let lambda = {|meta::pure::mapping::modelToModel::test::alloy::simple::function::AllEmployees.all()->meta::pure::graphFetch::execution::graphFetch(#{meta::pure::mapping::modelToModel::test::alloy::simple::function::AllEmployees{names}}#)->meta::pure::graphFetch::execution::serialize(#{meta::pure::mapping::modelToModel::test::alloy::simple::function::AllEmployees{names}}#)}; + let expected = 'PureExp(type=Stringexpression=->serialize(#{meta::pure::mapping::modelToModel::test::alloy::simple::function::AllEmployees{names}}#)(StoreMappingGlobalGraphFetch(type=PartialClass[impls=[(meta::pure::mapping::modelToModel::test::alloy::simple::function::AllEmployees|MatchMappingTest.meta_pure_mapping_modelToModel_test_alloy_simple_function_AllEmployees)],propertiesWithParameters=[names]]resultSizeRange=*store=MODELlocalGraphFetchExecutionNode=InMemoryRootGraphFetch(type=PartialClass[impls=[(meta::pure::mapping::modelToModel::test::alloy::simple::function::AllEmployees|MatchMappingTest.meta_pure_mapping_modelToModel_test_alloy_simple_function_AllEmployees)],propertiesWithParameters=[names]]graphFetchTree=[meta_pure_mapping_modelToModel_test_alloy_simple_function_AllEmployees/meta::pure::mapping::modelToModel::test::alloy::simple::function::AllEmployees]{@(meta_pure_mapping_modelToModel_test_alloy_simple_function_AllEmployees->)@[/names]}nodeIndex=0batchSize=1checked=false(StoreStreamReading(type=PartialClass[impls=[],propertiesWithParameters=[employees]]graphFetchTree=#{meta::pure::mapping::modelToModel::test::alloy::simple::function::Firm{employees{firstNameB}}}#connection=JsonModelConnection(url=data:application/json,[{"employees":[{"@type":"PersonA","role":"developer","firstNameA":"Smith","firstName":"testFirstName","lastName":"testLastName"}]}],class=meta::pure::mapping::modelToModel::test::alloy::simple::function::Firm)enableConstraints=truechecked=false))children=[])children=[]localTreeIndices=[0,1]dependencyIndices=[])))'; + let res = meta::pure::executionPlan::executionPlan($lambda, meta::pure::mapping::modelToModel::test::alloy::simple::function::MatchMappingTest, $runtime, meta::pure::extension::defaultExtensions()); + assertEquals($expected, $res->meta::pure::executionPlan::toString::planToStringWithoutFormatting(meta::pure::extension::defaultExtensions())); + + let withJava = $res->meta::pure::executionPlan::generatePlatformCode(meta::pure::executionPlan::platformBinding::legendJava::legendJavaPlatformBindingId(), ^meta::pure::executionPlan::platformBinding::legendJava::LegendJavaPlatformBindingConfig(), meta::relational::executionPlan::platformBinding::legendJava::relationalExtensionsWithLegendJavaPlatformBinding()); + let expectedJava = 'PureExp(type=Stringexpression=->serialize(#{meta::pure::mapping::modelToModel::test::alloy::simple::function::AllEmployees{names}}#)(StoreMappingGlobalGraphFetch(type=PartialClass[impls=[(meta::pure::mapping::modelToModel::test::alloy::simple::function::AllEmployees|MatchMappingTest.meta_pure_mapping_modelToModel_test_alloy_simple_function_AllEmployees)],propertiesWithParameters=[names]]resultSizeRange=*store=MODELlocalGraphFetchExecutionNode=InMemoryRootGraphFetch(type=PartialClass[impls=[(meta::pure::mapping::modelToModel::test::alloy::simple::function::AllEmployees|MatchMappingTest.meta_pure_mapping_modelToModel_test_alloy_simple_function_AllEmployees)],propertiesWithParameters=[names]]graphFetchTree=[meta_pure_mapping_modelToModel_test_alloy_simple_function_AllEmployees/meta::pure::mapping::modelToModel::test::alloy::simple::function::AllEmployees]{@(meta_pure_mapping_modelToModel_test_alloy_simple_function_AllEmployees->)@[/names]}nodeIndex=0batchSize=1checked=false(StoreStreamReading(type=PartialClass[impls=[],propertiesWithParameters=[employees]]graphFetchTree=#{meta::pure::mapping::modelToModel::test::alloy::simple::function::Firm{employees{firstNameB}}}#connection=JsonModelConnection(url=data:application/json,[{"employees":[{"@type":"PersonA","role":"developer","firstNameA":"Smith","firstName":"testFirstName","lastName":"testLastName"}]}],class=meta::pure::mapping::modelToModel::test::alloy::simple::function::Firm)enableConstraints=truechecked=falseimplementation(calls=_pure.plan.root.n1.localGraph.n1.Execute)))children=[]implementation(calls=_pure.plan.root.n1.localGraph.Execute))children=[]localTreeIndices=[0,1]dependencyIndices=[]))implementation(calls=_pure.plan.root.Serialize))'; + assertEquals($expectedJava, $withJava->meta::pure::executionPlan::toString::planToStringWithoutFormatting(meta::pure::extension::defaultExtensions())); +} function <> meta::relational::executionPlan::platformBinding::legendJava::tests::classPathsInfluencedByPlanId() : Boolean[1] {