From 14cfd66721197e2c619d1fd8976d9d8841dcb1a4 Mon Sep 17 00:00:00 2001 From: "david.al-kanani" Date: Fri, 31 Jan 2025 23:05:01 +0000 Subject: [PATCH] enable metadata key as path elements set meta key on objects --- .../function/FunctionGeneratorMetaTest.java | 17 ++++++++++++++++- rosetta-lang/model/RosettaSimple.xcore | 2 +- .../java/function/FunctionGenerator.xtend | 1 + .../rosetta/types/RosettaTypeProvider.xtend | 11 ++++++++++- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/rosetta-integration-tests/src/test/java/com/regnosys/rosetta/generator/java/function/FunctionGeneratorMetaTest.java b/rosetta-integration-tests/src/test/java/com/regnosys/rosetta/generator/java/function/FunctionGeneratorMetaTest.java index a7ea966e2..c922bbb4e 100644 --- a/rosetta-integration-tests/src/test/java/com/regnosys/rosetta/generator/java/function/FunctionGeneratorMetaTest.java +++ b/rosetta-integration-tests/src/test/java/com/regnosys/rosetta/generator/java/function/FunctionGeneratorMetaTest.java @@ -185,8 +185,9 @@ result string (1..1) assertEquals(expected, result); } + + //TODO: read key from an object - @Disabled //TODO: is this syntax needed? if so we need to find a way to get key as a feature from a Data type @Test void canSetExternalKeyOnFunctionObjectOutput() { var model = """ @@ -204,10 +205,24 @@ myReference string (1..1) output: result Foo (1..1) + set result -> a: "someA" set result -> key: myReference """; var code = generatorTestHelper.generateCode(model); + var classes = generatorTestHelper.compileToClasses(code); + var myFunc = functionGeneratorHelper.createFunc(classes, "MyFunc"); + + var result = functionGeneratorHelper.invokeFunc(myFunc, FieldWithMeta.class, "someExternalReference"); + + var expected = generatorTestHelper.createInstanceUsingBuilder(classes, new RosettaJavaPackages.RootPackage("com.rosetta.test.model.metafields"), "FieldWithMetaFoo", Map.of( + "value", generatorTestHelper.createInstanceUsingBuilder(classes, new RosettaJavaPackages.RootPackage("com.rosetta.test.model"), "Foo", Map.of( + "a", "someA" + )), + "meta", MetaFields.builder().setExternalKey("someExternalReference") + )); + + assertEquals(expected, result); } @Test diff --git a/rosetta-lang/model/RosettaSimple.xcore b/rosetta-lang/model/RosettaSimple.xcore index 5ef2c0718..aae9efd39 100644 --- a/rosetta-lang/model/RosettaSimple.xcore +++ b/rosetta-lang/model/RosettaSimple.xcore @@ -89,7 +89,7 @@ class Attribute extends RosettaTypedFeature, RosettaDefinable, Annotated, Refere } -class Data extends RosettaType, RootElement, References { +class Data extends RosettaType, RootElement, References, Annotated { refers Data superType contains RosettaClassSynonym[] synonyms contains Attribute[] attributes diff --git a/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/java/function/FunctionGenerator.xtend b/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/java/function/FunctionGenerator.xtend index 8caaf0c07..682a1f94c 100644 --- a/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/java/function/FunctionGenerator.xtend +++ b/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/java/function/FunctionGenerator.xtend @@ -541,6 +541,7 @@ class FunctionGenerator { return switch(seg.name) { case "reference": "externalReference" case "id": "externalKey" + case "key": "externalKey" case "address": "reference" default: seg.name } diff --git a/rosetta-lang/src/main/java/com/regnosys/rosetta/types/RosettaTypeProvider.xtend b/rosetta-lang/src/main/java/com/regnosys/rosetta/types/RosettaTypeProvider.xtend index f6f8dc539..a13a18751 100644 --- a/rosetta-lang/src/main/java/com/regnosys/rosetta/types/RosettaTypeProvider.xtend +++ b/rosetta-lang/src/main/java/com/regnosys/rosetta/types/RosettaTypeProvider.xtend @@ -156,7 +156,16 @@ class RosettaTypeProvider extends RosettaExpressionSwitch typeMetaAttributes = #[] + + if (symbol instanceof Attribute) { + val attributeType = symbol.typeCall.typeCallToRType + if (attributeType instanceof RDataType) { + typeMetaAttributes = attributeType.metaAttributes + } + } + + return (symbol.annotations.RMetaAttributes + typeMetaAttributes).toList } #[] }