This is an automated email from the ASF dual-hosted git repository.

ramyav pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/olingo-odata4.git


The following commit(s) were added to refs/heads/master by this push:
     new aca474f  [OLINGO-1368]OData V4: Support In Operator in filters
aca474f is described below

commit aca474ff646e15c1a8332084cdb548c91ecda0b6
Author: ramya vasanth <[email protected]>
AuthorDate: Mon Jun 17 14:23:36 2019 +0530

    [OLINGO-1368]OData V4: Support In Operator in filters
---
 .../apache/olingo/fit/base/MetadataTestITCase.java |   2 +-
 .../fit/tecsvc/client/AsyncSupportITCase.java      |   4 +-
 .../olingo/fit/tecsvc/client/BasicITCase.java      |  10 +-
 .../fit/tecsvc/client/BoundOperationITCase.java    |   2 +-
 .../fit/tecsvc/client/EntityReferencesITCase.java  |   8 +-
 .../fit/tecsvc/client/FilterSystemQueryITCase.java |  54 +++++-----
 .../tecsvc/client/OrderBySystemQueryITCase.java    |  23 +++--
 .../fit/tecsvc/client/SystemQueryOptionITCase.java |   4 +-
 .../olingo/fit/tecsvc/http/InOperatorITCase.java   | 109 +++++++++++++++++++++
 .../olingo/commons/core/edm/EdmProviderImpl.java   |   3 +-
 .../api/uri/queryoption/expression/Binary.java     |   8 ++
 .../queryoption/expression/BinaryOperatorKind.java |   5 +
 .../queryoption/expression/ExpressionVisitor.java  |  12 +++
 .../server/core/debug/ExpressionJsonVisitor.java   |  16 +++
 .../server/core/uri/parser/ExpressionParser.java   |  59 ++++++++++-
 .../server/core/uri/parser/UriTokenizer.java       |   4 +
 .../uri/queryoption/expression/BinaryImpl.java     |  34 ++++++-
 .../core/uri/parser/ExpressionParserTest.java      |  23 ++++-
 .../olingo/server/tecsvc/data/DataCreator.java     |  19 ++++
 .../expression/ExpressionVisitorImpl.java          |  35 +++++++
 .../expression/operand/TypedOperand.java           |  80 +++++++++++++--
 .../expression/operand/UntypedOperand.java         |  27 +++++
 .../expression/operand/VisitorOperand.java         |   2 +
 .../expression/operation/BinaryOperator.java       |  47 ++++++++-
 .../server/tecsvc/data/DataProviderTest.java       |   2 +-
 .../serializer/json/ODataJsonSerializerTest.java   |  12 +--
 .../json/ODataJsonSerializerv01Test.java           |  12 +--
 .../serializer/xml/ODataXmlSerializerTest.java     |  44 +++++++++
 .../server/core/uri/testutil/FilterTreeToText.java |   6 ++
 29 files changed, 589 insertions(+), 77 deletions(-)

diff --git 
a/fit/src/test/java/org/apache/olingo/fit/base/MetadataTestITCase.java 
b/fit/src/test/java/org/apache/olingo/fit/base/MetadataTestITCase.java
index 184593d..46687cc 100644
--- a/fit/src/test/java/org/apache/olingo/fit/base/MetadataTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/base/MetadataTestITCase.java
@@ -41,7 +41,7 @@ public class MetadataTestITCase extends AbstractTestITCase {
     final Edm edm = client.getRetrieveRequestFactory().
         getMetadataRequest(testVocabulariesServiceRootURL).execute().getBody();
     assertNotNull(edm);
-
+    
     final EdmTerm isLanguageDependent = edm.getTerm(new 
FullQualifiedName("Core", "IsLanguageDependent"));
     assertNotNull(isLanguageDependent);
     
assertTrue(isLanguageDependent.getAppliesTo().contains(TargetType.Property));
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/AsyncSupportITCase.java 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/AsyncSupportITCase.java
index 8694605..57bd7af 100644
--- 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/AsyncSupportITCase.java
+++ 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/AsyncSupportITCase.java
@@ -142,7 +142,7 @@ public final class AsyncSupportITCase extends 
AbstractParamTecSvcITCase {
         .getEntitySetRequest(uri).execute();
     assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
     ClientEntitySet responseBody = response.getBody();
-    assertEquals(3, responseBody.getEntities().size());
+    assertEquals(4, responseBody.getEntities().size());
     checkEntityAvailableWith(responseBody, "PropertyInt16", 32767);
 
     // first async request
@@ -174,7 +174,7 @@ public final class AsyncSupportITCase extends 
AbstractParamTecSvcITCase {
     ResWrap<EntityCollection> firWrap = 
client.getDeserializer(getContentType())
         .toEntitySet(firstResponse.getRawResponse());
     EntityCollection firstResponseEntitySet = firWrap.getPayload();
-    assertEquals(3, firstResponseEntitySet.getEntities().size());
+    assertEquals(4, firstResponseEntitySet.getEntities().size());
     Entity firstResponseEntity = firstResponseEntitySet.getEntities().get(0);
     assertShortOrInt(32767, 
firstResponseEntity.getProperty("PropertyInt16").asPrimitive());
     assertEquals("First Resource - positive values", 
firstResponseEntity.getProperty("PropertyString").asPrimitive());
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 e04f668..fdde68a 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
@@ -294,7 +294,7 @@ public class BasicITCase extends AbstractParamTecSvcITCase {
     assertNotNull(res);
 
     final ResWrap<ClientEntitySet> entitySet = 
res.getBodyAs(ClientEntitySet.class);
-    assertEquals(3, entitySet.getPayload().getEntities().size());
+    assertEquals(4, entitySet.getPayload().getEntities().size());
   }
   
   @Test
@@ -1303,7 +1303,6 @@ public class BasicITCase extends 
AbstractParamTecSvcITCase {
         getFactory().newPrimitiveValueBuilder().buildInt64(null)));
     
entity.getProperties().add(getFactory().newPrimitiveProperty(PROPERTY_DECIMAL,
         getFactory().newPrimitiveValueBuilder().buildDecimal(null)));
-
     final ODataEntityUpdateRequest<ClientEntity> requestUpdate = 
getEdmEnabledClient().getCUDRequestFactory()
         .getEntityUpdateRequest(uri, UpdateType.PATCH, entity);
     requestUpdate.setContentType(CONTENT_TYPE_JSON_IEEE754_COMPATIBLE);
@@ -1456,7 +1455,7 @@ public class BasicITCase extends 
AbstractParamTecSvcITCase {
     assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
 
     final List<ClientEntity> entities = response.getBody().getEntities();
-    assertEquals(3, entities.size());
+    assertEquals(4, entities.size());
 
     ClientEntity entity = entities.get(0);
     assertEquals(-32768, 
entity.getProperty(PROPERTY_INT16).getPrimitiveValue().toValue());
@@ -1469,6 +1468,11 @@ public class BasicITCase extends 
AbstractParamTecSvcITCase {
     assertEquals(BigDecimal.valueOf(0), 
entity.getProperty(PROPERTY_DECIMAL).getPrimitiveValue().toValue());
 
     entity = entities.get(2);
+    assertEquals(10, 
entity.getProperty(PROPERTY_INT16).getPrimitiveValue().toValue());
+    assertEquals(0L, 
entity.getProperty(PROPERTY_INT64).getPrimitiveValue().toValue());
+    assertEquals(BigDecimal.valueOf(0), 
entity.getProperty(PROPERTY_DECIMAL).getPrimitiveValue().toValue());
+    
+    entity = entities.get(3);
     assertEquals(32767, 
entity.getProperty(PROPERTY_INT16).getPrimitiveValue().toValue());
     assertEquals(Long.MAX_VALUE, 
entity.getProperty(PROPERTY_INT64).getPrimitiveValue().toValue());
     assertEquals(BigDecimal.valueOf(34), 
entity.getProperty(PROPERTY_DECIMAL).getPrimitiveValue().toValue());
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BoundOperationITCase.java
 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BoundOperationITCase.java
index ef0af2b..38a985e 100644
--- 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BoundOperationITCase.java
+++ 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/BoundOperationITCase.java
@@ -96,7 +96,7 @@ public class BoundOperationITCase extends 
AbstractParamTecSvcITCase {
         
     final List<ClientEntity> entities = entitySet.getEntities();
     assertNotNull(entities);
-    assertEquals(3, entities.size());
+    assertEquals(4, entities.size());
     
     ClientEntity entity = entities.get(0);
     assertNotNull(entity);
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/EntityReferencesITCase.java
 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/EntityReferencesITCase.java
index 654aea7..77cd7d5 100644
--- 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/EntityReferencesITCase.java
+++ 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/EntityReferencesITCase.java
@@ -68,7 +68,7 @@ public class EntityReferencesITCase extends 
AbstractParamTecSvcITCase {
                           .appendRefSegment()
                           .orderBy(PROPERTY_INT16).build();
     
-    sendRequest(uri, 3, "ESAllPrim(-32768)", "ESAllPrim(0)", 
"ESAllPrim(32767)");
+    sendRequest(uri, 4, "ESAllPrim(-32768)", "ESAllPrim(0)", "ESAllPrim(10)", 
"ESAllPrim(32767)");
   }
   
   @Test
@@ -78,7 +78,7 @@ public class EntityReferencesITCase extends 
AbstractParamTecSvcITCase {
                           .appendRefSegment()
                           .orderBy(PROPERTY_INT16 + DESCENDING).build();
     
-    sendRequest(uri, 3, "ESAllPrim(32767)", "ESAllPrim(0)", 
"ESAllPrim(-32768)");
+    sendRequest(uri, 4, "ESAllPrim(32767)", "ESAllPrim(10)", "ESAllPrim(0)", 
"ESAllPrim(-32768)");
   }
   
   @Test
@@ -122,7 +122,7 @@ public class EntityReferencesITCase extends 
AbstractParamTecSvcITCase {
         .getEntitySetRequest(uri)
         .execute();
     
-    assertEquals(Integer.valueOf(3), response.getBody().getCount());
+    assertEquals(Integer.valueOf(4), response.getBody().getCount());
   }
   
   @Test
@@ -132,7 +132,7 @@ public class EntityReferencesITCase extends 
AbstractParamTecSvcITCase {
                           .appendRefSegment()
                           .orderBy(PROPERTY_INT16).skip(2).build();
     
-    sendRequest(uri, 1, "ESAllPrim(32767)");
+    sendRequest(uri, 2, "ESAllPrim(10)", "ESAllPrim(32767)");
   }
   
   @Test
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FilterSystemQueryITCase.java
 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FilterSystemQueryITCase.java
index 017caba..ad94444 100644
--- 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FilterSystemQueryITCase.java
+++ 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/FilterSystemQueryITCase.java
@@ -88,7 +88,7 @@ public class FilterSystemQueryITCase extends 
AbstractParamTecSvcITCase {
   @Test
   public void booleanLiteral() {
     ODataRetrieveResponse<ClientEntitySet> response = sendRequest(ES_ALL_PRIM, 
"PropertyBoolean eq false");
-    assertEquals(2, response.getBody().getEntities().size());
+    assertEquals(3, response.getBody().getEntities().size());
 
     ClientEntity clientEntity = response.getBody().getEntities().get(0);
     assertShortOrInt(-32768, 
clientEntity.getProperty("PropertyInt16").getPrimitiveValue().toValue());
@@ -256,18 +256,18 @@ public class FilterSystemQueryITCase extends 
AbstractParamTecSvcITCase {
     // One representative of "stringFuntion" "residue class"
     ODataRetrieveResponse<ClientEntitySet> result =
         sendRequest(ES_ALL_PRIM, "endswith(PropertyString,null) eq null"); // 
null eq null => true
-    assertEquals(3, result.getBody().getEntities().size());
+    assertEquals(4, result.getBody().getEntities().size());
 
     // One representative of "stringifiedValueFunction" "residue class"
     result = sendRequest(ES_ALL_PRIM, "substring(PropertyString,null) eq 
null"); // null eq null => true
-    assertEquals(3, result.getBody().getEntities().size());
+    assertEquals(4, result.getBody().getEntities().size());
 
     // Substring
     result = sendRequest(ES_ALL_PRIM, "hour(null) eq null"); // null eq null 
=> true
-    assertEquals(3, result.getBody().getEntities().size());
+    assertEquals(4, result.getBody().getEntities().size());
 
     result = sendRequest(ES_ALL_PRIM, "substring(PropertyString,0,null) eq 
null"); // null eq null => true
-    assertEquals(3, result.getBody().getEntities().size());
+    assertEquals(4, result.getBody().getEntities().size());
   }
 
   @Test
@@ -283,7 +283,7 @@ public class FilterSystemQueryITCase extends 
AbstractParamTecSvcITCase {
 
     // -1 should be treated as 0, Same values substring(PropertyString, 0, 0) 
returns the empty String
     response = sendRequest(ES_ALL_PRIM, "substring(PropertyString,0,-1) eq 
''");
-    assertEquals(3, response.getBody().getEntities().size());
+    assertEquals(4, response.getBody().getEntities().size());
   }
 
   @Test
@@ -340,10 +340,10 @@ public class FilterSystemQueryITCase extends 
AbstractParamTecSvcITCase {
     assertEquals(3, result.getBody().getEntities().size());
 
     result = sendRequest(ES_ALL_PRIM, "PropertyDouble ge -179000");
-    assertEquals(2, result.getBody().getEntities().size());
+    assertEquals(3, result.getBody().getEntities().size());
 
     result = sendRequest(ES_ALL_PRIM, "PropertyDouble gt -179000");
-    assertEquals(1, result.getBody().getEntities().size());
+    assertEquals(2, result.getBody().getEntities().size());
 
     result = sendRequest(ES_ALL_PRIM, "PropertyDouble lt -179000");
     assertEquals(1, result.getBody().getEntities().size());
@@ -507,7 +507,7 @@ public class FilterSystemQueryITCase extends 
AbstractParamTecSvcITCase {
   @Test
   public void monthFunctionDateTimeOffset() {
     ODataRetrieveResponse<ClientEntitySet> result = sendRequest(ES_ALL_PRIM, 
"month(PropertyDateTimeOffset) eq 12");
-    assertEquals(3, result.getBody().getEntities().size());
+    assertEquals(4, result.getBody().getEntities().size());
 
     ClientEntity clientEntity = result.getBody().getEntities().get(0);
     assertShortOrInt(32767, 
clientEntity.getProperty("PropertyInt16").getPrimitiveValue().toValue());
@@ -531,7 +531,7 @@ public class FilterSystemQueryITCase extends 
AbstractParamTecSvcITCase {
   @Test
   public void dayFunctionDateTimeOffset() {
     ODataRetrieveResponse<ClientEntitySet> result = sendRequest(ES_ALL_PRIM, 
"day(PropertyDateTimeOffset) eq 3");
-    assertEquals(3, result.getBody().getEntities().size());
+    assertEquals(4, result.getBody().getEntities().size());
 
     ClientEntity clientEntity = result.getBody().getEntities().get(0);
     assertShortOrInt(32767, 
clientEntity.getProperty("PropertyInt16").getPrimitiveValue().toValue());
@@ -628,7 +628,7 @@ public class FilterSystemQueryITCase extends 
AbstractParamTecSvcITCase {
   public void fractionalsecondsDateOfTime() {
     ODataRetrieveResponse<ClientEntitySet> response =
         sendRequest(ES_ALL_PRIM, "fractionalseconds(PropertyTimeOfDay) eq 0");
-    assertEquals(3, response.getBody().getEntities().size());
+    assertEquals(4, response.getBody().getEntities().size());
   }
 
   @Test
@@ -636,22 +636,22 @@ public class FilterSystemQueryITCase extends 
AbstractParamTecSvcITCase {
     ODataRetrieveResponse<ClientEntitySet> response;
 
     response = sendRequest(ES_ALL_PRIM, "year(null) eq null");
-    assertEquals(3, response.getBody().getEntities().size());
+    assertEquals(4, response.getBody().getEntities().size());
 
     response = sendRequest(ES_ALL_PRIM, "month(null) eq null");
-    assertEquals(3, response.getBody().getEntities().size());
+    assertEquals(4, response.getBody().getEntities().size());
 
     response = sendRequest(ES_ALL_PRIM, "day(null) eq null");
-    assertEquals(3, response.getBody().getEntities().size());
+    assertEquals(4, response.getBody().getEntities().size());
 
     response = sendRequest(ES_ALL_PRIM, "hour(null) eq null");
-    assertEquals(3, response.getBody().getEntities().size());
+    assertEquals(4, response.getBody().getEntities().size());
 
     response = sendRequest(ES_ALL_PRIM, "minute(null) eq null");
-    assertEquals(3, response.getBody().getEntities().size());
+    assertEquals(4, response.getBody().getEntities().size());
 
     response = sendRequest(ES_ALL_PRIM, "second(null) eq null");
-    assertEquals(3, response.getBody().getEntities().size());
+    assertEquals(4, response.getBody().getEntities().size());
   }
 
   @Test
@@ -794,7 +794,7 @@ public class FilterSystemQueryITCase extends 
AbstractParamTecSvcITCase {
   public void numericPromotionToInt64() {
     ODataRetrieveResponse<ClientEntitySet> result =
         sendRequest(ES_ALL_PRIM, "PropertyInt64 eq 0");
-    assertEquals(1, result.getBody().getEntities().size());
+    assertEquals(2, result.getBody().getEntities().size());
 
     ClientEntity clientEntity = result.getBody().getEntities().get(0);
     assertShortOrInt(0, 
clientEntity.getProperty("PropertyInt16").getPrimitiveValue().toValue());
@@ -805,7 +805,7 @@ public class FilterSystemQueryITCase extends 
AbstractParamTecSvcITCase {
     double value = Float.MAX_VALUE + 1;
     ODataRetrieveResponse<ClientEntitySet> result =
         sendRequest(ES_ALL_PRIM, "PropertyInt64 lt " + value);
-    assertEquals(3, result.getBody().getEntities().size());
+    assertEquals(4, result.getBody().getEntities().size());
   }
 
   @Test
@@ -879,7 +879,7 @@ public class FilterSystemQueryITCase extends 
AbstractParamTecSvcITCase {
   public void dateSubDate() {
     ODataRetrieveResponse<ClientEntitySet> response =
         sendRequest(ES_ALL_PRIM, "PropertyDuration eq 2012-12-04 sub 
2012-12-04");
-    assertEquals(1, response.getBody().getEntities().size());
+    assertEquals(2, response.getBody().getEntities().size());
 
     final ClientEntity clientEntity = response.getBody().getEntities().get(0);
     assertShortOrInt(0, 
clientEntity.getProperty("PropertyInt16").getPrimitiveValue().toValue());
@@ -889,7 +889,7 @@ public class FilterSystemQueryITCase extends 
AbstractParamTecSvcITCase {
   public void dateTimeOffsetSubDateTimeOffset() {
     ODataRetrieveResponse<ClientEntitySet> response =
         sendRequest(ES_ALL_PRIM, "PropertyDuration eq 2005-12-03T00:00:00Z sub 
2005-12-03T00:00:00Z");
-    assertEquals(1, response.getBody().getEntities().size());
+    assertEquals(2, response.getBody().getEntities().size());
 
     final ClientEntity clientEntity = response.getBody().getEntities().get(0);
     assertShortOrInt(0, 
clientEntity.getProperty("PropertyInt16").getPrimitiveValue().toValue());
@@ -1008,28 +1008,28 @@ public class FilterSystemQueryITCase extends 
AbstractParamTecSvcITCase {
   public void comparisonOnStringOperands() {
     // If check if the expression is true => All entry are returned
     ODataRetrieveResponse<ClientEntitySet> result = sendRequest(ES_ALL_PRIM, 
"'Tes' lt 'Test'");
-    assertEquals(3, result.getBody().getEntities().size());
+    assertEquals(4, result.getBody().getEntities().size());
     
     result = sendRequest(ES_ALL_PRIM, "'Test' le 'Test'");
-    assertEquals(3, result.getBody().getEntities().size());
+    assertEquals(4, result.getBody().getEntities().size());
     
     result = sendRequest(ES_ALL_PRIM, "'Test1' le 'Test'");
     assertEquals(0, result.getBody().getEntities().size());
     
     result = sendRequest(ES_ALL_PRIM, "'Test1' gt 'Test'");
-    assertEquals(3, result.getBody().getEntities().size());
+    assertEquals(4, result.getBody().getEntities().size());
     
     result = sendRequest(ES_ALL_PRIM, "'Tes' gt 'Test'");
     assertEquals(0, result.getBody().getEntities().size());
     
     result = sendRequest(ES_ALL_PRIM, "'Test' ge 'Test'");
-    assertEquals(3, result.getBody().getEntities().size());
+    assertEquals(4, result.getBody().getEntities().size());
     
     result = sendRequest(ES_ALL_PRIM, "'Test' eq 'Test'");
-    assertEquals(3, result.getBody().getEntities().size());
+    assertEquals(4, result.getBody().getEntities().size());
     
     result = sendRequest(ES_ALL_PRIM, "'Test1' ne 'Test'");
-    assertEquals(3, result.getBody().getEntities().size());
+    assertEquals(4, result.getBody().getEntities().size());
   }
 
   @Test
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/OrderBySystemQueryITCase.java
 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/OrderBySystemQueryITCase.java
index 8e16a70..8252a54 100644
--- 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/OrderBySystemQueryITCase.java
+++ 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/OrderBySystemQueryITCase.java
@@ -42,22 +42,25 @@ public class OrderBySystemQueryITCase extends 
AbstractParamTecSvcITCase {
     ODataRetrieveResponse<ClientEntitySet> response = null;
 
     response = sendRequest(ES_ALL_PRIM, "PropertyDate");
-    assertEquals(3, response.getBody().getEntities().size());
+    assertEquals(4, response.getBody().getEntities().size());
 
     ClientEntity clientEntity = response.getBody().getEntities().get(0);
     assertEquals("0", ((ClientValuable) 
clientEntity.getProperty("PropertyInt16")).getValue().toString());
 
     clientEntity = response.getBody().getEntities().get(1);
+    assertEquals("10", ((ClientValuable) 
clientEntity.getProperty("PropertyInt16")).getValue().toString());
+    
+    clientEntity = response.getBody().getEntities().get(2);
     assertEquals("32767", ((ClientValuable) 
clientEntity.getProperty("PropertyInt16")).getValue().toString());
 
-    clientEntity = response.getBody().getEntities().get(2);
+    clientEntity = response.getBody().getEntities().get(3);
     assertEquals("-32768", ((ClientValuable) 
clientEntity.getProperty("PropertyInt16")).getValue().toString());
   }
 
   @Test
   public void simpleOrderByDescending() {
     ODataRetrieveResponse<ClientEntitySet> response = sendRequest(ES_ALL_PRIM, 
"PropertyDate desc");
-    assertEquals(3, response.getBody().getEntities().size());
+    assertEquals(4, response.getBody().getEntities().size());
 
     ClientEntity clientEntity = response.getBody().getEntities().get(0);
     assertEquals("-32768", ((ClientValuable) 
clientEntity.getProperty("PropertyInt16")).getValue().toString());
@@ -72,7 +75,7 @@ public class OrderBySystemQueryITCase extends 
AbstractParamTecSvcITCase {
   @Test
   public void multipleOrderBy() {
     final ODataRetrieveResponse<ClientEntitySet> response = 
sendRequest(ES_ALL_PRIM, "PropertyByte,PropertyInt16");
-    assertEquals(3, response.getBody().getEntities().size());
+    assertEquals(4, response.getBody().getEntities().size());
 
     ClientEntity clientEntity = response.getBody().getEntities().get(0);
     assertEquals("-32768", ((ClientValuable) 
clientEntity.getProperty("PropertyInt16")).getValue().toString());
@@ -81,6 +84,9 @@ public class OrderBySystemQueryITCase extends 
AbstractParamTecSvcITCase {
     assertEquals("0", ((ClientValuable) 
clientEntity.getProperty("PropertyInt16")).getValue().toString());
 
     clientEntity = response.getBody().getEntities().get(2);
+    assertEquals("10", ((ClientValuable) 
clientEntity.getProperty("PropertyInt16")).getValue().toString());
+    
+    clientEntity = response.getBody().getEntities().get(3);
     assertEquals("32767", ((ClientValuable) 
clientEntity.getProperty("PropertyInt16")).getValue().toString());
   }
 
@@ -88,15 +94,18 @@ public class OrderBySystemQueryITCase extends 
AbstractParamTecSvcITCase {
   public void multipleOrderByDescending() {
     final ODataRetrieveResponse<ClientEntitySet> response =
         sendRequest(ES_ALL_PRIM, "PropertyByte,PropertyInt16 desc");
-    assertEquals(3, response.getBody().getEntities().size());
+    assertEquals(4, response.getBody().getEntities().size());
 
     ClientEntity clientEntity = response.getBody().getEntities().get(0);
+    assertEquals("10", ((ClientValuable) 
clientEntity.getProperty("PropertyInt16")).getValue().toString());
+    
+    clientEntity = response.getBody().getEntities().get(1);
     assertEquals("0", ((ClientValuable) 
clientEntity.getProperty("PropertyInt16")).getValue().toString());
 
-    clientEntity = response.getBody().getEntities().get(1);
+    clientEntity = response.getBody().getEntities().get(2);
     assertEquals("-32768", ((ClientValuable) 
clientEntity.getProperty("PropertyInt16")).getValue().toString());
 
-    clientEntity = response.getBody().getEntities().get(2);
+    clientEntity = response.getBody().getEntities().get(3);
     assertEquals("32767", ((ClientValuable) 
clientEntity.getProperty("PropertyInt16")).getValue().toString());
   }
 
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/SystemQueryOptionITCase.java
 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/SystemQueryOptionITCase.java
index bb7fd31..c128e3b 100644
--- 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/SystemQueryOptionITCase.java
+++ 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/SystemQueryOptionITCase.java
@@ -50,8 +50,8 @@ public class SystemQueryOptionITCase extends 
AbstractParamTecSvcITCase {
     ODataRetrieveResponse<ClientEntitySet> response = request.execute();
     saveCookieHeader(response);
 
-    assertEquals(Integer.valueOf(3), response.getBody().getCount());
-    assertEquals(3, response.getBody().getEntities().size());
+    assertEquals(Integer.valueOf(4), response.getBody().getCount());
+    assertEquals(4, response.getBody().getEntities().size());
   }
 
   @Test
diff --git 
a/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/InOperatorITCase.java 
b/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/InOperatorITCase.java
new file mode 100644
index 0000000..f95b3fe
--- /dev/null
+++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/InOperatorITCase.java
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.fit.tecsvc.http;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.olingo.client.api.ODataClient;
+import org.apache.olingo.commons.api.format.ContentType;
+import org.apache.olingo.commons.api.http.HttpHeader;
+import org.apache.olingo.commons.api.http.HttpMethod;
+import org.apache.olingo.commons.api.http.HttpStatusCode;
+import org.apache.olingo.fit.AbstractBaseTestITCase;
+import org.apache.olingo.fit.tecsvc.TecSvcConst;
+import org.junit.Test;
+
+public class InOperatorITCase extends AbstractBaseTestITCase {
+
+  private static final String SERVICE_URI = TecSvcConst.BASE_URI + "/";
+  
+  @Override
+  protected ODataClient getClient() {
+    return null;
+  }
+
+  @Test
+  public void querySimple() throws Exception {
+    URL url = new URL(SERVICE_URI + "ESAllPrim?$filter=PropertyString%20in%20("
+        + "%27Second%20Resource%20-%20negative%20values%27,%27xyz%27)");
+    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+    connection.setRequestMethod(HttpMethod.GET.name());
+    connection.setRequestProperty(HttpHeader.ACCEPT, 
"application/json;odata.metadata=minimal");
+    connection.connect();
+
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
connection.getResponseCode());
+    assertEquals(ContentType.JSON, 
ContentType.create(connection.getHeaderField(HttpHeader.CONTENT_TYPE)));
+
+    final String content = IOUtils.toString(connection.getInputStream());
+    assertTrue(content.contains("\"value\":[{\"PropertyInt16\":-32768,"
+        + "\"PropertyString\":\"Second Resource - negative values\","
+        + 
"\"PropertyBoolean\":false,\"PropertyByte\":0,\"PropertySByte\":-128,"
+        + 
"\"PropertyInt32\":-2147483648,\"PropertyInt64\":-9223372036854775808,"
+        + 
"\"PropertySingle\":-1.79E8,\"PropertyDouble\":-179000.0,\"PropertyDecimal\":-34,"
+        + 
"\"PropertyBinary\":\"ASNFZ4mrze8=\",\"PropertyDate\":\"2015-11-05\","
+        + 
"\"PropertyDateTimeOffset\":\"2005-12-03T07:17:08Z\",\"PropertyDuration\":\"PT9S\","
+        + "\"PropertyGuid\":\"76543201-23ab-cdef-0123-456789dddfff\","
+        + "\"PropertyTimeOfDay\":\"23:49:14\"}]"));
+  }
+  
+  @Test
+  public void queryInOperatorWithFunction() throws Exception {
+    URL url = new URL(SERVICE_URI + 
"ESAllPrim?$filter=PropertyString%20in%20olingo.odata.test1.UFCRTCollString()");
+    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+    connection.setRequestMethod(HttpMethod.GET.name());
+    connection.setRequestProperty(HttpHeader.ACCEPT, 
"application/json;odata.metadata=minimal");
+    connection.connect();
+
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
connection.getResponseCode());
+    assertEquals(ContentType.JSON, 
ContentType.create(connection.getHeaderField(HttpHeader.CONTENT_TYPE)));
+
+    final String content = IOUtils.toString(connection.getInputStream());
+    assertTrue(content.contains("\"value\":[{\"PropertyInt16\":10,"
+        + "\"PropertyString\":\"[email protected]\","
+        + "\"PropertyBoolean\":false,\"PropertyByte\":0,\"PropertySByte\":0,"
+        + "\"PropertyInt32\":0,\"PropertyInt64\":0,\"PropertySingle\":0.0,"
+        + 
"\"PropertyDouble\":0.0,\"PropertyDecimal\":0,\"PropertyBinary\":\"\","
+        + "\"PropertyDate\":\"1970-01-01\","
+        + "\"PropertyDateTimeOffset\":\"2005-12-03T00:00:00Z\","
+        + "\"PropertyDuration\":\"PT0S\","
+        + "\"PropertyGuid\":\"76543201-23ab-cdef-0123-456789cccddd\","
+        + "\"PropertyTimeOfDay\":\"00:01:01\"}]"));
+  }
+  
+  @Test
+  public void queryInOperatorOnNavProperty() throws Exception {
+    URL url = new URL(SERVICE_URI + "ESKeyNav?$filter=PropertyCompTwoPrim/"
+        + "PropertyInt16%20in%20NavPropertyETKeyNavOne/CollPropertyInt16");
+    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+    connection.setRequestMethod(HttpMethod.GET.name());
+    connection.setRequestProperty(HttpHeader.ACCEPT, 
"application/json;odata.metadata=minimal");
+    connection.connect();
+
+    assertEquals(HttpStatusCode.OK.getStatusCode(), 
connection.getResponseCode());
+    assertEquals(ContentType.JSON, 
ContentType.create(connection.getHeaderField(HttpHeader.CONTENT_TYPE)));
+
+    final String content = IOUtils.toString(connection.getInputStream());
+    assertTrue(content.contains("\"value\":[]"));
+  }
+}
diff --git 
a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmProviderImpl.java
 
b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmProviderImpl.java
index c8b1c71..34870d6 100644
--- 
a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmProviderImpl.java
+++ 
b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/EdmProviderImpl.java
@@ -293,7 +293,8 @@ public class EdmProviderImpl extends AbstractEdm {
     try {
       if (null != provider.getAliasInfos()) {
         for (CsdlAliasInfo aliasInfo : provider.getAliasInfos()) {
-          if (aliasInfo.getNamespace().equalsIgnoreCase(namespace)) {
+          if (null != aliasInfo.getNamespace() && 
+              aliasInfo.getNamespace().equalsIgnoreCase(namespace)) {
             return aliasInfo.getAlias();
           }
         }
diff --git 
a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/expression/Binary.java
 
b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/expression/Binary.java
index c13d15f..aa6fd87 100644
--- 
a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/expression/Binary.java
+++ 
b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/expression/Binary.java
@@ -18,6 +18,8 @@
  */
 package org.apache.olingo.server.api.uri.queryoption.expression;
 
+import java.util.List;
+
 /**
  * Represents a binary expression node in the expression tree
  * <br>
@@ -41,5 +43,11 @@ public interface Binary extends Expression {
    * @return Expression sub tree of the right operand
    */
   public Expression getRightOperand();
+  
+  /**
+   * 
+   * @return list of expressions of the right operand
+   */
+  public List<Expression> getExpressions();
 
 }
diff --git 
a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/expression/BinaryOperatorKind.java
 
b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/expression/BinaryOperatorKind.java
index 2ce4eee..157c4ef 100644
--- 
a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/expression/BinaryOperatorKind.java
+++ 
b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/expression/BinaryOperatorKind.java
@@ -28,6 +28,11 @@ public enum BinaryOperatorKind {
    * OData has operator used for OData enumerations
    */
   HAS("has"),
+  
+  /**
+   * In operator
+   */
+  IN("in"),
 
   /**
    * Multiplication operator
diff --git 
a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/expression/ExpressionVisitor.java
 
b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/expression/ExpressionVisitor.java
index 402db3a..f67a495 100644
--- 
a/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/expression/ExpressionVisitor.java
+++ 
b/lib/server-api/src/main/java/org/apache/olingo/server/api/uri/queryoption/expression/ExpressionVisitor.java
@@ -132,5 +132,17 @@ public interface ExpressionVisitor<T> {
    * @throws ODataApplicationException Thrown by the application
    */
   T visitEnum(EdmEnumType type, List<String> enumValues) throws 
ExpressionVisitException, ODataApplicationException;
+  
+  /**
+   * Called for each traversed {@link Binary} expression
+   * @param operator Operator kind
+   * @param left Application return value of left sub tree
+   * @param right Application return value of right sub tree
+   * @return Application return value of type T
+   * @throws ExpressionVisitException Thrown if an exception while traversing 
occured
+   * @throws ODataApplicationException Thrown by the application
+   */
+  T visitBinaryOperator(BinaryOperatorKind operator, T left, List<T> right)
+      throws ExpressionVisitException, ODataApplicationException;
 
 }
diff --git 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/ExpressionJsonVisitor.java
 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/ExpressionJsonVisitor.java
index 4f12882..e1936c1 100644
--- 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/ExpressionJsonVisitor.java
+++ 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/debug/ExpressionJsonVisitor.java
@@ -330,6 +330,7 @@ public class ExpressionJsonVisitor implements 
ExpressionVisitor<JsonNode> {
     case NE:
     case AND:
     case OR:
+    case IN:
       return BOOLEAN_NAME;
     }
     return UNKNOWN_NAME;
@@ -343,4 +344,19 @@ public class ExpressionJsonVisitor implements 
ExpressionVisitor<JsonNode> {
     final EdmType type = segment instanceof UriResourcePartTyped ? 
((UriResourcePartTyped) segment).getType() : null;
     return type == null ? UNKNOWN_NAME : 
type.getFullQualifiedName().getFullQualifiedNameAsString();
   }
+
+  @Override
+  public JsonNode visitBinaryOperator(BinaryOperatorKind operator, JsonNode 
left, List<JsonNode> right)
+      throws ExpressionVisitException, ODataApplicationException {
+    ObjectNode result = nodeFactory.objectNode()
+        .put(NODE_TYPE_NAME, BINARY_NAME)
+        .put(OPERATOR_NAME, operator.toString())
+        .put(TYPE_NAME, getType(operator));
+    result.set(LEFT_NODE_NAME, left);
+    ArrayNode jsonExprs = result.putArray(RIGHT_NODE_NAME);
+    for (final JsonNode exp : right) {
+      jsonExprs.add(exp);
+    }
+    return result;
+  }
 }
diff --git 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpressionParser.java
 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpressionParser.java
index 6be186d..935c9ed 100644
--- 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpressionParser.java
+++ 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpressionParser.java
@@ -332,9 +332,64 @@ public class ExpressionParser {
       final Expression right = createEnumExpression(tokenizer.getText());
       return new BinaryImpl(left, BinaryOperatorKind.HAS, right,
           odata.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Boolean));
-    } else {
-      return left;
+    } else if (tokenizer.next(TokenKind.InOperator)) {
+      EdmType leftExprType = getType(left);
+      EdmPrimitiveTypeKind kinds = 
EdmPrimitiveTypeKind.valueOfFQN(leftExprType.getFullQualifiedName());
+      if (tokenizer.next(TokenKind.OPEN)) {
+        ParserHelper.bws(tokenizer);
+        List<Expression> expressionList = parseInExpr();
+        checkInExpressionTypes(expressionList, kinds);
+        return new BinaryImpl(left, BinaryOperatorKind.IN, expressionList,
+            odata.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Boolean));
+      } else {
+        ParserHelper.bws(tokenizer);
+        final Expression right = parseExpression();
+        checkType(right, kinds);
+        return new BinaryImpl(left, BinaryOperatorKind.IN, right,
+            odata.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Boolean));
+      }
+    }
+    return left;
+  }
+
+  /**
+   * @param expressionList
+   * @param kinds
+   * @throws UriParserException
+   * @throws UriParserSemanticException
+   */
+  private void checkInExpressionTypes(List<Expression> expressionList, 
EdmPrimitiveTypeKind kinds)
+      throws UriParserException, UriParserSemanticException {
+    for (Expression expr : expressionList) {
+      EdmType inExprType = getType(expr);
+      if (!isType(inExprType, kinds)) {
+        throw new UriParserSemanticException("Incompatible types.",
+            UriParserSemanticException.MessageKeys.TYPES_NOT_COMPATIBLE,
+            inExprType == null ? "" : 
inExprType.getFullQualifiedName().getFullQualifiedNameAsString(),
+            kinds.getFullQualifiedName().getFullQualifiedNameAsString());
+      }
+    }
+  }
+
+  /**
+   * @param expressionList
+   * @throws UriParserException
+   * @throws UriValidationException
+   */
+  private List<Expression> parseInExpr() throws UriParserException, 
UriValidationException {
+    List<Expression> expressionList = new ArrayList<Expression>();
+    while(!tokenizer.next(TokenKind.CLOSE)) {
+      Expression expression = parseExpression();
+      expressionList.add(expression);
+      ParserHelper.bws(tokenizer);
+      if (tokenizer.next(TokenKind.COMMA)) {
+        ParserHelper.bws(tokenizer);
+        expression = parseExpression();
+        expressionList.add(expression);
+        ParserHelper.bws(tokenizer);
+      }
     }
+    return expressionList;
   }
 
   private Expression parseExprValue() throws UriParserException, 
UriValidationException {
diff --git 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriTokenizer.java
 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriTokenizer.java
index 50c9060..5b05111 100644
--- 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriTokenizer.java
+++ 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriTokenizer.java
@@ -126,6 +126,7 @@ public class UriTokenizer {
     LessThanOperator,
     LessThanOrEqualsOperator,
     HasOperator,
+    InOperator,
     AddOperator,
     SubOperator,
     MulOperator,
@@ -508,6 +509,9 @@ public class UriTokenizer {
     case HasOperator:
       found = nextBinaryOperator("has");
       break;
+    case InOperator:
+      found = nextBinaryOperator("in");
+      break;
     case AddOperator:
       found = nextBinaryOperator("add");
       break;
diff --git 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/expression/BinaryImpl.java
 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/expression/BinaryImpl.java
index 7c3f65d..ea84f6b 100644
--- 
a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/expression/BinaryImpl.java
+++ 
b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/expression/BinaryImpl.java
@@ -18,6 +18,9 @@
  */
 package org.apache.olingo.server.core.uri.queryoption.expression;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.olingo.commons.api.edm.EdmType;
 import org.apache.olingo.server.api.ODataApplicationException;
 import org.apache.olingo.server.api.uri.queryoption.expression.Binary;
@@ -32,6 +35,7 @@ public class BinaryImpl implements Binary {
   private final BinaryOperatorKind operator;
   private final Expression right;
   private final EdmType type;
+  private final List<Expression> expressions;
 
   public BinaryImpl(final Expression left, final BinaryOperatorKind operator, 
final Expression right,
       final EdmType type) {
@@ -39,6 +43,16 @@ public class BinaryImpl implements Binary {
     this.operator = operator;
     this.right = right;
     this.type = type;
+    this.expressions = null;
+  }
+  
+  public BinaryImpl(final Expression left, final BinaryOperatorKind operator, 
final List<Expression> right,
+      final EdmType type) {
+    this.left = left;
+    this.operator = operator;
+    this.right = null;
+    this.type = type;
+    this.expressions = right;
   }
 
   @Override
@@ -63,12 +77,26 @@ public class BinaryImpl implements Binary {
   @Override
   public <T> T accept(final ExpressionVisitor<T> visitor) throws 
ExpressionVisitException, ODataApplicationException {
     T localLeft = this.left.accept(visitor);
-    T localRight = this.right.accept(visitor);
-    return visitor.visitBinaryOperator(operator, localLeft, localRight);
+    if (this.right != null) {
+      T localRight = this.right.accept(visitor);
+      return visitor.visitBinaryOperator(operator, localLeft, localRight);
+    } else if (this.expressions != null) {
+      List<T> expressions = new ArrayList<T>();
+      for (final Expression expression : this.expressions) {
+        expressions.add(expression.accept(visitor));
+      }
+      return visitor.visitBinaryOperator(operator, localLeft, expressions);
+    }
+    return null;
   }
 
   @Override
   public String toString() {
-    return "{" + left + " " + operator.name() + " " + right + '}';
+    return "{" + left + " " + operator.name() + " " + (null != right ? right : 
expressions) + '}';
+  }
+
+  @Override
+  public List<Expression> getExpressions() {
+    return expressions;
   }
 }
diff --git 
a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/ExpressionParserTest.java
 
b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/ExpressionParserTest.java
index 92c09da..5671688 100644
--- 
a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/ExpressionParserTest.java
+++ 
b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/ExpressionParserTest.java
@@ -392,10 +392,23 @@ public class ExpressionParserTest {
     Mockito.when(mockedEdm.getEntityContainer()).thenReturn(container);
     
     UriTokenizer tokenizer = new UriTokenizer("a eq \'abc\'");
-    final Expression expression = new ExpressionParser(mockedEdm, 
odata).parse(tokenizer, 
+    Expression expression = new ExpressionParser(mockedEdm, 
odata).parse(tokenizer, 
         entityType, null, null);
     assertNotNull(expression);
     assertEquals("{[a] EQ \'abc\'}", expression.toString());
+    
+    tokenizer = new UriTokenizer("a in (\'abc\', \'xyz\')");
+    expression = new ExpressionParser(mockedEdm, odata).parse(tokenizer, 
+        entityType, null, null);
+    assertNotNull(expression);
+    assertEquals("{[a] IN [\'abc\', \'xyz\']}", expression.toString());
+    try {
+      tokenizer = new UriTokenizer("a in (\'abc\', 10)");
+      expression = new ExpressionParser(mockedEdm, odata).parse(tokenizer, 
+          entityType, null, null);
+    } catch (UriParserSemanticException e) {
+      assertEquals("Incompatible types.", e.getMessage());
+    }
   }
 
   /**
@@ -519,10 +532,16 @@ public class ExpressionParserTest {
     Mockito.when(mockedEdm.getEntityContainer()).thenReturn(container);
     
     UriTokenizer tokenizer = new UriTokenizer("comp/prop eq \'abc\'");
-    final Expression expression = new ExpressionParser(mockedEdm, 
odata).parse(tokenizer, 
+    Expression expression = new ExpressionParser(mockedEdm, 
odata).parse(tokenizer, 
         entityType, null, null);
     assertNotNull(expression);
     assertEquals("{[comp, prop] EQ \'abc\'}", expression.toString());
+    
+    tokenizer = new UriTokenizer("comp/prop in (\'abc\','xyz')");
+    expression = new ExpressionParser(mockedEdm, odata).parse(tokenizer, 
+        entityType, null, null);
+    assertNotNull(expression);
+    assertEquals("{[comp, prop] IN [\'abc\', \'xyz\']}", 
expression.toString());
   }
 
   /**
diff --git 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java
 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java
index 898fc39..c5b62dc 100644
--- 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java
+++ 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java
@@ -1149,6 +1149,25 @@ public class DataCreator {
         .addProperty(createPrimitive("PropertyDuration", 
BigDecimal.valueOf(0)))
         .addProperty(createPrimitive("PropertyGuid", 
UUID.fromString("76543201-23ab-cdef-0123-456789cccddd")))
         .addProperty(createPrimitive("PropertyTimeOfDay", getTime(0, 1, 1))));
+    
+    entityCollection.getEntities().add(new Entity()
+        .addProperty(createPrimitive("PropertyInt16", (short) 10))
+        .addProperty(createPrimitive("PropertyString", 
"[email protected]"))
+        .addProperty(createPrimitive("PropertyBoolean", false))
+        .addProperty(createPrimitive("PropertyByte", (short) 0))
+        .addProperty(createPrimitive("PropertySByte", 0))
+        .addProperty(createPrimitive("PropertyInt32", 0))
+        .addProperty(createPrimitive("PropertyInt64", 0L))
+        .addProperty(createPrimitive("PropertySingle", (float) 0))
+        .addProperty(createPrimitive("PropertyDouble", 0D))
+        .addProperty(createPrimitive("PropertyDecimal", BigDecimal.valueOf(0)))
+        .addProperty(createPrimitive("PropertyBinary", new byte[] {}))
+        .addProperty(createPrimitive("PropertyDate", getDate(1970, 1, 1)))
+        .addProperty(createPrimitive("PropertyDateTimeOffset", 
getDateTime(2005, 12, 3, 0, 0, 0)))
+        .addProperty(createPrimitive("PropertyDuration", 
BigDecimal.valueOf(0)))
+        .addProperty(createPrimitive("PropertyGuid", 
UUID.fromString("76543201-23ab-cdef-0123-456789cccddd")))
+        .addProperty(createPrimitive("PropertyTimeOfDay", getTime(0, 1, 1))));
+    
 
     setEntityType(entityCollection, 
edm.getEntityType(EntityTypeProvider.nameETAllPrim));
     createEntityId(edm, odata, "ESAllPrim", entityCollection);
diff --git 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/ExpressionVisitorImpl.java
 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/ExpressionVisitorImpl.java
index 98b3f7f..c3d01e9 100644
--- 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/ExpressionVisitorImpl.java
+++ 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/ExpressionVisitorImpl.java
@@ -24,11 +24,13 @@ import java.util.Locale;
 
 import org.apache.olingo.commons.api.data.ComplexValue;
 import org.apache.olingo.commons.api.data.Entity;
+import org.apache.olingo.commons.api.data.Link;
 import org.apache.olingo.commons.api.data.Property;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.apache.olingo.commons.api.edm.EdmComplexType;
 import org.apache.olingo.commons.api.edm.EdmEnumType;
 import org.apache.olingo.commons.api.edm.EdmFunction;
+import org.apache.olingo.commons.api.edm.EdmNavigationProperty;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
 import org.apache.olingo.commons.api.edm.EdmProperty;
@@ -43,6 +45,7 @@ import org.apache.olingo.server.api.uri.UriResource;
 import org.apache.olingo.server.api.uri.UriResourceFunction;
 import org.apache.olingo.server.api.uri.UriResourceLambdaAny;
 import org.apache.olingo.server.api.uri.UriResourceLambdaVariable;
+import org.apache.olingo.server.api.uri.UriResourceNavigation;
 import org.apache.olingo.server.api.uri.UriResourceProperty;
 import org.apache.olingo.server.api.uri.queryoption.expression.Binary;
 import 
org.apache.olingo.server.api.uri.queryoption.expression.BinaryOperatorKind;
@@ -112,6 +115,8 @@ public class ExpressionVisitorImpl implements 
ExpressionVisitor<VisitorOperand>
       return binaryOperator.arithmeticOperator(operator);
     case HAS:
       return binaryOperator.hasOperator();
+    case IN:
+      return binaryOperator.inOperator();
 
     default:
       return throwNotImplemented();
@@ -278,6 +283,25 @@ public class ExpressionVisitorImpl implements 
ExpressionVisitor<VisitorOperand>
       }
       return new TypedOperand(currentProperty == null ? null : 
currentProperty.getValue(), 
           currentEdmProperty.getType(), currentEdmProperty);
+    } else if (initialPart instanceof UriResourceNavigation) {
+      EdmNavigationProperty currentEdmNavProperty = ((UriResourceNavigation) 
initialPart).getProperty();
+      EdmProperty currentEdmProperty = null;
+      Link link = entity.getNavigationLink(currentEdmNavProperty.getName());
+      Entity inlineEntity = link != null ? link.getInlineEntity() : null;
+      Property currentProperty = null;
+      for (int i = 1; i < uriResourceParts.size(); i++) {
+        currentEdmProperty = ((UriResourceProperty) 
uriResourceParts.get(i)).getProperty();
+        if (null != inlineEntity) {
+          for (Property property : inlineEntity.getProperties()) {
+            if 
(property.getName().equalsIgnoreCase(currentEdmProperty.getName())) {
+              currentProperty = property;
+              break;
+            } 
+          }
+        }
+      }
+      return new TypedOperand(currentProperty != null ? 
currentProperty.getValue() : null, 
+          currentEdmProperty.getType(), currentEdmProperty);
     } else {
       return throwNotImplemented();
     }
@@ -324,4 +348,15 @@ public class ExpressionVisitorImpl implements 
ExpressionVisitor<VisitorOperand>
     throw new ODataApplicationException("Not implemented", 
HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(),
         Locale.ROOT);
   }
+
+  @Override
+  public VisitorOperand visitBinaryOperator(BinaryOperatorKind operator, 
VisitorOperand left,
+      List<VisitorOperand> right) throws ExpressionVisitException, 
ODataApplicationException {
+    BinaryOperator binaryOperator = new BinaryOperator(left, right);
+    switch (operator) {
+    case IN : return binaryOperator.inOperator();
+    default:
+      return throwNotImplemented();
+    }
+  }
 }
diff --git 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/TypedOperand.java
 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/TypedOperand.java
index c9370b5..c564950 100644
--- 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/TypedOperand.java
+++ 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/TypedOperand.java
@@ -20,7 +20,9 @@ package 
org.apache.olingo.server.tecsvc.processor.queryoptions.expression.operan
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 import java.util.Locale;
 
 import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
@@ -55,11 +57,62 @@ public class TypedOperand extends VisitorOperand {
       return value.getClass() == getDefaultType((EdmPrimitiveType) type) ?
           this :
           asTypedOperand((EdmPrimitiveType) type);
+    } else if (type instanceof EdmPrimitiveType && value instanceof 
Collection) {
+      return value.getClass() == getDefaultType((EdmPrimitiveType) type) ?
+          this :
+          asTypedOperandForCollection((EdmPrimitiveType) type);
     } else {
       throw new ODataApplicationException("A single primitive-type instance is 
expected.",
           HttpStatusCode.BAD_REQUEST.getStatusCode(), Locale.ROOT);
     }
   }
+  
+  @SuppressWarnings("unchecked")
+  @Override
+  public TypedOperand asTypedOperandForCollection(final EdmPrimitiveType 
asType) throws ODataApplicationException {
+    if (is(primNull)) {
+      return this;
+    } else if (isNull()) {
+      return new TypedOperand(null, asType);
+    } 
+    List<Object> newValue = new ArrayList<Object>();
+    List<Object> list = (List<Object>) value;
+    for (Object val : list) {
+   // Use BigInteger for arbitrarily large whole numbers.
+      if (asType.equals(primSByte) || asType.equals(primByte)
+          || asType.equals(primInt16) || asType.equals(primInt32) || 
asType.equals(primInt64)) {
+        if (val instanceof BigInteger) {
+          newValue.add(val);
+        } else if (val instanceof Byte || val instanceof Short
+            || val instanceof Integer || val instanceof Long) {
+          newValue.add(BigInteger.valueOf(((Number) val).longValue()));
+        }
+      // Use BigDecimal for unlimited precision.
+      } else if (asType.equals(primDouble) || asType.equals(primSingle) || 
asType.equals(primDecimal)) {
+        try {
+          newValue.add(new BigDecimal(val.toString()));
+        } catch (NumberFormatException e) {
+          throw new ODataApplicationException("Format exception", 
+              HttpStatusCode.BAD_REQUEST.getStatusCode(), Locale.ROOT, 
e.getCause());
+        }
+      } else {
+        // Use type conversion of EdmPrimitive types
+        try {
+          final String literal = getLiteral(val);
+          newValue.add(tryCast(literal, asType));
+        } catch (EdmPrimitiveTypeException e) {
+          throw new ODataApplicationException("Cast Failed", 
+              HttpStatusCode.BAD_REQUEST.getStatusCode(), Locale.ROOT, 
e.getCause());
+        }
+      }
+    }
+    if (!newValue.isEmpty()) {
+      return new TypedOperand(newValue, asType);
+    }
+
+    throw new ODataApplicationException("Cast failed", 
HttpStatusCode.BAD_REQUEST.getStatusCode(), Locale.ROOT);
+    
+  }
 
   @Override
   public TypedOperand asTypedOperand(final EdmPrimitiveType asType) throws 
ODataApplicationException {
@@ -67,7 +120,7 @@ public class TypedOperand extends VisitorOperand {
       return this;
     } else if (isNull()) {
       return new TypedOperand(null, asType);
-    }
+    } 
 
     Object newValue = null;
     // Use BigInteger for arbitrarily large whole numbers.
@@ -119,19 +172,20 @@ public class TypedOperand extends VisitorOperand {
     }
 
     if (type.equals(primDouble) || oType.equals(primDouble)) {
-      return asTypedOperand(primDouble);
+      return (value instanceof ArrayList) ? 
asTypedOperandForCollection(primDouble) : asTypedOperand(primDouble);
     } else if (type.equals(primSingle) || oType.equals(primSingle)) {
-      return asTypedOperand(primSingle);
+      return (value instanceof ArrayList) ? 
asTypedOperandForCollection(primSingle) : asTypedOperand(primSingle);
     } else if (type.equals(primDecimal) || oType.equals(primDecimal)) {
-      return asTypedOperand(primDecimal);
+      return (value instanceof ArrayList) ? 
asTypedOperandForCollection(primDecimal) : asTypedOperand(primDecimal);
     } else if (type.equals(primInt64) || oType.equals(primInt64)) {
-      return asTypedOperand(primInt64);
+      return (value instanceof ArrayList) ? 
asTypedOperandForCollection(primInt64) : asTypedOperand(primInt64);
     } else if (type.equals(primInt32) || oType.equals(primInt32)) {
-      return asTypedOperand(primInt32);
+      return (value instanceof ArrayList) ? 
asTypedOperandForCollection(primInt32) : asTypedOperand(primInt32);
     } else if (type.equals(primInt16) || oType.equals(primInt16)) {
-      return asTypedOperand(primInt16);
+      return (value instanceof ArrayList) ? 
asTypedOperandForCollection(primInt16) : asTypedOperand(primInt16);
     } else {
-      return asTypedOperand((EdmPrimitiveType) type);
+      return (value instanceof ArrayList) ? 
asTypedOperandForCollection((EdmPrimitiveType) type) : 
+        asTypedOperand((EdmPrimitiveType) type);
     }
   }
 
@@ -142,6 +196,16 @@ public class TypedOperand extends VisitorOperand {
   public <T> T getTypedValue(final Class<T> clazz) {
     return clazz.cast(value);
   }
+  
+  public <T> List<T> getTypedValueList(final Class<T> clazz) {
+    List<Object> list = (List<Object>) value;
+    List<Object> newList = new ArrayList<Object>();
+    for (Object obj : list) {
+      newList.add(clazz.cast(obj));
+    }
+    return (List<T>) newList;
+  }
+  
 
   public boolean isNull() {
     return is(primNull) || value == null;
diff --git 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/UntypedOperand.java
 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/UntypedOperand.java
index dba114b..101aa0c 100644
--- 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/UntypedOperand.java
+++ 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/UntypedOperand.java
@@ -18,6 +18,8 @@
  */
 package 
org.apache.olingo.server.tecsvc.processor.queryoptions.expression.operand;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Locale;
 
 import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
@@ -54,6 +56,31 @@ public class UntypedOperand extends VisitorOperand {
     throw new ODataApplicationException("Cast failed", 
HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode(),
         Locale.ROOT);
   }
+  
+  @SuppressWarnings( "unchecked")
+  @Override
+  public TypedOperand asTypedOperandForCollection(EdmPrimitiveType type) 
throws ODataApplicationException {
+    List<Object> newValue = new ArrayList<Object>();
+    List<Object> list = (List<Object>) value;
+    for (Object val : list) {
+      final String literal = (String) val;
+      
+      // First try the null literal.
+      if (null != tryCast(literal, primNull)) {
+        newValue.add(tryCast(literal, primNull));
+        type = primNull;
+      }
+      // Then try the given type.
+      if (null != tryCast(literal, type)) {
+        newValue.add(tryCast(literal, type));
+      }
+    }
+    if (!newValue.isEmpty()) {
+      return new TypedOperand(newValue, type);
+    } 
+    throw new ODataApplicationException("Cast failed", 
HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode(),
+        Locale.ROOT);
+  }
 
   public TypedOperand determineType() throws ODataApplicationException {
     final String literal = (String) value;
diff --git 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/VisitorOperand.java
 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/VisitorOperand.java
index c06b6bb..7e949d0 100644
--- 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/VisitorOperand.java
+++ 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operand/VisitorOperand.java
@@ -86,6 +86,8 @@ public abstract class VisitorOperand {
   public abstract TypedOperand asTypedOperand() throws 
ODataApplicationException;
 
   public abstract TypedOperand asTypedOperand(EdmPrimitiveType type) throws 
ODataApplicationException;
+  
+  public abstract TypedOperand asTypedOperandForCollection(EdmPrimitiveType 
type) throws ODataApplicationException;
 
   public abstract EdmProperty getEdmProperty();
 
diff --git 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operation/BinaryOperator.java
 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operation/BinaryOperator.java
index 57f2196..0395ce1 100644
--- 
a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operation/BinaryOperator.java
+++ 
b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/queryoptions/expression/operation/BinaryOperator.java
@@ -21,9 +21,12 @@ package 
org.apache.olingo.server.tecsvc.processor.queryoptions.expression.operat
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.sql.Timestamp;
+import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.List;
 import java.util.Locale;
 
+import org.apache.olingo.commons.api.data.Property;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
 import org.apache.olingo.commons.api.edm.EdmType;
@@ -84,8 +87,9 @@ public class BinaryOperator {
     primDouble = 
oData.createPrimitiveTypeInstance(EdmPrimitiveTypeKind.Double);
   }
 
-  private TypedOperand right;
+  private TypedOperand right = null;
   private TypedOperand left;
+  private List<TypedOperand> rightValues = null;
 
   public BinaryOperator(final VisitorOperand leftOperand, final VisitorOperand 
rightOperand)
       throws ODataApplicationException {
@@ -96,6 +100,15 @@ public class BinaryOperator {
     right = right.castToCommonType(left);
   }
 
+  public BinaryOperator(final VisitorOperand leftOperand, final 
List<VisitorOperand> rightOperand)
+      throws ODataApplicationException {
+    rightValues = new ArrayList<TypedOperand>();
+    left = leftOperand.asTypedOperand();
+    for (VisitorOperand right : rightOperand) {
+      rightValues.add(right.asTypedOperand());
+    }
+  }
+  
   public VisitorOperand andOperator() throws ODataApplicationException {
     Boolean result = null;
     if (left.is(primBoolean) && right.is(primBoolean)) {
@@ -353,4 +366,36 @@ public class BinaryOperator {
           Locale.ROOT);
     }
   }
+
+  @SuppressWarnings("unchecked")
+  public VisitorOperand inOperator() throws ODataApplicationException {
+    if (null != rightValues) {
+      for (TypedOperand rightOperand : rightValues) {
+        if 
(rightOperand.getTypedValue(String.class).equals(left.getTypedValue(String.class)))
 {
+          return new TypedOperand(true, primBoolean);
+        }
+      } 
+    } else {
+      if (right.getValue() instanceof String) {
+        String value = (String) right.getValue();
+        value = value.substring(value.indexOf("[") + 1, value.indexOf("]"));
+        String values[] = value.split(",");
+        for (String val : values) {
+          if (val.equals(left.getValue())) {
+            return new TypedOperand(true, primBoolean);
+          }
+        }
+      } else if (right.getValue() instanceof ArrayList && 
left.isIntegerType()) {
+        List<BigInteger> list = (List<BigInteger>) 
right.getTypedValue(ArrayList.class);
+        for (BigInteger val : list) {
+          if (val == left.getTypedValue(BigInteger.class)) {
+            return new TypedOperand(true, primBoolean);
+          }
+        }
+      } else if (right.getValue() == null && left.isNull()) {
+        return new TypedOperand(true, primBoolean);
+      }
+    }
+    return new TypedOperand(false, primBoolean);
+  }
 }
diff --git 
a/lib/server-tecsvc/src/test/java/org/apache/olingo/server/tecsvc/data/DataProviderTest.java
 
b/lib/server-tecsvc/src/test/java/org/apache/olingo/server/tecsvc/data/DataProviderTest.java
index 4686cba..a53d66d 100644
--- 
a/lib/server-tecsvc/src/test/java/org/apache/olingo/server/tecsvc/data/DataProviderTest.java
+++ 
b/lib/server-tecsvc/src/test/java/org/apache/olingo/server/tecsvc/data/DataProviderTest.java
@@ -90,7 +90,7 @@ public class DataProviderTest {
     final DataProvider data = new DataProvider(oData, edm);
     EntityCollection outSet = data.readAll(esAllPrim);
 
-    Assert.assertEquals(3, outSet.getEntities().size());
+    Assert.assertEquals(4, outSet.getEntities().size());
 
     Entity first = outSet.getEntities().get(0);
     Assert.assertEquals(16, first.getProperties().size());
diff --git 
a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java
 
b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java
index 786403e..52849b2 100644
--- 
a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java
+++ 
b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java
@@ -486,7 +486,7 @@ public class ODataJsonSerializerTest {
     while ((index = resultString.indexOf("PropertyInt16\":", ++index)) > 0) {
       count++;
     }
-    Assert.assertEquals(3, count);
+    Assert.assertEquals(4, count);
   }
 
   @Test
@@ -1938,7 +1938,7 @@ public class ODataJsonSerializerTest {
     
Assert.assertEquals("{\"@odata.context\":\"../$metadata#Collection($ref)\","
         + "\"value\":[{\"@odata.id\":\"ESAllPrim(32767)\"},"
         + "{\"@odata.id\":\"ESAllPrim(-32768)\"},"
-        + "{\"@odata.id\":\"ESAllPrim(0)\"}]}",
+        + 
"{\"@odata.id\":\"ESAllPrim(0)\"},{\"@odata.id\":\"ESAllPrim(10)\"}]}",
         resultString);
   }
 
@@ -2129,7 +2129,7 @@ public class ODataJsonSerializerTest {
     Assert.assertThat(resultString, CoreMatchers.startsWith("{"
         + "\"@odata.context\":\"$metadata#ESAllPrim\","
         + "\"@odata.metadataEtag\":\"W/\\\"metadataETag\\\"\","
-        + "\"@odata.count\":\"3\",\"value\":["));
+        + "\"@odata.count\":\"4\",\"value\":["));
     Assert.assertThat(resultString, CoreMatchers.endsWith("],"
         + "\"@odata.nextLink\":\"/next\"}"));
 
@@ -2138,7 +2138,7 @@ public class ODataJsonSerializerTest {
     while ((index = resultString.indexOf("PropertyInt16\":", ++index)) > 0) {
       count++;
     }
-    Assert.assertEquals(3, count);
+    Assert.assertEquals(4, count);
   }
 
   @Test
@@ -2158,7 +2158,7 @@ public class ODataJsonSerializerTest {
 
     Assert.assertThat(resultString, CoreMatchers.startsWith("{"
         + "\"@odata.context\":\"../$metadata#Collection($ref)\","
-        + "\"@odata.count\":\"3\",\"value\":["));
+        + "\"@odata.count\":\"4\",\"value\":["));
     Assert.assertThat(resultString, CoreMatchers.endsWith("],"
         + "\"@odata.nextLink\":\"/next\"}"));
 
@@ -2167,7 +2167,7 @@ public class ODataJsonSerializerTest {
     while ((index = resultString.indexOf("ESAllPrim(", ++index)) > 0) {
       count++;
     }
-    Assert.assertEquals(3, count);
+    Assert.assertEquals(4, count);
   }
 
   @Test
diff --git 
a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerv01Test.java
 
b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerv01Test.java
index 37afbe5..f5ffa71 100644
--- 
a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerv01Test.java
+++ 
b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerv01Test.java
@@ -482,7 +482,7 @@ public class ODataJsonSerializerv01Test {
     while ((index = resultString.indexOf("PropertyInt16\":", ++index)) > 0) {
       count++;
     }
-    Assert.assertEquals(3, count);
+    Assert.assertEquals(4, count);
   }
 
   @Test
@@ -1943,7 +1943,7 @@ public class ODataJsonSerializerv01Test {
     Assert.assertEquals("{\"@context\":\"../$metadata#Collection($ref)\","
         + "\"value\":[{\"@id\":\"ESAllPrim(32767)\"},"
         + "{\"@id\":\"ESAllPrim(-32768)\"},"
-        + "{\"@id\":\"ESAllPrim(0)\"}]}",
+        + "{\"@id\":\"ESAllPrim(0)\"},{\"@id\":\"ESAllPrim(10)\"}]}",
         resultString);
   }
 
@@ -2134,7 +2134,7 @@ public class ODataJsonSerializerv01Test {
     Assert.assertThat(resultString, CoreMatchers.startsWith("{"
         + "\"@context\":\"$metadata#ESAllPrim\","
         + "\"@metadataEtag\":\"W/\\\"metadataETag\\\"\","
-        + "\"@count\":\"3\",\"value\":["));
+        + "\"@count\":\"4\",\"value\":["));
     Assert.assertThat(resultString, CoreMatchers.endsWith("],"
         + "\"@nextLink\":\"/next\"}"));
 
@@ -2143,7 +2143,7 @@ public class ODataJsonSerializerv01Test {
     while ((index = resultString.indexOf("PropertyInt16\":", ++index)) > 0) {
       count++;
     }
-    Assert.assertEquals(3, count);
+    Assert.assertEquals(4, count);
   }
 
   @Test
@@ -2163,7 +2163,7 @@ public class ODataJsonSerializerv01Test {
 
     Assert.assertThat(resultString, CoreMatchers.startsWith("{"
         + "\"@context\":\"../$metadata#Collection($ref)\","
-        + "\"@count\":\"3\",\"value\":["));
+        + "\"@count\":\"4\",\"value\":["));
     Assert.assertThat(resultString, CoreMatchers.endsWith("],"
         + "\"@nextLink\":\"/next\"}"));
 
@@ -2172,7 +2172,7 @@ public class ODataJsonSerializerv01Test {
     while ((index = resultString.indexOf("ESAllPrim(", ++index)) > 0) {
       count++;
     }
-    Assert.assertEquals(3, count);
+    Assert.assertEquals(4, count);
   }
 
   @Test
diff --git 
a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/ODataXmlSerializerTest.java
 
b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/ODataXmlSerializerTest.java
index 2f977d1..56ddf19 100644
--- 
a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/ODataXmlSerializerTest.java
+++ 
b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/xml/ODataXmlSerializerTest.java
@@ -322,6 +322,49 @@ public class ODataXmlSerializerTest {
         + "title=\"olingo.odata.test1.BAETAllPrimRT\" "
         + "target=\"ESAllPrim(0)/olingo.odata.test1.BAETAllPrimRT\" />\n" + 
         "   </a:entry>\n" + 
+        "<a:entry>\n" +
+        "<a:id>ESAllPrim(10)</a:id>\n" +
+        "<a:title/>\n" +
+        "<a:summary/>\n" +
+        "<a:updated>"+ UPDATED_FORMAT.format(new Date(currentTimeMillis)) 
+"</a:updated>\n" +
+        "<a:author>\n" +
+        "<a:name/>\n" +
+      "</a:author>\n" +
+      "<a:link rel=\"edit\" href=\"ESAllPrim(10)\"/>\n" +
+      "<a:link 
rel=\"http://docs.oasis-open.org/odata/ns/related/NavPropertyETTwoPrimOne\"; "
+      + "type=\"application/atom+xml;type=feed\" 
title=\"NavPropertyETTwoPrimOne\" "
+      + "href=\"ESAllPrim(10)/NavPropertyETTwoPrimOne\"/>\n" +
+      "<a:link 
rel=\"http://docs.oasis-open.org/odata/ns/related/NavPropertyETTwoPrimMany\"; "
+      + "type=\"application/atom+xml;type=feed\" 
title=\"NavPropertyETTwoPrimMany\" "
+      + "href=\"ESAllPrim(10)/NavPropertyETTwoPrimMany\"/>\n" +
+      "<a:category scheme=\"http://docs.oasis-open.org/odata/ns/scheme\"; "
+      + "term=\"#olingo.odata.test1.ETAllPrim\"/>\n" +
+      "<a:content type=\"application/xml\">\n" +
+        "<m:properties>\n" +
+          "<d:PropertyInt16 m:type=\"Int16\">10</d:PropertyInt16>\n" +
+          "<d:PropertyString>[email protected]</d:PropertyString>\n" +
+          "<d:PropertyBoolean m:type=\"Boolean\">false</d:PropertyBoolean>\n" +
+          "<d:PropertyByte m:type=\"Byte\">0</d:PropertyByte>\n" +
+          "<d:PropertySByte m:type=\"SByte\">0</d:PropertySByte>\n" +
+          "<d:PropertyInt32 m:type=\"Int32\">0</d:PropertyInt32>\n" +
+          "<d:PropertyInt64 m:type=\"Int64\">0</d:PropertyInt64>\n" +
+          "<d:PropertySingle m:type=\"Single\">0.0</d:PropertySingle>\n" +
+          "<d:PropertyDouble m:type=\"Double\">0.0</d:PropertyDouble>\n" +
+          "<d:PropertyDecimal m:type=\"Decimal\">0</d:PropertyDecimal>\n" +
+          "<d:PropertyBinary m:type=\"Binary\"/>\n" +
+          "<d:PropertyDate m:type=\"Date\">1970-01-01</d:PropertyDate>\n" +
+          "<d:PropertyDateTimeOffset m:type=\"DateTimeOffset\">"
+          + "2005-12-03T00:00:00Z</d:PropertyDateTimeOffset>\n" +
+          "<d:PropertyDuration 
m:type=\"Duration\">PT0S</d:PropertyDuration>\n"+
+          "<d:PropertyGuid m:type=\"Guid\">"
+          + "76543201-23ab-cdef-0123-456789cccddd</d:PropertyGuid>\n" +
+          "<d:PropertyTimeOfDay 
m:type=\"TimeOfDay\">00:01:01</d:PropertyTimeOfDay>\n" +
+        "</m:properties>\n" +
+      "</a:content>\n" +
+      "<m:action metadata=\"#olingo.odata.test1.BAETAllPrimRT\" "
+      + "title=\"olingo.odata.test1.BAETAllPrimRT\" "
+      + "target=\"ESAllPrim(10)/olingo.odata.test1.BAETAllPrimRT\"/>\n" +
+      "</a:entry>\n" +
         "</a:feed>";
     checkXMLEqual(expected, resultString);
   }  
@@ -2834,6 +2877,7 @@ public class ODataXmlSerializerTest {
         "  <m:ref id=\"ESAllPrim(32767)\" />\n" +
         "  <m:ref id=\"ESAllPrim(-32768)\" />\n" +
         "  <m:ref id=\"ESAllPrim(0)\" />\n" +
+        "  <m:ref id=\"ESAllPrim(10)\" />\n" +
         "</a:feed>";
     checkXMLEqual(expected, resultString);
   }
diff --git 
a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/FilterTreeToText.java
 
b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/FilterTreeToText.java
index 2103dd1..e00bdb6 100644
--- 
a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/FilterTreeToText.java
+++ 
b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/testutil/FilterTreeToText.java
@@ -150,4 +150,10 @@ public class FilterTreeToText implements 
ExpressionVisitor<String> {
     return "<" + type.getFullQualifiedName().getFullQualifiedNameAsString() + 
"<" + tmp + ">>";
   }
 
+  @Override
+  public String visitBinaryOperator(BinaryOperatorKind operator, String left, 
List<String> right)
+      throws ExpressionVisitException, ODataApplicationException {
+    return "<" + left + " " + operator.toString() + " " + right.toString() + 
">";
+  }
+
 }

Reply via email to