Skip to content

Commit 9fe0274

Browse files
Merge branch 'finos:master' into review-athena-trino-pct
2 parents 0538cff + 336cbaf commit 9fe0274

File tree

38 files changed

+928
-166
lines changed

38 files changed

+928
-166
lines changed

legend-engine-core/legend-engine-core-base/legend-engine-core-language-pure/legend-engine-language-pure-compiler/src/main/java/org/finos/legend/engine/language/pure/compiler/toPureGraph/PureModel.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -939,6 +939,10 @@ public Type getType_safe(String fullPath)
939939

940940
// Search for system types in the Pure graph
941941
type = tryGetFromMetadataAccessor(fullPath, MetadataAccessor::getClass, MetadataAccessor::getEnumeration, MetadataAccessor::getPrimitiveType, MetadataAccessor::getMeasure, MetadataAccessor::getUnit);
942+
if (type == null)
943+
{
944+
type = tryGetUnitByLegacyId(fullPath);
945+
}
942946
if (type != null)
943947
{
944948
this.immutables.add(fullPathWithPrefix);
@@ -952,6 +956,25 @@ public Type getType_safe(String fullPath)
952956
return type;
953957
}
954958

959+
private Unit tryGetUnitByLegacyId(String legacyId)
960+
{
961+
int unitDelimiterIndex = legacyId.lastIndexOf('~');
962+
if (unitDelimiterIndex != -1)
963+
{
964+
String measurePath = legacyId.substring(0, unitDelimiterIndex);
965+
Measure measure = tryGetFromMetadataAccessor(measurePath, MetadataAccessor::getMeasure);
966+
if (measure != null)
967+
{
968+
String unitName = legacyId.substring(unitDelimiterIndex + 1);
969+
Unit canonicalUnit = measure._canonicalUnit();
970+
return ((canonicalUnit != null) && unitName.equals(canonicalUnit._name())) ?
971+
canonicalUnit :
972+
measure._nonCanonicalUnits().detect(ncu -> unitName.equals(ncu._name()));
973+
}
974+
}
975+
return null;
976+
}
977+
955978
public org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.type.Class<?> getClass(String fullPath)
956979
{
957980
return this.getClass(fullPath, SourceInformation.getUnknownSourceInformation());

legend-engine-core/legend-engine-core-pure/legend-engine-pure-code-compiled-core/src/main/resources/core/pure/corefunctions/dateExtension.pure

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,6 @@ function meta::pure::functions::date::toEpochValue(d:Date[1], unit:DurationUnit[
622622

623623
function meta::pure::functions::date::validateDateTimeFormat(dateTimeFormat:String[1]):Boolean[1]
624624
{
625-
// Supported Formats : yyyy, yyyy-M, yyyy-MM, yyyy-MM-d, yyyy-M-d, yyyy-MM-dd, yyyy/mm/dd, yyyyMMdd, yyyyMd, yyMd, dd/MM/yyyy, MM/dd/yyyy, MM/dd/yyyy "at" hh:mma z, yyyy-MM-dd HH:mm:ss, yyyy-MM-dd h:mm:ssa, yyyy-MM-dd HH:mm:ss.SSS, yyyy-MM-dd HH:mm:ss.SSSX, yyyy-MM-dd HH:mm:ss.SSSZ, yyyy-MM-dd HH:mm:ss.SSS z, yyyy-MM-dd HH:mm:ss.SSSS z, yyyy-MM-dd"T"HH:mm:ss, yyyy-MM-dd"T"HH:mm:ssZ, yyyy-MM-dd"T"HH:mm:ss.SSS, yyyy-MM-dd"T"HH:mm:ss.SSSZ, yyyy-MM-dd"T"HH:mm:ss.SSSSZ, yy-MM-dd"T"HH:mm:ss."000000", , 'yyyy-MM-dd"T"HH:mm:ss."000000"X', [EST]yyyy-MM-dd HH:mm:ss.SSSZ, [CST]yyyy-MM-dd HH:mm:ss.SSS z, [CET]yyyy-MM-dd HH:mm:ss.SSSX, [EST]yyyy-MM-dd and other timezones
626-
$dateTimeFormat->matches('(\\[[A-Z][A-Z]([ACDKLMNORSTUVW])?([DSWT])?([T])?\\])?(MM/dd/|dd/MM/|MM-dd-|dd-MM-)?(?:y{4}|y{2})(([-/])?[mM]{1,2}(([-/])?(d{1,2}) *((\"T\"|T)?(H{2}|h{1}):m{2}:s{2}.?((?:S{3,4} *[zZX]?|\"000000\"))?)?)?)? *(\"at\")? *(h{2}:m{2}a)? *[zZxX]?');
625+
// Supported Formats : yyyy, yyyy-M, yyyy-MM, yyyy-MM-d, yyyy-M-d, yyyy-MM-dd, yyyy/mm/dd, yyyyMMdd, yyyyMd, yyMd, dd/MM/yyyy, MM/dd/yyyy, MM/dd/yyyy "at" hh:mma z, yyyy-MM-dd HH:mm:ss, yyyy-MM-dd h:mm:ssa, yyyy-MM-dd HH:mm:ss.SSS, yyyy-MM-dd HH:mm:ss.SSSX, yyyy-MM-dd HH:mm:ss.SSSZ, yyyy-MM-dd HH:mm:ss.SSS z, yyyy-MM-dd HH:mm:ss.SSSS z, yyyy-MM-dd"T"HH:mm:ss, yyyy-MM-dd"T"HH:mm:ssZ, yyyy-MM-dd"T"HH:mm:ss.SSS, yyyy-MM-dd"T"HH:mm:ss.SSSZ, yyyy-MM-dd"T"HH:mm:ss.SSSSZ, yyyy-MM-dd"T"HH:mm:ss.SSSSSSSSSZ, yy-MM-dd"T"HH:mm:ss."000000", , 'yyyy-MM-dd"T"HH:mm:ss."000000"X', [EST]yyyy-MM-dd HH:mm:ss.SSSZ, [CST]yyyy-MM-dd HH:mm:ss.SSS z, [CET]yyyy-MM-dd HH:mm:ss.SSSX, [EST]yyyy-MM-dd and other timezones
626+
$dateTimeFormat->matches('(\\[[A-Z][A-Z]([ACDKLMNORSTUVW])?([DSWT])?([T])?\\])?(MM/dd/|dd/MM/|MM-dd-|dd-MM-)?(?:y{4}|y{2})(([-/])?[mM]{1,2}(([-/])?(d{1,2}) *((\"T\"|T)?(H{2}|h{1}):m{2}:s{2}.?((?:S{3,9} *[zZX]?|\"000000\"))?)?)?)? *(\"at\")? *(h{2}:m{2}a)? *[zZxX]?');
627627
}

legend-engine-core/legend-engine-core-pure/legend-engine-pure-code-compiled-core/src/main/resources/core/pure/corefunctions/tests/date/testDate.pure

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ function <<test.Test>> meta::pure::functions::date::tests::testValidateDateTimeF
2424
let formats = ['yyyy', 'yyyy-M', 'yyyy-MM', 'yyyy-MM-d', 'yyyy-M-d', 'yyyy-MM-dd', 'yyyy/mm/dd', 'yyyyMMdd', 'yyyyMd', 'yyMd', 'dd/MM/yyyy', 'MM/dd/yyyy','MM-dd-yyyy','dd-MM-yyyy', 'MM/dd/yyyy "at" hh:mma z', 'yyyy-MM-dd HH:mm:ss', 'yyyy-MM-dd h:mm:ssa', 'yyyy-MM-dd HH:mm:ss.SSS', 'yyyy-MM-dd HH:mm:ss.SSSX', 'yyyy-MM-dd HH:mm:ss.SSSZ', 'yyyy-MM-dd HH:mm:ss.SSS z', 'yyyy-MM-dd HH:mm:ss.SSSS z', 'yyyy-MM-dd"T"HH:mm:ss', 'yyyy-MM-dd"T"HH:mm:ssZ', 'yyyy-MM-dd"T"HH:mm:ssZZ', 'yyyy-MM-dd"T"HH:mm:ss.SSS', 'yyyy-MM-dd"T"HH:mm:ss.SSSZ', 'yyyy-MM-dd"T"HH:mm:ss.SSSSZ', 'yy-MM-dd"T"HH:mm:ss."000000"', 'yyyy-MM-dd"T"HH:mm:ss."000000"X', '[EST]yyyy-MM-dd HH:mm:ss.SSSZ', '[CST]yyyy-MM-dd HH:mm:ss.SSS z', '[CET]yyyy-MM-dd HH:mm:ss.SSSX', '[EST]yyyy-MM-dd'];
2525
assert($formats->map(format | validateDateTimeFormat($format))->assertNotContains(false));
2626

27-
let invalidFormats = ['yyy', 'yyyyy-M', 'yyyy-MMM', 'yyyy-MM-ddd', 'dd/mm/yyyy', 'MM/ddyy', 'MM/dd/yyyy "at" hh:ma z', 'yyyy-MMM-dd HH:mm:ss', 'yyyy-MM-dd hh:mm:ssa', 'yyyy-MM-dd HH:mm:ss.SSZ', 'yyyy-MM-dd HH:mm:ss.SZ', 'yyyy-MM-dd"TT"HH:mm:ss', 'yyyy-MM-dd"T"HH:mm:sss.SSS', 'yyyy-MM-dd""HH:mm:ss.SSSZ', 'yyyy-MM-dd"T"HH:mm:ss.SSSSSZ', 'yy-MM-dd"T"HH:mm:ss."00"', '(EST)yyyy-MM-dd'];
27+
let invalidFormats = ['yyy', 'yyyyy-M', 'yyyy-MMM', 'yyyy-MM-ddd', 'dd/mm/yyyy', 'MM/ddyy', 'MM/dd/yyyy "at" hh:ma z', 'yyyy-MMM-dd HH:mm:ss', 'yyyy-MM-dd hh:mm:ssa', 'yyyy-MM-dd HH:mm:ss.SSZ', 'yyyy-MM-dd HH:mm:ss.SZ', 'yyyy-MM-dd"TT"HH:mm:ss', 'yyyy-MM-dd"T"HH:mm:sss.SSS', 'yyyy-MM-dd""HH:mm:ss.SSSZ', 'yy-MM-dd"T"HH:mm:ss."00"', '(EST)yyyy-MM-dd'];
2828
assert($invalidFormats->map(format | validateDateTimeFormat($format))->assertNotContains(true));
2929
}
3030

legend-engine-core/legend-engine-core-pure/legend-engine-pure-code-compiled-core/src/main/resources/core/store/m2m/tests/legend/simpleObject.pure

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,129 @@ meta::pure::mapping::modelToModel::test::alloy::simple::supportForPrimitivesAndE
259259
assert(jsonEquivalent($expected->parseJSON(), $result.values->toOne()->parseJSON()));
260260
}
261261

262+
263+
function <<meta::pure::profiles::test.Test, meta::pure::profiles::test.AlloyOnly, feature.M2MBasics>>
264+
{ serverVersion.start='v1_19_0',
265+
doc.doc='Given: a JSON object (matching a source class) that contains datetime values with timezone, and an M2M mapping with AlloySerializationConfig using dateTimeFormat with milliseconds (SSSZ)',
266+
doc.doc='When: the mapping is executed using graphFetch and serialize with the custom dateTimeFormat.',
267+
doc.doc='Then: the datetime values are serialized with the specified timezone format including milliseconds.'
268+
}
269+
meta::pure::mapping::modelToModel::test::alloy::simple::supportForDateTimeTimezone() : Boolean[1]
270+
{
271+
let tree = #{SomeData {i, f, d, sd, dt, b, c, c2, c3} }#;
272+
273+
274+
let config = ^meta::pure::graphFetch::execution::AlloySerializationConfig(typeKeyName='@type',
275+
includeType=false,
276+
includeEnumType=false,
277+
removePropertiesWithNullValues=true,
278+
removePropertiesWithEmptySets=false,
279+
fullyQualifiedTypePath=false,
280+
dateTimeFormat='yyyy-MM-dd"T"HH:mm:ss.SSSZ'
281+
);
282+
283+
let result = execute(
284+
|SomeData.all()->graphFetch($tree)->serialize($tree, $config),
285+
simpleDataMapping,
286+
^Runtime(
287+
connectionStores = [
288+
^ConnectionStore(
289+
element=^ModelStore(),
290+
connection= ^JsonModelConnection(
291+
class=_SomeData,
292+
url='data:application/json,{"i":2, "f": 2.5, "d": [0.1, 0.2], "sd": ["2018-03-12", "2019-05-30"], "dt": ["2018-03-12T13:20:21.000Z", "2019-05-30T04:29:01.234"], "b": [true, false, true], "c":"ROUGE", "s":["BLEU", "VERT"]}'
293+
)
294+
)]
295+
),
296+
meta::pure::extension::defaultExtensions()
297+
);
298+
299+
let expected = '{"i":4, "f": 0.4, "d": [0.2, 0.4],"sd": ["2018-03-13", "2019-05-31"], "dt": ["2018-03-12T15:20:21.000+0000", "2019-05-30T06:29:01.234+0000"], "b": [false, true, false], "c":"RED", "c2":"BLUE", "c3":["BLUE", "GREEN"]}';
300+
assert(jsonEquivalent($expected->parseJSON(), $result.values->toOne()->parseJSON()));
301+
}
302+
303+
304+
function <<meta::pure::profiles::test.Test, meta::pure::profiles::test.AlloyOnly, feature.M2MBasics>>
305+
{ serverVersion.start='v1_19_0',
306+
doc.doc='Given: a JSON object (matching a source class) that contains datetime values with nanosecond precision, and an M2M mapping with AlloySerializationConfig using dateTimeFormat with nanoseconds (SSSSSSSSSZ)',
307+
doc.doc='When: the mapping is executed using graphFetch and serialize with the custom dateTimeFormat.',
308+
doc.doc='Then: the datetime values are serialized with the specified timezone format preserving nanosecond precision.'
309+
}
310+
meta::pure::mapping::modelToModel::test::alloy::simple::supportForDateTimeTimezoneWithNanoseconds() : Boolean[1]
311+
{
312+
let tree = #{SomeData {i, f, d, sd, dt, b, c, c2, c3} }#;
313+
314+
315+
let config = ^meta::pure::graphFetch::execution::AlloySerializationConfig(typeKeyName='@type',
316+
includeType=false,
317+
includeEnumType=false,
318+
removePropertiesWithNullValues=true,
319+
removePropertiesWithEmptySets=false,
320+
fullyQualifiedTypePath=false,
321+
dateTimeFormat='yyyy-MM-dd"T"HH:mm:ss.SSSSSSSSSZ'
322+
);
323+
324+
let result = execute(
325+
|SomeData.all()->graphFetch($tree)->serialize($tree, $config),
326+
simpleDataMapping,
327+
^Runtime(
328+
connectionStores = [
329+
^ConnectionStore(
330+
element=^ModelStore(),
331+
connection= ^JsonModelConnection(
332+
class=_SomeData,
333+
url='data:application/json,{"i":2, "f": 2.5, "d": [0.1, 0.2], "sd": ["2018-03-12", "2019-05-30"], "dt": ["2018-03-12T13:20:21.123456789Z", "2019-05-30T04:29:01.234"], "b": [true, false, true], "c":"ROUGE", "s":["BLEU", "VERT"]}'
334+
)
335+
)]
336+
),
337+
meta::pure::extension::defaultExtensions()
338+
);
339+
340+
let expected = '{"i":4, "f": 0.4, "d": [0.2, 0.4],"sd": ["2018-03-13", "2019-05-31"], "dt": ["2018-03-12T15:20:21.123456789+0000", "2019-05-30T06:29:01.234+0000"], "b": [false, true, false], "c":"RED", "c2":"BLUE", "c3":["BLUE", "GREEN"]}';
341+
assert(jsonEquivalent($expected->parseJSON(), $result.values->toOne()->parseJSON()));
342+
}
343+
344+
345+
function <<meta::pure::profiles::test.Test, meta::pure::profiles::test.AlloyOnly, feature.M2MBasics>>
346+
{ serverVersion.start='v1_19_0',
347+
doc.doc='Given: a JSON object (matching a source class) that contains datetime values with a non-UTC timezone offset (+0530 and -0800), and an M2M mapping with AlloySerializationConfig using dateTimeFormat with milliseconds',
348+
doc.doc='When: the mapping is executed using graphFetch and serialize with the custom dateTimeFormat.',
349+
doc.doc='Then: the datetime values are serialized with the specified timezone format correctly handling the non-UTC offset.'
350+
}
351+
meta::pure::mapping::modelToModel::test::alloy::simple::supportForDateTimeWithDifferentTimezone() : Boolean[1]
352+
{
353+
let tree = #{SomeData {i, f, d, sd, dt, b, c, c2, c3} }#;
354+
355+
356+
let config = ^meta::pure::graphFetch::execution::AlloySerializationConfig(typeKeyName='@type',
357+
includeType=false,
358+
includeEnumType=false,
359+
removePropertiesWithNullValues=true,
360+
removePropertiesWithEmptySets=false,
361+
fullyQualifiedTypePath=false,
362+
dateTimeFormat='yyyy-MM-dd"T"HH:mm:ss.SSSZ'
363+
);
364+
365+
let result = execute(
366+
|SomeData.all()->graphFetch($tree)->serialize($tree, $config),
367+
simpleDataMapping,
368+
^Runtime(
369+
connectionStores = [
370+
^ConnectionStore(
371+
element=^ModelStore(),
372+
connection= ^JsonModelConnection(
373+
class=_SomeData,
374+
url='data:application/json,{"i":2, "f": 2.5, "d": [0.1, 0.2], "sd": ["2018-03-12", "2019-05-30"], "dt": ["2018-03-12T09:20:21.000%2B1200", "2019-05-31T23:29:01.234%2D0500"], "b": [true, false, true], "c":"ROUGE", "s":["BLEU", "VERT"]}'
375+
)
376+
)]
377+
),
378+
meta::pure::extension::defaultExtensions()
379+
);
380+
381+
let expected = '{"i":4, "f": 0.4, "d": [0.2, 0.4],"sd": ["2018-03-13", "2019-05-31"], "dt": ["2018-03-11T23:20:21.000+0000", "2019-06-01T06:29:01.234+0000"], "b": [false, true, false], "c":"RED", "c2":"BLUE", "c3":["BLUE", "GREEN"]}';
382+
assert(jsonEquivalent($expected->parseJSON(), $result.values->toOne()->parseJSON()));
383+
}
384+
262385
function <<meta::pure::profiles::test.Test, meta::pure::profiles::test.AlloyOnly, feature.M2MBasics>>
263386
{ serverVersion.start='v1_19_0',
264387
doc.doc='Given: a JSON object (matching a source class) that contains data for all primitive data types and an enumeration, and an M2M mapping',
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
import meta::json::*;
2+
import meta::external::store::model::*;
3+
import meta::core::runtime::*;
4+
import meta::pure::graphFetch::execution::*;
5+
import meta::pure::executionPlan::profiles::*;
6+
import meta::pure::executionPlan::engine::java::roadmap::*;
7+
Enum meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Enum
8+
{
9+
Enum1, Enum2
10+
}
11+
12+
Class meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Source
13+
{
14+
i : Integer[1];
15+
s : String[0..1];
16+
}
17+
18+
Class meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Target
19+
{
20+
i:Integer[1];
21+
s : meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Enum[0..1];
22+
}
23+
24+
function <<meta::pure::profiles::test.Test, meta::pure::profiles::test.AlloyOnly, feature.M2MBasics>>
25+
{ serverVersion.start='v1_19_0',
26+
doc.doc='Parse a simple JSON object, process it through an M2M mapping using extractEnumValue and serialize the result as JSON.'
27+
}
28+
meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::testExtractEnumValueM2MWithEmptyInput() : Boolean[1]
29+
{
30+
let tree = #{ meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Target {i, s}}#;
31+
let result = execute(
32+
|meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Target.all()->graphFetch($tree)->serialize($tree),
33+
meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::M,
34+
^Runtime(
35+
connectionStores = [
36+
^ConnectionStore(
37+
element=^ModelStore(),
38+
connection= ^JsonModelConnection(
39+
class=meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Source,
40+
url='data:application/json,{"i": 1}'
41+
)
42+
)]
43+
),
44+
meta::pure::extension::defaultExtensions()
45+
);
46+
47+
assert(jsonEquivalent('{"i": 1, "s": null}'->parseJSON(), $result.values->toOne()->parseJSON()));
48+
}
49+
50+
function <<meta::pure::profiles::test.Test, meta::pure::profiles::test.AlloyOnly, feature.M2MBasics>>
51+
{ serverVersion.start='v1_19_0',
52+
doc.doc='Parse a simple JSON object, process it through an M2M mapping using extractEnumValue and serialize the result as JSON.'
53+
}
54+
meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::testExtractEnumValueM2MWithNonEmptyInput() : Boolean[1]
55+
{
56+
let tree = #{ meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Target {i, s}}#;
57+
let result = execute(
58+
|meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Target.all()->graphFetch($tree)->serialize($tree),
59+
meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::M,
60+
^Runtime(
61+
connectionStores = [
62+
^ConnectionStore(
63+
element=^ModelStore(),
64+
connection= ^JsonModelConnection(
65+
class=meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Source,
66+
url='data:application/json,{"i": 1, "s":"Enum1"}'
67+
)
68+
)]
69+
),
70+
meta::pure::extension::defaultExtensions()
71+
);
72+
println($result.values->toOne());
73+
assert(jsonEquivalent('{"i": 1, "s": "Enum1"}'->parseJSON(), $result.values->toOne()->parseJSON()));
74+
}
75+
76+
function <<meta::pure::profiles::test.Test, meta::pure::profiles::test.AlloyOnly, feature.M2MBasics>>
77+
{ serverVersion.start='v1_19_0',
78+
doc.doc='Parse a simple JSON object, process it through an M2M mapping using extractEnumValue with empty string and serialize the result as JSON.'
79+
}
80+
meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::testExtractEnumValueM2MWithEmptyValue() : Boolean[1]
81+
{
82+
let tree = #{ meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Target {i, s}}#;
83+
let result = execute(
84+
|meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Target.all()->graphFetch($tree)->serialize($tree),
85+
meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::MEmpty,
86+
^Runtime(
87+
connectionStores = [
88+
^ConnectionStore(
89+
element=^ModelStore(),
90+
connection= ^JsonModelConnection(
91+
class=meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Source,
92+
url='data:application/json,{"i": 1, "s":"Enum1"}'
93+
)
94+
)]
95+
),
96+
meta::pure::extension::defaultExtensions()
97+
);
98+
println($result.values->toOne());
99+
assert(jsonEquivalent('{"i": 1, "s": null}'->parseJSON(), $result.values->toOne()->parseJSON()));
100+
}
101+
102+
function <<meta::pure::profiles::test.Test, meta::pure::profiles::test.AlloyOnly, feature.M2MBasics>>
103+
{ serverVersion.start='v1_19_0',
104+
doc.doc='Parse a simple JSON object, process it through an M2M mapping using extractEnumValue with empty string and serialize the result as JSON.'
105+
}
106+
meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::testExtractEnumValueM2MWithNonEmptyValue() : Boolean[1]
107+
{
108+
let tree = #{ meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Target {i, s}}#;
109+
let result = execute(
110+
|meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Target.all()->graphFetch($tree)->serialize($tree),
111+
meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::MString,
112+
^Runtime(
113+
connectionStores = [
114+
^ConnectionStore(
115+
element=^ModelStore(),
116+
connection= ^JsonModelConnection(
117+
class=meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Source,
118+
url='data:application/json,{"i": 1, "s":"Enum1"}'
119+
)
120+
)]
121+
),
122+
meta::pure::extension::defaultExtensions()
123+
);
124+
println($result.values->toOne());
125+
assert(jsonEquivalent('{"i": 1, "s": "Enum2"}'->parseJSON(), $result.values->toOne()->parseJSON()));
126+
}
127+
128+
129+
###Mapping
130+
Mapping meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::M
131+
(
132+
*meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Target : Pure
133+
{
134+
~src meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Source
135+
i : $src.i,
136+
s : extractEnumValue(meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Enum, $src.s)
137+
}
138+
)
139+
140+
###Mapping
141+
Mapping meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::MEmpty
142+
(
143+
*meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Target : Pure
144+
{
145+
~src meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Source
146+
i : $src.i,
147+
s : extractEnumValue(meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Enum, [])
148+
}
149+
)
150+
151+
###Mapping
152+
Mapping meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::MString
153+
(
154+
*meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Target : Pure
155+
{
156+
~src meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Source
157+
i : $src.i,
158+
s : extractEnumValue(meta::pure::mapping::modelToModel::test::alloy::extractEnumValue::Enum, 'Enum2')
159+
}
160+
)

0 commit comments

Comments
 (0)