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 <[email protected]> Authored: Mon Dec 18 15:04:16 2017 +0530 Committer: ramya vasanth <[email protected]> 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()); + } }
