You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@olingo.apache.org by "Santosh kumar (JIRA)" <ji...@apache.org> on 2016/05/26 11:02:12 UTC

[jira] [Commented] (OLINGO-414) Cannot Filter on Navigation Property

    [ https://issues.apache.org/jira/browse/OLINGO-414?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15301945#comment-15301945 ] 

Santosh kumar commented on OLINGO-414:
--------------------------------------

Hi All,
I was able to debug the issue and identify the root cause. The issue seems to be in ODataExpressionParser.java class ( of olingo-odata2-jpa-processor-core module) of Olingo Library. The method that I had to modify for the fix is given below.

- private static String getPropertyName(final CommonExpression whereExpression)
                    throws EdmException, ODataJPARuntimeException {
             EdmTyped edmProperty = ((PropertyExpression) whereExpression).getEdmProperty();
             
             if (edmProperty instanceof EdmNavigationProperty) { throw
               ODataJPARuntimeException.throwException(ODataJPARuntimeException.
               FILTER_ON_NAVIGATION_NOT_SUPPORTED, null); 
                }          
                 String name = "";
              EdmMapping mapping =null;
             
                //  Rest of the code.
       }

In the above code, when we see NavigationProperty, instead of throwing an exception, we could simply return internal name or name of the navigation property depending on below condition (navigation property could have a customized name, like in my case SiblingEntity is the customized name. URL is given below)

if (edmProperty instanceof EdmNavigationProperty) {
                    EdmNavigationProperty edmNavigationProperty=(EdmNavigationProperty) edmProperty;
                    mapping= edmNavigationProperty.getMapping();
                    if (mapping != null) {
                           return mapping.getInternalName();
                    }
             return  edmNavigationProperty.getName();
             }

Also I have written a JUnit to test this functionality. Below is the JPQL Statement and the SQL query generated by Olingo and eclipse link respectively.

JPQL : SELECT E1 FROM SalesOrderType E1 WHERE (E1.salesOrderInfo.isActiveEntity IS null) ORDER BY E1.activeSalesOrderID , E1.salesOrderDraftUUID

SQL:
SELECT t0."ActiveSalesOrderID", t0."SalesOrderDraftUUID", t0."ApprovalComment", t0."Approved", t0."BillingStatus", t0."BusinessPartnerID", t0."CreationDateTime", t0."CreationUserName", t0."CurrencyCode", t0."DeliveryStatus", t0."DraftAdministrativeDataUUID", t0."GrossAmount", t0."HasActiveEntity", t0."HasDraftEntity", t0."IsActiveEntity", t0."LastChangedDateTime", t0."LastChangedUserName", t0."LifecycleStatus", t0."LogNumber", t0."NetAmount", t0."OpportunityID", t0."SalesOrderID", t0."TaxAmount", t0."UXBUSINESSPARTNERID", t0."UXDELETABLEENTITY", t0."UXUPDATABLEENTITY" FROM "SCHEMA"."SALESORDER" t0, " SCHEMA "."SALESORDER" t1 WHERE ((t1."IsActiveEntity" IS NULL) AND ((t1."SalesOrderDraftUUID" = t0."SalesOrderDraftUUID") AND (t1."ActiveSalesOrderID" = t0."ActiveSalesOrderID"))) ORDER BY t0."ActiveSalesOrderID", t0."SalesOrderDraftUUID"")

The URL for the scenario is : https://localhost:9443/draftinfrastructure/salesorder.svc/SalesOrderTypes?$skip=0&$top=50&$filter=(SiblingEntity/IsActiveEntity eq null).

SiblingEntity is the navigation property in this url and IsActiveEntity is the property inside sibling entity which is of type SalesOrderEntity.

I don't think there is any issue related to JPQL in Olingo or SQL in Eclipse link (or any JPA for that matter).
 Let me know what you think? 

Thanks and Regards,
Santosh


> Cannot Filter on Navigation Property
> ------------------------------------
>
>                 Key: OLINGO-414
>                 URL: https://issues.apache.org/jira/browse/OLINGO-414
>             Project: Olingo
>          Issue Type: Bug
>          Components: odata2-jpa
>    Affects Versions: V2 2.0.0
>            Reporter: Simon Carroll
>         Attachments: olingo-414-exception.diff, olingo-414-patch.diff
>
>
> We are receiving an error when we try to filter on a navigation property.  In our solution we have a Notification entity and a User entity, we would like to retrieve a specific Notification but only if it is linked to the requesting user.  This would involve an ODATA request which filters on both the UserId and the NotificationId.  An example of the URL we are invoking is:
> dspplatform.svc/Notifications?$filter=NotificationId%20eq%204%20and%20UserDetails/UserId%20eq%202
> This returns the following error:
> org.apache.olingo.odata2.core.edm.provider.EdmNavigationPropertyImplProv cannot be cast to org.apache.olingo.odata2.api.edm.EdmProperty
> Can you please advise on how to perform filters on a Navigation property as we need this as part of our core functionality?



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)