[ 
https://issues.apache.org/jira/browse/OLINGO-1387?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

mibo updated OLINGO-1387:
-------------------------
    Fix Version/s: V2 2.0.13
                       (was: V2 2.0.12)

> olingo-odata2-annotation-processor: support multiple links between the same 
> entity sets
> ---------------------------------------------------------------------------------------
>
>                 Key: OLINGO-1387
>                 URL: https://issues.apache.org/jira/browse/OLINGO-1387
>             Project: Olingo
>          Issue Type: Bug
>          Components: odata2-annotation
>            Reporter: Carsten Milkau
>            Priority: Major
>              Labels: patch
>             Fix For: V2 2.1.0, V2 2.0.13
>
>         Attachments: Car.java, Driver.java, 
> odata2-annotation-processor-multiple-links-rc1.patch
>
>   Original Estimate: 24h
>  Remaining Estimate: 24h
>
> When multiple links (associations) exist between the same two entity sets, 
> the annotation processor does not distinguish between them, even if you name 
> the associations explicitly. The EDM provider binds the same association 
> (whatever it finds first) to all navigation properties between this pair of 
> entity sets, reading and writing relations/links produces the same data for 
> each navigation property, even if they should use different associations.
> *Steps to reproduce:*
>  # Checkout cars-annotation-archetype
>  # Add property "previousDrivers" to entity type Car (see Car.java)
>  # Add property "previousCars" to entity type Driver (see Driver.java)
>  # Optional: explicitly name association for properties "Car.Driver" and 
> "Driver.Car"
>  # Run example service
>  # Retrieve EDMX metadata
> *Expected results:*
> Properties "previousDrivers" and "previousCars" use association 
> "Car_previousDrivers_2_Driver_previousCars":
>  
> {color:#0000ff}<{color}{color:#800000}EntityType{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Car">{color}
> {color:#0000ff}<{color}{color:#800000}Key{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}PropertyRef{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Id"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}</{color}{color:#800000}Key{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}Property{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Id"{color} 
> {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.String"{color}
>  
> {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}Property{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Model"{color}
>  
> {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.String"{color}
>  
> {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}Property{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Price"{color}
>  
> {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.Double"{color}
>  
> {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}Property{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"ModelYear"{color}
>  
> {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.Int32"{color}
>  
> {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}Property{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Updated"{color}
>  
> {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.DateTime"{color}
>  
> {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}NavigationProperty{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Manufacturer"{color}
>  
> {color:#ff0000}Relationship{color}{color:#000000}={color}{color:#0000ff}"MyFormula.r_Cars_2_r_Manufacturer"{color}
>  
> {color:#ff0000}FromRole{color}{color:#000000}={color}{color:#0000ff}"r_Cars"{color}
>  
> {color:#ff0000}ToRole{color}{color:#000000}={color}{color:#0000ff}"r_Manufacturer"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}NavigationProperty{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Driver"{color}
>  
> {color:#ff0000}Relationship{color}{color:#000000}={color}{color:#0000ff}"MyFormula.Car_currentDriver_2_Driver_currentCar"{color}
>  
> {color:#ff0000}FromRole{color}{color:#000000}={color}{color:#0000ff}"r_Car"{color}
>  
> {color:#ff0000}ToRole{color}{color:#000000}={color}{color:#0000ff}"r_Driver"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}NavigationProperty{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"PreviousDrivers"{color}
>  
> {color:#ff0000}Relationship{color}{color:#000000}={color}{color:#0000ff}"MyFormula.Car_previousDrivers_2_Driver_previousCars"{color}
>  
> {color:#ff0000}FromRole{color}{color:#000000}={color}{color:#0000ff}"r_PreviousCars"{color}
>  
> {color:#ff0000}ToRole{color}{color:#000000}={color}{color:#0000ff}"r_PreviousDrivers"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}</{color}{color:#800000}EntityType{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}EntityType{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Driver">{color}
> {color:#0000ff}<{color}{color:#800000}Key{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}PropertyRef{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Id"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}</{color}{color:#800000}Key{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}Property{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Id"{color} 
> {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.Int64"{color}
>  
> {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}Property{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Name"{color} 
> {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.String"{color}
>  
> {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}Property{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Lastname"{color}
>  
> {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.String"{color}
>  
> {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}Property{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Nickname"{color}
>  
> {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.String"{color}
>  
> {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}Property{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Birthday"{color}
>  
> {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.DateTime"{color}
>  
> {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}NavigationProperty{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Car"{color} 
> {color:#ff0000}Relationship{color}{color:#000000}={color}{color:#0000ff}"MyFormula.Car_currentDriver_2_Driver_currentCar"{color}
>  
> {color:#ff0000}FromRole{color}{color:#000000}={color}{color:#0000ff}"r_Driver"{color}
>  
> {color:#ff0000}ToRole{color}{color:#000000}={color}{color:#0000ff}"r_Car"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}NavigationProperty{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"PreviousCars"{color}
>  
> {color:#ff0000}Relationship{color}{color:#000000}={color}{color:#0000ff}"MyFormula.Car_previousDrivers_2_Driver_previousCars"{color}
>  
> {color:#ff0000}FromRole{color}{color:#000000}={color}{color:#0000ff}"r_PreviousDrivers"{color}
>  
> {color:#ff0000}ToRole{color}{color:#000000}={color}{color:#0000ff}"r_PreviousCars"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}</{color}{color:#800000}EntityType{color}{color:#0000ff}>{color}
> *Actual results:*
> Properties "previousDrivers" and "previousCars" use association 
> "Car_currentDriver_2_Driver_currentCar":
>  
> {color:#0000ff}<{color}{color:#800000}EntityType{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Car">{color}
> {color:#0000ff}<{color}{color:#800000}Key{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}PropertyRef{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Id"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}</{color}{color:#800000}Key{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}Property{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Id"{color} 
> {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.String"{color}
>  
> {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}Property{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Model"{color}
>  
> {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.String"{color}
>  
> {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}Property{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Price"{color}
>  
> {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.Double"{color}
>  
> {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}Property{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"ModelYear"{color}
>  
> {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.Int32"{color}
>  
> {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}Property{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Updated"{color}
>  
> {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.DateTime"{color}
>  
> {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}NavigationProperty{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Manufacturer"{color}
>  
> {color:#ff0000}Relationship{color}{color:#000000}={color}{color:#0000ff}"MyFormula.r_Cars_2_r_Manufacturer"{color}
>  
> {color:#ff0000}FromRole{color}{color:#000000}={color}{color:#0000ff}"r_Cars"{color}
>  
> {color:#ff0000}ToRole{color}{color:#000000}={color}{color:#0000ff}"r_Manufacturer"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}NavigationProperty{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Driver"{color}
>  
> {color:#ff0000}Relationship{color}{color:#000000}={color}{color:#0000ff}"MyFormula.Car_currentDriver_2_Driver_currentCar"{color}
>  
> {color:#ff0000}FromRole{color}{color:#000000}={color}{color:#0000ff}"r_Car"{color}
>  
> {color:#ff0000}ToRole{color}{color:#000000}={color}{color:#0000ff}"r_Driver"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}NavigationProperty{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"PreviousDrivers"{color}
>  
> {color:#ff0000}Relationship{color}{color:#000000}={color}{color:#0000ff}"MyFormula.Car_currentDriver_2_Driver_currentCar"{color}
>  
> {color:#ff0000}FromRole{color}{color:#000000}={color}{color:#0000ff}"r_Car"{color}
>  
> {color:#ff0000}ToRole{color}{color:#000000}={color}{color:#0000ff}"r_Driver"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}</{color}{color:#800000}EntityType{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}EntityType{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Driver">{color}
> {color:#0000ff}<{color}{color:#800000}Key{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}PropertyRef{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Id"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}</{color}{color:#800000}Key{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}Property{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Id"{color} 
> {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.Int64"{color}
>  
> {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}Property{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Name"{color} 
> {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.String"{color}
>  
> {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}Property{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Lastname"{color}
>  
> {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.String"{color}
>  
> {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}Property{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Nickname"{color}
>  
> {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.String"{color}
>  
> {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}Property{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Birthday"{color}
>  
> {color:#ff0000}Type{color}{color:#000000}={color}{color:#0000ff}"Edm.DateTime"{color}
>  
> {color:#ff0000}Nullable{color}{color:#000000}={color}{color:#0000ff}"true"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}NavigationProperty{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"Car"{color} 
> {color:#ff0000}Relationship{color}{color:#000000}={color}{color:#0000ff}"MyFormula.Car_currentDriver_2_Driver_currentCar"{color}
>  
> {color:#ff0000}FromRole{color}{color:#000000}={color}{color:#0000ff}"r_Driver"{color}
>  
> {color:#ff0000}ToRole{color}{color:#000000}={color}{color:#0000ff}"r_Car"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}<{color}{color:#800000}NavigationProperty{color} 
> {color:#ff0000}Name{color}{color:#000000}={color}{color:#0000ff}"PreviousCars"{color}
>  
> {color:#ff0000}Relationship{color}{color:#000000}={color}{color:#0000ff}"MyFormula.Car_currentDriver_2_Driver_currentCar"{color}
>  
> {color:#ff0000}FromRole{color}{color:#000000}={color}{color:#0000ff}"r_Driver"{color}
>  
> {color:#ff0000}ToRole{color}{color:#000000}={color}{color:#0000ff}"r_Car"{color}{color:#800000}/{color}{color:#0000ff}>{color}
> {color:#0000ff}</{color}{color:#800000}EntityType{color}{color:#0000ff}>{color}
>  *Workaround:*
>  # Only workaround is to change your model. You could promote the 
> associations to entity types only consisting of navigation properties, for 
> instance.
> *Additional information:*
>  # Interface Datasource lacks a means of communicating the link followed when 
> reading or writing related data. Only the target entity set can be 
> communicated. The fix must change this.
>  # The patch currently just adds an optional parameter to the relevant 
> interface methods passing the navigation property. When the parameter is not 
> passed, the navigation property is guessed as before. This breaks 
> applications that directly use the interface, but only those.
>  # Obviously, there is no point in both changing the interface and keeping 
> the old guessing behavior. But which of both is the correct choice?
>  ## (Incompatible change) Change the relevant interface methods and pass the 
> necessary navigation property.
>  ## (Compatible change) Make an extension interface with new methods that 
> additionally pass the navigation property and detect whether the extension 
> interface is supported by the Datasource implementation.
>  ## Other: ___________________________
>  



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

Reply via email to