You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ra...@apache.org on 2017/12/18 09:34:25 UTC

olingo-odata4 git commit: [OLINGO-1144] How to use the FilterFactory to create a valid URI for filtering on a ComplexValue in a collection

Repository: olingo-odata4
Updated Branches:
  refs/heads/master 387ba9c09 -> ee919d812


[OLINGO-1144] How to use the FilterFactory to create a valid URI for filtering on a ComplexValue in a collection


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/ee919d81
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/ee919d81
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/ee919d81

Branch: refs/heads/master
Commit: ee919d812d7168541734079f7a01633311ff23b5
Parents: 387ba9c
Author: ramya vasanth <ra...@sap.com>
Authored: Mon Dec 18 15:04:16 2017 +0530
Committer: ramya vasanth <ra...@sap.com>
Committed: Mon Dec 18 15:04:16 2017 +0530

----------------------------------------------------------------------
 .../olingo/fit/tecsvc/client/BasicITCase.java   | 42 ++++++++++++++++++++
 .../olingo/client/api/uri/FilterArgFactory.java |  4 ++
 .../client/core/uri/FilterArgFactoryImpl.java   | 14 ++++++-
 .../olingo/client/core/uri/FilterLambda.java    | 34 ++++++++++++----
 .../client/core/uri/FilterFactoryTest.java      | 26 ++++++++++++
 5 files changed, 111 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ee919d81/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java
index e2b5739..960e63b 100644
--- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BasicITCase.java
@@ -78,7 +78,10 @@ import org.apache.olingo.client.api.domain.ClientValue;
 import org.apache.olingo.client.api.edm.xml.Reference;
 import org.apache.olingo.client.api.edm.xml.XMLMetadata;
 import org.apache.olingo.client.api.serialization.ODataDeserializerException;
+import org.apache.olingo.client.api.uri.FilterArgFactory;
+import org.apache.olingo.client.api.uri.FilterFactory;
 import org.apache.olingo.client.api.uri.URIBuilder;
+import org.apache.olingo.client.api.uri.URIFilter;
 import org.apache.olingo.client.core.ODataClientFactory;
 import org.apache.olingo.client.core.uri.URIUtils;
 import org.apache.olingo.commons.api.edm.Edm;
@@ -1663,4 +1666,43 @@ public class BasicITCase extends AbstractParamTecSvcITCase {
       assertEquals("EnumMember", expression.getExpressionName());
   }
   }
+  
+  @Test
+  public void issue1144() {
+    FilterFactory filFactory = getClient().getFilterFactory();
+    FilterArgFactory filArgFactory = filFactory.getArgFactory();
+    URIFilter andFilExp = filFactory.and(filFactory.eq("d/olingo.odata.test1.CTBase/AdditionalPropString", "ADD TEST"), 
+        filFactory.eq("d/olingo.odata.test1.CTBase/AdditionalPropString", "ADD TEST"));
+    final URIFilter filter = filFactory.match(
+        filArgFactory.any(filArgFactory.property("CollPropertyComp"), "d", andFilExp));
+    String strFilter = filter.build();
+    ODataEntitySetRequest<ClientEntitySet> request = getClient().getRetrieveRequestFactory()
+        .getEntitySetRequest(getClient().newURIBuilder(SERVICE_URI)
+            .appendEntitySetSegment(ES_MIX_PRIM_COLL_COMP).filter(strFilter).build());
+    assertNotNull(request);
+    setCookieHeader(request);
+
+    final ODataRetrieveResponse<ClientEntitySet> response = request.execute();
+    saveCookieHeader(response);
+    assertNotNull(response.getHeaderNames());
+    assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
+    assertContentType(response.getContentType());
+
+    final ClientEntitySet entitySet = response.getBody();
+    assertNotNull(entitySet);
+
+    assertNull(entitySet.getCount());
+    assertNull(entitySet.getNext());
+    assertEquals(Collections.<ClientAnnotation> emptyList(), entitySet.getAnnotations());
+    assertNull(entitySet.getDeltaLink());
+
+    final List<ClientEntity> entities = entitySet.getEntities();
+    assertNotNull(entities);
+    assertEquals(3, entities.size());
+    final ClientEntity entity = entities.get(2);
+    assertNotNull(entity);
+    final ClientProperty property = entity.getProperty("CollPropertyComp");
+    assertNotNull(property);
+    assertEquals(3, property.getCollectionValue().size());
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ee919d81/lib/client-api/src/main/java/org/apache/olingo/client/api/uri/FilterArgFactory.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/uri/FilterArgFactory.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/uri/FilterArgFactory.java
index 9a768b6..3366a0b 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/uri/FilterArgFactory.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/uri/FilterArgFactory.java
@@ -110,7 +110,11 @@ public interface FilterArgFactory {
   FilterArg geoLength(FilterArg first, FilterArg second);
 
   FilterArg any(FilterArg collection, URIFilter expression);
+  
+  FilterArg any(FilterArg collection, String lambdaVariable, URIFilter expression);
 
   FilterArg all(FilterArg collection, URIFilter expression);
+  
+  FilterArg all(FilterArg collection, String lambdaVariable, URIFilter expression);
 
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ee919d81/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/FilterArgFactoryImpl.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/FilterArgFactoryImpl.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/FilterArgFactoryImpl.java
index d6996b2..49f59b0 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/FilterArgFactoryImpl.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/FilterArgFactoryImpl.java
@@ -246,12 +246,22 @@ public class FilterArgFactoryImpl implements FilterArgFactory {
 
   @Override
   public FilterArg any(final FilterArg collection, final URIFilter expression) {
-    return new FilterLambda(collection, "any", expression);
+    return new FilterLambda(collection, "any", expression, null);
   }
 
   @Override
   public FilterArg all(final FilterArg collection, final URIFilter expression) {
-    return new FilterLambda(collection, "all", expression);
+    return new FilterLambda(collection, "all", expression, null);
+  }
+
+  @Override
+  public FilterArg any(FilterArg collection, String lambdaVariable, URIFilter expression) {
+    return new FilterLambda(collection, "any", expression, lambdaVariable);
+  }
+
+  @Override
+  public FilterArg all(FilterArg collection, String lambdaVariable, URIFilter expression) {
+    return new FilterLambda(collection, "all", expression, lambdaVariable);
   }
 
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ee919d81/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/FilterLambda.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/FilterLambda.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/FilterLambda.java
index f99ea4e..9a9978b 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/FilterLambda.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/FilterLambda.java
@@ -28,19 +28,39 @@ public class FilterLambda implements FilterArg {
   private final String operator;
 
   private final URIFilter expression;
+  
+  private final String lambdaVariable;
+  
+  public static final String COLON = ":"; 
+  
+  public static final String OPENBRAC = "(";
+  
+  public static final String CLOSEBRAC = ")";
+  
+  public static final String SLASH = "/";
 
-  public FilterLambda(final FilterArg collection, final String operator, final URIFilter expression) {
+  public FilterLambda(final FilterArg collection, final String operator, final URIFilter expression,
+      final String predicate) {
     this.collection = collection;
     this.operator = operator;
     this.expression = expression;
+    this.lambdaVariable = predicate;
   }
-
+  
   @Override
   public String build() {
-    return new StringBuilder(collection.build()).
-            append('/').
-            append(operator).
-            append(expression.build()).
-            toString();
+    StringBuilder builder = new StringBuilder(collection.build()).
+        append(SLASH).
+        append(operator);
+    if (this.lambdaVariable != null && this.lambdaVariable.length() > 0) {
+      builder.append(OPENBRAC).
+          append(lambdaVariable).append(COLON).
+          append(expression.build()).
+          append(CLOSEBRAC);
+    } else {
+      builder.
+          append(expression.build());
+    }
+    return builder.toString();
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/ee919d81/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/FilterFactoryTest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/FilterFactoryTest.java b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/FilterFactoryTest.java
index 0bd5510..51cb9f7 100644
--- a/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/FilterFactoryTest.java
+++ b/lib/client-core/src/test/java/org/apache/olingo/client/core/uri/FilterFactoryTest.java
@@ -90,5 +90,31 @@ public class FilterFactoryTest extends AbstractTest {
     assertEquals("(OrderDate ge " + Encoder.encode("2011-03-08T14:21:12-08:00") + ")",
         filter.build());
   }
+  
+  @Test
+  public void issue1144Any() {
+    URIFilter andFilExp = getFilterFactory().and(getFilterFactory().eq("d/Quantity", 100), 
+        getFilterFactory().eq("d/Quantity", 50));
+    final URIFilter filter = getFilterFactory().match(
+        getFilterArgFactory().any(getFilterArgFactory().property("Items"), "d", andFilExp));
+    assertEquals("Items/any(d:((d/Quantity eq 100) and (d/Quantity eq 50)))", filter.build());
+  }
 
+  @Test
+  public void all() {
+    final URIFilter filter = getFilterFactory().match(
+        getFilterArgFactory().all(getFilterArgFactory().property("Items"),
+            getFilterFactory().gt("d:d/Quantity", 100)));
+
+    assertEquals("Items/all(d:d/Quantity gt 100)", filter.build());
+  }
+  
+  @Test
+  public void issue1144All() {
+    URIFilter andFilExp = getFilterFactory().and(getFilterFactory().eq("d/Quantity", 100), 
+        getFilterFactory().eq("d/Quantity", 50));
+    final URIFilter filter = getFilterFactory().match(
+        getFilterArgFactory().all(getFilterArgFactory().property("Items"), "d", andFilExp));
+    assertEquals("Items/all(d:((d/Quantity eq 100) and (d/Quantity eq 50)))", filter.build());
+  }
 }