diff --git a/legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-pure/legend-engine-xt-relationalStore-core-pure/src/main/resources/core_relational/relational/helperFunctions/helperFunctions.pure b/legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-pure/legend-engine-xt-relationalStore-core-pure/src/main/resources/core_relational/relational/helperFunctions/helperFunctions.pure index 7f159311db9..48d579950ba 100644 --- a/legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-pure/legend-engine-xt-relationalStore-core-pure/src/main/resources/core_relational/relational/helperFunctions/helperFunctions.pure +++ b/legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-pure/legend-engine-xt-relationalStore-core-pure/src/main/resources/core_relational/relational/helperFunctions/helperFunctions.pure @@ -349,7 +349,7 @@ function meta::relational::mapping::findPropertyMapping(property:AbstractPropert if($currentPropertyMapping->size() == 1 && ($propMappings->size() > 1), | //In this use case, the precedent mappings were filtered (and we have nothing to union ... so we can't take the first one) - let result = $propMappings->filter(p|$p.sourceSetImplementationId == $currentPropertyMapping.targetSetImplementationId); + let result = $propMappings->filter(p|$p.sourceSetImplementationId == $currentPropertyMapping.targetSetImplementationId || $p.property == $property); assert(!$result->isEmpty(),| 'Error can\'t find a mapping for the property:\''+$property.name->toOne()+'\' (owner class:"'+$propertyOwnerClass.name->toOne()+'") in the set implement id:"'+$currentPropertyMapping.targetSetImplementationId->toOne()+'" in ['+$propMappings->map(p|$p.owner->toOne().id+' : ('+$p.sourceSetImplementationId+' -> '+$p.targetSetImplementationId+')')->joinStrings(',')+']'); $result;, | $propMappings diff --git a/legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-pure/legend-engine-xt-relationalStore-core-pure/src/main/resources/core_relational/relational/milestoning/tests/businessDateMilestoningSetUp.pure b/legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-pure/legend-engine-xt-relationalStore-core-pure/src/main/resources/core_relational/relational/milestoning/tests/businessDateMilestoningSetUp.pure index cc7ffd1c073..1df453359fd 100644 --- a/legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-pure/legend-engine-xt-relationalStore-core-pure/src/main/resources/core_relational/relational/milestoning/tests/businessDateMilestoningSetUp.pure +++ b/legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-pure/legend-engine-xt-relationalStore-core-pure/src/main/resources/core_relational/relational/milestoning/tests/businessDateMilestoningSetUp.pure @@ -374,15 +374,18 @@ function meta::relational::tests::milestoning::initDatabase():Runtime[1] executeInDb('DROP TABLE IF EXISTS Person;', $connection); executeInDb('DROP TABLE IF EXISTS Cars;', $connection); + executeInDb('DROP TABLE IF EXISTS CarDetails;', $connection); executeInDb('DROP TABLE IF EXISTS Bicycles;', $connection); executeInDb('DROP TABLE IF EXISTS Jets;', $connection); executeInDb('CREATE TABLE Person (name VARCHAR(100),id INTEGER, PRIMARY KEY(id));', $connection); executeInDb('CREATE TABLE Cars (in_z TIMESTAMP, out_z TIMESTAMP, id INTEGER PRIMARY KEY, description VARCHAR(200));', $connection); + executeInDb('CREATE TABLE CarDetails (id INTEGER PRIMARY KEY, time TIMESTAMP);', $connection); executeInDb('CREATE TABLE Bicycles (in_z TIMESTAMP, out_z TIMESTAMP, id INTEGER PRIMARY KEY, description VARCHAR(200));', $connection); executeInDb('CREATE TABLE Jets (in_z TIMESTAMP, out_z TIMESTAMP, id INTEGER PRIMARY KEY, description VARCHAR(200));', $connection); executeInDb('INSERT INTO Person (name, id) VALUES (\'Alice\', 1), (\'Bob\', 2), (\'Charlie\', 3), (\'Diana\', 4), (\'Eve\', 5);', $connection); - executeInDb('INSERT INTO Cars (in_z, out_z, id, description) VALUES\n(\'2020-01-01\', \'2050-01-01\', 1, \'Sedan\'),\n(\'2020-01-01\', \'2050-01-01\', 2, \'SUV\'),\n(\'2020-01-01\', \'2050-01-01\', 3, \'Hatchback\'),\n(\'2020-01-01\', \'2050-01-01\', 4, \'Convertible\'),\n(\'2020-01-01\', \'2050-01-01\', 5, \'Truck\');', $connection); - executeInDb('INSERT INTO Bicycles (in_z, out_z, id, description) VALUES\n(\'2020-01-01\', \'2050-01-01\', 5, \'Mountain Bike\'),\n(\'2020-01-01\', \'2050-01-01\', 4, \'Road Bike\'),\n(\'2020-01-01\', \'2050-01-01\', 3, \'Hybrid Bike\'),\n(\'2020-01-01\', \'2050-01-01\', 2, \'Electric Bike\'),\n(\'2020-01-01\', \'2050-01-01\', 1, \'Folding Bike\');', $connection); + executeInDb('INSERT INTO Cars (in_z, out_z, id, description) VALUES\n(\'2020-01-01\', \'2050-01-01\', 1, \'Sedan\'),\n(\'2020-01-01\', \'2050-01-01\', 2, \'SUV\'),\n(\'2020-01-01\', \'2050-01-01\', 3, \'Hatchback\'),\n(\'2020-01-01\', \'2050-01-01\', 4, \'Convertible\'),\n(\'2020-01-01\', \'2050-01-01\', 5, \'Truck\'),\n(\'2100-01-01\', \'2200-01-01\', 6, \'Nuclear Car\');', $connection); + executeInDb('INSERT INTO CarDetails (id, time) VALUES\n(1, \'2025-01-01\'),\n(2, \'2030-01-01\'),\n(3, \'2035-01-01\'),\n(4, \'2040-01-01\'),\n(5, \'2045-01-01\'),\n(6, \'2150-01-01\');', $connection); + executeInDb('INSERT INTO Bicycles (in_z, out_z, id, description) VALUES\n(\'2020-01-01\', \'2050-01-01\', 5, \'Mountain Bike\'),\n(\'2020-01-01\', \'2050-01-01\', 4, \'Road Bike\'),\n(\'2020-01-01\', \'2050-01-01\', 3, \'Hybrid Bike\'),\n(\'2020-01-01\', \'2050-01-01\', 2, \'Electric Bike\'),\n(\'2020-01-01\', \'2050-01-01\', 1, \'Folding Bike\'),\n(\'2200-01-01\', \'2300-01-01\', 6, \'Nuclear Bike\');', $connection); executeInDb('INSERT INTO Jets (in_z, out_z, id, description) VALUES\n(\'2020-01-01\', \'2050-01-01\', 3, \'Fighter Jet\'),\n(\'2020-01-01\', \'2050-01-01\', 8, \'Water Jet\'),\n(\'2020-01-01\', \'2050-01-01\', 6, \'Hybrid Jet\'),\n(\'2020-01-01\', \'2050-01-01\', 4, \'Supersonic Jet\'),\n(\'2020-01-01\', \'2050-01-01\', 2, \'Transformer Jet\');', $connection); ^Runtime(connectionStores=$connectionStore); @@ -1526,6 +1529,63 @@ Mapping meta::relational::tests::milestoning::milestoningmapWithVehicles ) +###Mapping +import meta::relational::tests::milestoning::*; +import meta::relational::tests::milestoning::inheritance::*; + +Mapping meta::relational::tests::milestoning::milestoningmapWithVehiclesUnion +( + + *CarDetails: Operation + { + meta::pure::router::operations::union_OperationSetImplementation_1__SetImplementation_MANY_(c1,c2) + } + + CarDetails[c1]: Relational + { + ~primaryKey ( + [db]CarDetails.id + ) + ~mainTable [db]CarDetails + time: [db]CarDetails.time, + car[meta_relational_tests_milestoning_inheritance_Car]: [db]@Car_CarDetails + } + + CarDetails[c2]: Relational + { + ~primaryKey ( + [db]CarDetails.id + ) + ~mainTable [db]CarDetails + time: [db]CarDetails.time, + car[meta_relational_tests_milestoning_inheritance_Car]: [db]@Car_CarDetails + } + + *Car: Relational + { + ~primaryKey ( + [db]Cars.id + ) + ~mainTable [db]Cars + id: [db]Cars.id, + description: [db]Cars.description, + wheelCount: 4, + bicycle[meta_relational_tests_milestoning_inheritance_Bicycle]: [db]@CarBicycle + } + + *Bicycle: Relational + { + ~primaryKey ( + [db]Bicycles.id + ) + ~mainTable [db]Bicycles + id: [db]Bicycles.id, + description: [db]Bicycles.description, + wheelCount: 2 + } + +) + ###Relational Database meta::relational::tests::milestoning::dbWithInclusion( include meta::relational::tests::milestoning::dbInclusion @@ -2232,6 +2292,12 @@ Database meta::relational::tests::milestoning::db( description VARCHAR(200) ) + Table CarDetails + ( + id INTEGER PRIMARY KEY, + time TIMESTAMP NOT NULL + ) + Join Order_Product(OrderTable.prodFk=ProductTable.id) Join Order_MilestonedProductTable2(OrderTable.prodFk=MilestonedProductTable2.id) @@ -2323,6 +2389,9 @@ Database meta::relational::tests::milestoning::db( Join stockProductView_ProductTable(stockProductView.id = ProductTable.id) Join PersonCar(Person.id = Cars.id) Join PersonBicycle(Person.id = Bicycles.id) + Join CarBicycle(Cars.id = Bicycles.id) + Join Car_CarDetails(Cars.id = CarDetails.id) + Filter IsStockType(ProductTable.type='STOCK') Filter LNSEProducts(ProductExchangeTable.name='STOCK') diff --git a/legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-pure/legend-engine-xt-relationalStore-core-pure/src/main/resources/core_relational/relational/milestoning/tests/milestoningModel.pure b/legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-pure/legend-engine-xt-relationalStore-core-pure/src/main/resources/core_relational/relational/milestoning/tests/milestoningModel.pure index 5cb30098656..36f2741a765 100644 --- a/legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-pure/legend-engine-xt-relationalStore-core-pure/src/main/resources/core_relational/relational/milestoning/tests/milestoningModel.pure +++ b/legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-pure/legend-engine-xt-relationalStore-core-pure/src/main/resources/core_relational/relational/milestoning/tests/milestoningModel.pure @@ -443,6 +443,11 @@ Class <> meta::relational::tests::milestoning::inheri engineType : EngineType[0..1]; } +Class meta::relational::tests::milestoning::inheritance::CarDetails +{ + time: DateTime[1]; + car: Car[0..1]; +} Enum meta::relational::tests::milestoning::inheritance::EngineType { diff --git a/legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-pure/legend-engine-xt-relationalStore-core-pure/src/main/resources/core_relational/relational/milestoning/tests/testBusinessDateMilestoning.pure b/legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-pure/legend-engine-xt-relationalStore-core-pure/src/main/resources/core_relational/relational/milestoning/tests/testBusinessDateMilestoning.pure index 41d7175359a..f90be794bde 100644 --- a/legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-pure/legend-engine-xt-relationalStore-core-pure/src/main/resources/core_relational/relational/milestoning/tests/testBusinessDateMilestoning.pure +++ b/legend-engine-xts-relationalStore/legend-engine-xt-relationalStore-generation/legend-engine-xt-relationalStore-pure/legend-engine-xt-relationalStore-core-pure/src/main/resources/core_relational/relational/milestoning/tests/testBusinessDateMilestoning.pure @@ -539,6 +539,17 @@ function <> meta::relational::tests::milestoning::businessdate::testB assertSameSQL('select "root".id as "orderId" from OrderTable as "root" left outer join (select "ordertable_2".id as id from OrderTable as "ordertable_2" left outer join ProductTable as "producttable_0" on ("ordertable_2".prodFk = "producttable_0".id and "producttable_0".from_z <= "ordertable_2".orderDate and "producttable_0".thru_z > "ordertable_2".orderDate) where "producttable_0".type = \'STOCK\') as "ordertable_1" on ("root".id = "ordertable_1".id)',$result); } +function <> meta::relational::tests::milestoning::businessdate::testBusinessDateInjectionFromVarReferenceWithUnion(): Boolean[1] +{ + let result1 = execute(|meta::relational::tests::milestoning::inheritance::CarDetails.all()->project([x|$x.car($x.time).id, x|$x.car($x.time).bicycle.id, x|$x.car($x.time).bicycle.description],['Car Details/Car/Id', 'Car Details/Car/Bicycle/Id', 'Car Details/Car/Bicycle/Description']);, milestoningmapWithVehiclesUnion, meta::external::store::relational::tests::testRuntime(), meta::relational::extension::relationalExtensions()); + assertSameElements(['1 | 1 | Folding Bike', '1 | 1 | Folding Bike', '2 | 2 | Electric Bike', '2 | 2 | Electric Bike', '3 | 3 | Hybrid Bike', '3 | 3 | Hybrid Bike', '4 | 4 | Road Bike', '4 | 4 | Road Bike', '5 | 5 | Mountain Bike', '5 | 5 | Mountain Bike', '6 | TDSNull | TDSNull', '6 | TDSNull | TDSNull'], $result1.values.rows->map(r | $r.values->makeString(' | '))); + assertEquals('select "cars_0".id as "Car Details/Car/Id", "bicycles_0".id as "Car Details/Car/Bicycle/Id", "bicycles_0".description as "Car Details/Car/Bicycle/Description" from (select "root".id as "pk_0_0", null as "pk_0_1", "root".id as id_0, null as id_1, "root".time as "CarDetailstime_CarDetailstime" from CarDetails as "root" union all select null as "pk_0_0", "root".id as "pk_0_1", null as id_0, "root".id as id_1, "root".time as "CarDetailstime_CarDetailstime" from CarDetails as "root") as "unionBase" left outer join Cars as "cars_0" on (("cars_0".id = "unionBase".id_0 or "cars_0".id = "unionBase".id_1) and "cars_0".in_z <= "unionBase"."CarDetailstime_CarDetailstime" and "cars_0".out_z > "unionBase"."CarDetailstime_CarDetailstime") left outer join (select "bicycles_1".id as id, "bicycles_1".in_z as in_z, "bicycles_1".out_z as out_z, "bicycles_1".description as description from Bicycles as "bicycles_1") as "bicycles_0" on ("bicycles_0".in_z <= "unionBase"."CarDetailstime_CarDetailstime" and "bicycles_0".out_z > "unionBase"."CarDetailstime_CarDetailstime" and "cars_0".id = "bicycles_0".id)', $result1->sqlRemoveFormatting()); + + let result2 = execute(|meta::relational::tests::milestoning::inheritance::CarDetails.all()->project([x|$x.car($x.time).id, x|$x.car($x.time).bicycleAllVersions.id, x|$x.car($x.time).bicycleAllVersions.description],['Car Details/Car/Id', 'Car Details/Car/Bicycle/Id', 'Car Details/Car/Bicycle/Description']);, milestoningmapWithVehiclesUnion, meta::external::store::relational::tests::testRuntime(), meta::relational::extension::relationalExtensions()); + assertSameElements(['1 | 1 | Folding Bike', '1 | 1 | Folding Bike', '2 | 2 | Electric Bike', '2 | 2 | Electric Bike', '3 | 3 | Hybrid Bike', '3 | 3 | Hybrid Bike', '4 | 4 | Road Bike', '4 | 4 | Road Bike', '5 | 5 | Mountain Bike', '5 | 5 | Mountain Bike', '6 | 6 | Nuclear Bike', '6 | 6 | Nuclear Bike'], $result2.values.rows->map(r | $r.values->makeString(' | '))); + assertEquals('select "cars_0".id as "Car Details/Car/Id", "bicycles_0".id as "Car Details/Car/Bicycle/Id", "bicycles_0".description as "Car Details/Car/Bicycle/Description" from (select "root".id as "pk_0_0", null as "pk_0_1", "root".id as id_0, null as id_1, "root".time as "CarDetailstime_CarDetailstime" from CarDetails as "root" union all select null as "pk_0_0", "root".id as "pk_0_1", null as id_0, "root".id as id_1, "root".time as "CarDetailstime_CarDetailstime" from CarDetails as "root") as "unionBase" left outer join Cars as "cars_0" on (("cars_0".id = "unionBase".id_0 or "cars_0".id = "unionBase".id_1) and "cars_0".in_z <= "unionBase"."CarDetailstime_CarDetailstime" and "cars_0".out_z > "unionBase"."CarDetailstime_CarDetailstime") left outer join Bicycles as "bicycles_0" on ("cars_0".id = "bicycles_0".id)', $result2->sqlRemoveFormatting()); +} + function <> meta::relational::tests::milestoning::businessdate::testBusinessDatePropagationInColFunction():Boolean[1] { let productBusDate = %2016-01-01;