Skip to content

Commit

Permalink
Handle empty inputs when set on meta function output (#935)
Browse files Browse the repository at this point in the history
* return empty meta wrapper instead of null

* remove test write
  • Loading branch information
davidalk authored Feb 26, 2025
1 parent 3ef35ea commit 7510c20
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ class TypeCoercionTest {
{
final BigDecimal bigDecimal = BigDecimal.valueOf(10);
return bigDecimal == null ? null : FieldWithMetaInteger.builder().setValue(bigDecimal.intValueExact()).build();
return bigDecimal == null ? FieldWithMetaInteger.builder().build() : FieldWithMetaInteger.builder().setValue(bigDecimal.intValueExact()).build();
}
'''

Expand Down Expand Up @@ -102,10 +102,10 @@ class TypeCoercionTest {
{
final ReferenceWithMetaString referenceWithMetaString = ReferenceWithMetaString.builder().setValue("foo").build();
if (referenceWithMetaString == null) {
return null;
return FieldWithMetaString.builder().build();
}
final String string = referenceWithMetaString.getValue();
return string == null ? null : FieldWithMetaString.builder().setValue(string).build();
return string == null ? FieldWithMetaString.builder().build() : FieldWithMetaString.builder().setValue(string).build();
}
'''

Expand All @@ -125,10 +125,10 @@ class TypeCoercionTest {
{
final FieldWithMetaString fieldWithMetaString = FieldWithMetaString.builder().setValue("foo").build();
if (fieldWithMetaString == null) {
return null;
return ReferenceWithMetaString.builder().build();
}
final String string = fieldWithMetaString.getValue();
return string == null ? null : ReferenceWithMetaString.builder().setValue(string).build();
return string == null ? ReferenceWithMetaString.builder().build() : ReferenceWithMetaString.builder().setValue(string).build();
}
'''

Expand All @@ -147,7 +147,7 @@ class TypeCoercionTest {
{
final String string = "foo";
return string == null ? null : FieldWithMetaString.builder().setValue(string).build();
return string == null ? FieldWithMetaString.builder().build() : FieldWithMetaString.builder().setValue(string).build();
}
'''
assertCoercion(expected, '''"foo"''', String, new RJavaFieldWithMeta(STRING, DottedPath.of("test"), typeUtil))
Expand All @@ -158,7 +158,7 @@ class TypeCoercionTest {
{
final String string = "foo";
return string == null ? null : ReferenceWithMetaString.builder().setValue(string).build();
return string == null ? ReferenceWithMetaString.builder().build() : ReferenceWithMetaString.builder().setValue(string).build();
}
'''
assertCoercion(expected2, '''"foo"''', String, new RJavaReferenceWithMeta(STRING, DottedPath.of("test"), typeUtil))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,33 @@ public class FunctionGeneratorMetaTest {
@Inject
CodeGeneratorTestHelper generatorTestHelper;

@Test
void canSetMetaOutuptWhereInputArgumentIsNull() {
var model = """
func MyFunc:
inputs:
value string (0..1)
scheme string (0..1)
output:
result string (0..1)
[metadata scheme]
set result: value
set result -> scheme: scheme
""";

var code = generatorTestHelper.generateCode(model);

var classes = generatorTestHelper.compileToClasses(code);
var myFunc = functionGeneratorHelper.createFunc(classes, "MyFunc");

var result = functionGeneratorHelper.invokeFunc(myFunc, FieldWithMeta.class, null, null);

var expected = generatorTestHelper.createInstanceUsingBuilder(classes, new RosettaJavaPackages.RootPackage("com.rosetta.model.metafields"), "FieldWithMetaString", Map.of());

assertEquals(expected, result);
}

@Test
void canSetMetaLocationOnFunctionObjectOutput() {
var model = """
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -479,7 +479,7 @@ class PojoInheritanceRegressionTest {
public Foo2.Foo2Builder addParentList(Parent parentList0) {
final ReferenceWithMetaChild ifThenElseResult;
if (parentList0 == null) {
ifThenElseResult = null;
ifThenElseResult = ReferenceWithMetaChild.builder().build();
} else {
ifThenElseResult = parentList0 instanceof Child ? ReferenceWithMetaChild.builder().setValue(Child.class.cast(parentList0)).build() : ReferenceWithMetaChild.builder().setValue(null).build();
}
Expand All @@ -490,7 +490,7 @@ class PojoInheritanceRegressionTest {
public Foo2.Foo2Builder addParentList(Parent _parentList, int _idx) {
final ReferenceWithMetaChild ifThenElseResult;
if (_parentList == null) {
ifThenElseResult = null;
ifThenElseResult = ReferenceWithMetaChild.builder().build();
} else {
ifThenElseResult = _parentList instanceof Child ? ReferenceWithMetaChild.builder().setValue(Child.class.cast(_parentList)).build() : ReferenceWithMetaChild.builder().setValue(null).build();
}
Expand All @@ -502,7 +502,7 @@ class PojoInheritanceRegressionTest {
final Parent _parent = MapperC.of(parentLists).get();
final ReferenceWithMetaChild ifThenElseResult;
if (_parent == null) {
ifThenElseResult = null;
ifThenElseResult = ReferenceWithMetaChild.builder().build();
} else {
ifThenElseResult = _parent instanceof Child ? ReferenceWithMetaChild.builder().setValue(Child.class.cast(_parent)).build() : ReferenceWithMetaChild.builder().setValue(null).build();
}
Expand All @@ -514,7 +514,7 @@ class PojoInheritanceRegressionTest {
final Parent _parent = MapperC.of(parentLists).get();
final ReferenceWithMetaChild ifThenElseResult;
if (_parent == null) {
ifThenElseResult = null;
ifThenElseResult = ReferenceWithMetaChild.builder().build();
} else {
ifThenElseResult = _parent instanceof Child ? ReferenceWithMetaChild.builder().setValue(Child.class.cast(_parent)).build() : ReferenceWithMetaChild.builder().setValue(null).build();
}
Expand Down Expand Up @@ -929,10 +929,10 @@ class PojoInheritanceRegressionTest {
@Override
public ReferenceWithMetaChild getParentListOverriddenAsSingleReferenceWithMetaChild() {
if (parentList == null) {
return null;
return ReferenceWithMetaChild.builder().build();
}
final GrandChild grandChild = parentList.getValue();
return grandChild == null ? null : ReferenceWithMetaChild.builder().setValue(grandChild).build();
return grandChild == null ? ReferenceWithMetaChild.builder().build() : ReferenceWithMetaChild.builder().setValue(grandChild).build();
}
@Override
Expand Down Expand Up @@ -1081,20 +1081,20 @@ class PojoInheritanceRegressionTest {
@Override
public ReferenceWithMetaChild.ReferenceWithMetaChildBuilder getParentListOverriddenAsSingleReferenceWithMetaChild() {
if (parentList == null) {
return null;
return ReferenceWithMetaChild.builder().build().toBuilder();
}
final GrandChild _grandChild = parentList.getValue();
return _grandChild == null ? null : ReferenceWithMetaChild.builder().setValue(_grandChild).build().toBuilder();
return _grandChild == null ? ReferenceWithMetaChild.builder().build().toBuilder() : ReferenceWithMetaChild.builder().setValue(_grandChild).build().toBuilder();
}
@Override
public ReferenceWithMetaChild.ReferenceWithMetaChildBuilder getOrCreateParentListOverriddenAsSingleReferenceWithMetaChild() {
final ReferenceWithMetaGrandChild referenceWithMetaGrandChild0 = getOrCreateParentListOverriddenAsReferenceWithMetaGrandChild();
if (referenceWithMetaGrandChild0 == null) {
return null;
return ReferenceWithMetaChild.builder().build().toBuilder();
}
final GrandChild grandChild = referenceWithMetaGrandChild0.getValue();
return grandChild == null ? null : ReferenceWithMetaChild.builder().setValue(grandChild).build().toBuilder();
return grandChild == null ? ReferenceWithMetaChild.builder().build().toBuilder() : ReferenceWithMetaChild.builder().setValue(grandChild).build().toBuilder();
}
@Override
Expand Down Expand Up @@ -1203,11 +1203,11 @@ class PojoInheritanceRegressionTest {
public Foo3.Foo3Builder setParentList(ReferenceWithMetaChild _parentList) {
final ReferenceWithMetaGrandChild ifThenElseResult;
if (_parentList == null) {
ifThenElseResult = null;
ifThenElseResult = ReferenceWithMetaGrandChild.builder().build();
} else {
final Child child = _parentList.getValue();
if (child == null) {
ifThenElseResult = null;
ifThenElseResult = ReferenceWithMetaGrandChild.builder().build();
} else {
ifThenElseResult = child instanceof GrandChild ? ReferenceWithMetaGrandChild.builder().setValue(GrandChild.class.cast(child)).build() : ReferenceWithMetaGrandChild.builder().setValue(null).build();
}
Expand All @@ -1230,7 +1230,7 @@ class PojoInheritanceRegressionTest {
public Foo3.Foo3Builder addParentList(Parent parentList0) {
final ReferenceWithMetaGrandChild ifThenElseResult;
if (parentList0 == null) {
ifThenElseResult = null;
ifThenElseResult = ReferenceWithMetaGrandChild.builder().build();
} else {
ifThenElseResult = parentList0 instanceof GrandChild ? ReferenceWithMetaGrandChild.builder().setValue(GrandChild.class.cast(parentList0)).build() : ReferenceWithMetaGrandChild.builder().setValue(null).build();
}
Expand All @@ -1241,7 +1241,7 @@ class PojoInheritanceRegressionTest {
public Foo3.Foo3Builder addParentList(Parent _parentList, int _idx) {
final ReferenceWithMetaGrandChild ifThenElseResult;
if (_parentList == null) {
ifThenElseResult = null;
ifThenElseResult = ReferenceWithMetaGrandChild.builder().build();
} else {
ifThenElseResult = _parentList instanceof GrandChild ? ReferenceWithMetaGrandChild.builder().setValue(GrandChild.class.cast(_parentList)).build() : ReferenceWithMetaGrandChild.builder().setValue(null).build();
}
Expand All @@ -1253,7 +1253,7 @@ class PojoInheritanceRegressionTest {
final Parent _parent = MapperC.of(parentLists).get();
final ReferenceWithMetaGrandChild ifThenElseResult;
if (_parent == null) {
ifThenElseResult = null;
ifThenElseResult = ReferenceWithMetaGrandChild.builder().build();
} else {
ifThenElseResult = _parent instanceof GrandChild ? ReferenceWithMetaGrandChild.builder().setValue(GrandChild.class.cast(_parent)).build() : ReferenceWithMetaGrandChild.builder().setValue(null).build();
}
Expand All @@ -1265,7 +1265,7 @@ class PojoInheritanceRegressionTest {
final Parent _parent = MapperC.of(parentLists).get();
final ReferenceWithMetaGrandChild ifThenElseResult;
if (_parent == null) {
ifThenElseResult = null;
ifThenElseResult = ReferenceWithMetaGrandChild.builder().build();
} else {
ifThenElseResult = _parent instanceof GrandChild ? ReferenceWithMetaGrandChild.builder().setValue(GrandChild.class.cast(_parent)).build() : ReferenceWithMetaGrandChild.builder().setValue(null).build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,12 @@ package com.regnosys.rosetta.generator.java.expression
import com.regnosys.rosetta.generator.java.JavaScope
import com.regnosys.rosetta.generator.java.statement.builder.JavaConditionalExpression
import com.regnosys.rosetta.generator.java.statement.builder.JavaExpression
import com.regnosys.rosetta.generator.java.statement.builder.JavaIfThenElseBuilder
import com.regnosys.rosetta.generator.java.statement.builder.JavaStatementBuilder
import com.regnosys.rosetta.generator.java.statement.builder.JavaVariable
import com.regnosys.rosetta.generator.java.types.JavaPojoInterface
import com.regnosys.rosetta.generator.java.types.JavaTypeUtil
import com.regnosys.rosetta.generator.java.types.RJavaWithMetaValue
import com.rosetta.model.lib.expression.ComparisonResult
import com.rosetta.model.lib.mapper.MapperC
import com.rosetta.model.lib.mapper.MapperS
Expand All @@ -20,9 +23,6 @@ import java.util.Optional
import java.util.function.Function
import java.util.stream.Collectors
import javax.inject.Inject
import com.regnosys.rosetta.generator.java.types.RJavaWithMetaValue
import com.regnosys.rosetta.generator.java.statement.builder.JavaIfThenElseBuilder
import com.regnosys.rosetta.generator.java.types.JavaPojoInterface

/**
* This service is responsible for coercing an expression from its actual Java type to an `expected` Java type.
Expand Down Expand Up @@ -377,6 +377,8 @@ class TypeCoercionService {
JavaExpression.from('''«ComparisonResult».successEmptyOperand("")''', COMPARISON_RESULT)
} else if (expected == JavaPrimitiveType.BOOLEAN) {
JavaExpression.from('''false''', JavaPrimitiveType.BOOLEAN)
} else if (expected instanceof RJavaWithMetaValue) {
JavaExpression.from('''«expected».builder().build()''', itemType)
} else if (expected instanceof JavaPrimitiveType) {
throw new IllegalArgumentException("No empty representation for primitive type `" + expected + "`.")
} else {
Expand Down

0 comments on commit 7510c20

Please sign in to comment.