Feature request: Improve mapping coverage analysis algorithm to support auto mapped properties via binding
- Dominant language
- TypeScript
- Stars
- 111
- Forks
- 149
- Avg merge
- 9h 39m
- Merged PRs (30d)
- 63
Description
### Similar requests
- [X] I have searched and found no existing similar requests
### How are you using Legend?
Legend Studio
### What problems are you trying to solve?
```
###Relational
Database inheritance::store::MemSQLDB
(
Schema PERSON_SCHEMA
(
Table PERSON_TABLE
(
ID INTEGER PRIMARY KEY,
FIRSTNAME VARCHAR(100),
LASTNAME VARCHAR(100),
FIRM_DETAILS JSON,
MANAGERID INTEGER
)
)
)
Database inheritance::store::SnowflakeDB
(
Schema PERSON_SCHEMA
(
Table PERSON_TABLE
(
ID INTEGER PRIMARY KEY,
FIRSTNAME VARCHAR(100),
LASTNAME VARCHAR(100),
FIRM_DETAILS SEMISTRUCTURED,
MANAGERID INTEGER
)
)
)
Database inheritance::store::H2DB
(
Schema PERSON_SCHEMA
(
Table PERSON_TABLE
(
ID INTEGER PRIMARY KEY,
FIRSTNAME VARCHAR(100),
LASTNAME VARCHAR(100),
FIRM_DETAILS VARCHAR(1000),
MANAGERID INTEGER
)
)
)
###ExternalFormat
Binding inheritance::store::FirmBinding
{
contentType: 'application/json';
modelIncludes: [
inheritance::model::Firm,
inheritance::model::Address,
inheritance::model::AddressWithLines,
inheritance::model::AddressLine,
inheritance::model::StreetAddressLine,
inheritance::model::CityAddressLine,
inheritance::model::StateAddressLine
];
}
###Pure
Class inheritance::model::AddressLine
{
lineno: Integer[1];
}
Class inheritance::model::StreetAddressLine extends inheritance::model::AddressLine
{
street: String[1];
}
Class inheritance::model::StateAddressLine extends inheritance::model::AddressLine
{
state: String[1];
}
Class inheritance::model::CityAddressLine extends inheritance::model::AddressLine
{
city: String[1];
}
Class inheritance::model::Address
{
name: String[1];
}
Class inheritance::model::Person
{
firstName: String[1];
lastName: String[1];
firm: inheritance::model::Firm[1];
}
Class inheritance::model::Firm
{
legalName: String[1];
address: inheritance::model::Address[1];
}
Class inheritance::model::AddressWithLines extends inheritance::model::Address
{
lines: inheritance::model::AddressLine[*];
}
function inheritance::semiStructuredPropertyAccessAtSubClass(): meta::pure::tds::TabularDataSet[1]
{
inheritance::model::Person.all()->project(
[
col(
x|$x.firstName,
'First Name'
),
col(
x|$x.firm.address->subType(
@inheritance::model::AddressWithLines
).lines->at(0).lineno,
'Firm Address 0 Line No'
)
]
)
}
function inheritance::semiStructuredPropertyAccessAtSubClassNested(): meta::pure::tds::TabularDataSet[1]
{
inheritance::model::Person.all()->project(
[
col(
x|$x.firstName,
'First Name'
),
col(
x|$x.firm.address->subType(
@inheritance::model::AddressWithLines
).lines->at(0).lineno,
'Firm Address 0 Line No'
),
col(
x|$x.firm.address->subType(
@inheritance::model::AddressWithLines
).lines->at(0)->subType(
@inheritance::model::StreetAddressLine
).street,
'Firm Address Street'
),
col(
x|$x.firm.address->subType(
@inheritance::model::AddressWithLines
).lines->at(1)->subType(
@inheritance::model::CityAddressLine
).city,
'Firm Address City'
),
col(
x|$x.firm.address->subType(
@inheritance::model::AddressWithLines
).lines->at(2)->subType(
@inheritance::model::StateAddressLine
).state,
'Firm Address State'
)
]
)
}
function inheritance::semiStructuredPropertyAccessAtSubClassNestedUsingProjectWithFunctions(): meta::pure::tds::TabularDataSet[1]
{
inheritance::model::Person.all()->project(
[
x|$x.firstName,
x|$x.firm.address->subType(
@inheritance::model::AddressWithLines
).lines->at(0).lineno,
x|$x.firm.address->subType(
@inheritance::model::AddressWithLines
).lines->at(0)->subType(
@inheritance::model::StreetAddressLine
).street,
x|$x.firm.address->subType(
@inheritance::model::AddressWithLines
).lines->at(1)->subType(
@inheritance::model::CityAddressLine
).city,
x|$x.firm.address->subType(
@inheritance::model::AddressWithLines
).lines->at(2)->subType(
@inheritance::model::StateAddressLine
).state
],
[
'First Name',
'Firm Address 0 Line No',
'Firm Address Street',
'Firm Address City',
'Firm Address State'
]
)
}
function inheritance::semiStructuredPropertyAccessAtBaseClass(): meta::pure::tds::TabularDataSet[1]
{
inheritance::model::Person.all()->project(
[
col(
x|$x.firstName,
'First Name'
),
col(
x|$x.firm.address.name,
'Firm Address Name'
)
]
)
}
###Mapping
Mapping inheritance::mapping::MemSQLMapping
(
inheritance::model::Person: Relational
{
~primaryKey
(
[inheritance::store::MemSQLDB]PERSON_SCHEMA.PERSON_TABLE.ID
)
~mainTable [inheritance::store::MemSQLDB]PERSON_SCHEMA.PERSON_TABLE
firstName: [inheritance::store::MemSQLDB]PERSON_SCHEMA.PERSON_TABLE.FIRSTNAME,
lastName: [inheritance::store::MemSQLDB]PERSON_SCHEMA.PERSON_TABLE.LASTNAME,
firm: Binding inheritance::store::FirmBinding : [inheritance::store::MemSQLDB]PERSON_SCHEMA.PERSON_TABLE.FIRM_DETAILS
}
)
Mapping inheritance::mapping::H2Mapping
(
inheritance::model::Person: Relational
{
~primaryKey
(
[inheritance::store::H2DB]PERSON_SCHEMA.PERSON_TABLE.ID
)
~mainTable [inheritance::store::H2DB]PERSON_SCHEMA.PERSON_TABLE
firstName: [inheritance::store::H2DB]PERSON_SCHEMA.PERSON_TABLE.FIRSTNAME,
lastName: [inheritance::store::H2DB]PERSON_SCHEMA.PERSON_TABLE.LASTNAME,
firm: Binding inheritance::store::FirmBinding : [inheritance::store::H2DB]PERSON_SCHEMA.PERSON_TABLE.FIRM_DETAILS
}
)
Mapping inheritance::mapping::SnowflakeMapping
(
inheritance::model::Person: Relational
{
~primaryKey
(
[inheritance::store::SnowflakeDB]PERSON_SCHEMA.PERSON_TABLE.ID
)
~mainTable [inheritance::store::SnowflakeDB]PERSON_SCHEMA.PERSON_TABLE
firstName: [inheritance::store::SnowflakeDB]PERSON_SCHEMA.PERSON_TABLE.FIRSTNAME,
lastName: [inheritance::store::SnowflakeDB]PERSON_SCHEMA.PERSON_TABLE.LASTNAME,
firm: Binding inheritance::store::FirmBinding : [inheritance::store::SnowflakeDB]PERSON_SCHEMA.PERSON_TABLE.FIRM_DETAILS
}
)
```
### Describe the solution you would like to see implemented
Improve mapping coverage analysis algorithm to support auto mapped properties via binding
### Describe alternatives you have considered
_No response_
### Documentation, Design, Adoption, Migration Strategy
_No response_
### Contribution
- [X] I would like to work on this feature
Contributor guide
Assessment
This issue has not been assessed yet.