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 2020/10/29 07:14:41 UTC

[olingo-odata4] branch master updated: [OLINGO-1489]Support custom aggregates that have the same name a property

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 4aba5b9  [OLINGO-1489]Support custom aggregates that have the same name a property
4aba5b9 is described below

commit 4aba5b9f9266f8f5ca7c1ad3cef1dfd927926b55
Author: ramya vasanth <ra...@sap.com>
AuthorDate: Thu Oct 29 12:44:29 2020 +0530

    [OLINGO-1489]Support custom aggregates that have the same name a property
---
 .../olingo/server/core/uri/parser/ApplyParser.java | 59 +++++++++++++++++-----
 .../server/core/uri/parser/ApplyParserTest.java    | 38 ++++++++++++--
 2 files changed, 80 insertions(+), 17 deletions(-)

diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ApplyParser.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ApplyParser.java
index 4592014..7cc0f3b 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ApplyParser.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ApplyParser.java
@@ -237,18 +237,7 @@ public class ApplyParser {
     UriInfoImpl uriInfo = new UriInfoImpl();
     final String identifierLeft = parsePathPrefix(uriInfo, referencedType);
     if (identifierLeft != null) {
-      final String customAggregate = tokenizer.getText();
-      // A custom aggregate (an OData identifier) is defined in the CustomAggregate
-      // EDM annotation (in namespace Org.OData.Aggregation.V1) of the structured type or of the entity container.
-      // Currently we don't look into annotations, so all custom aggregates are allowed and have no type.
-      uriInfo.addResourcePart(new UriResourcePrimitivePropertyImpl(createDynamicProperty(customAggregate, null)));
-      aggregateExpression.setPath(uriInfo);
-      final String alias = parseAsAlias(referencedType, false);
-      aggregateExpression.setAlias(alias);
-      if (alias != null) {
-        ((DynamicStructuredType) referencedType).addProperty(createDynamicProperty(alias, null));
-      }
-      parseAggregateFrom(aggregateExpression, referencedType);
+    	customAggregate(referencedType, aggregateExpression, uriInfo);
     } else if (tokenizer.next(TokenKind.OPEN)) {
       final UriResource lastResourcePart = uriInfo.getLastResourcePart();
       if (lastResourcePart == null) {
@@ -279,8 +268,13 @@ public class ApplyParser {
       aggregateExpression.setExpression(expression);
       parseAggregateWith(aggregateExpression);
       if (aggregateExpression.getStandardMethod() == null && aggregateExpression.getCustomMethod() == null) {
-        throw new UriParserSyntaxException("Invalid 'aggregateExpr' syntax.",
-            UriParserSyntaxException.MessageKeys.SYNTAX);
+    	  if (tokenizer.next(TokenKind.AsOperator)) {
+				throw new UriParserSyntaxException("Invalid 'aggregateExpr' syntax.",
+						UriParserSyntaxException.MessageKeys.SYNTAX);
+			} 
+			customAggregateNamedAsProperty(referencedType, aggregateExpression, uriInfo);
+			
+			return aggregateExpression;
       }
       final String alias = parseAsAlias(referencedType, true);
       aggregateExpression.setAlias(alias);
@@ -302,6 +296,43 @@ public class ApplyParser {
     return aggregateExpression;
   }
 
+  private void customAggregate(EdmStructuredType referencedType, AggregateExpressionImpl aggregateExpression,
+      UriInfoImpl uriInfo) throws UriParserException {
+    final String customAggregate = tokenizer.getText();
+    // A custom aggregate (an OData identifier) is defined in the CustomAggregate
+    // EDM annotation (in namespace Org.OData.Aggregation.V1) of the structured type
+    // or of the entity container.
+    // Currently we don't look into annotations, so all custom aggregates are
+    // allowed and have no type.
+    uriInfo.addResourcePart(new UriResourcePrimitivePropertyImpl(createDynamicProperty(customAggregate, null)));
+    aggregateExpression.setPath(uriInfo);
+    final String alias = parseAsAlias(referencedType, false);
+    if (alias != null) {
+      aggregateExpression.setAlias(alias);
+      ((DynamicStructuredType) referencedType).addProperty(createDynamicProperty(alias, null));
+    }
+    parseAggregateFrom(aggregateExpression, referencedType);
+  }
+
+  private void customAggregateNamedAsProperty(EdmStructuredType referencedType, 
+		  AggregateExpressionImpl aggregateExpression, UriInfoImpl uriInfo) 
+				  throws UriParserException {
+    /*
+     * The name of the custom aggregate is identical to the name of a declared
+     * property of the structured type. This is typically done when the custom
+     * aggregate is used as a default aggregate for that property. In this case, the
+     * name refers to the custom aggregate within an aggregate expression without a
+     * with clause, and to the property in all other cases.
+     */
+    UriResource lastResourcePart = uriInfo.getLastResourcePart();
+    String alias = lastResourcePart.getSegmentValue();
+    EdmType edmType = ParserHelper.getTypeInformation((UriResourcePartTyped) lastResourcePart);
+    aggregateExpression.setPath(uriInfo);
+    aggregateExpression.setAlias(alias);
+    aggregateExpression.setExpression(null);
+    ((DynamicStructuredType) referencedType).addProperty(createDynamicProperty(alias, edmType));
+  }
+	  
   private void parseAggregateWith(AggregateExpressionImpl aggregateExpression) throws UriParserException {
     if (tokenizer.next(TokenKind.WithOperator)) {
       final TokenKind kind = ParserHelper.next(tokenizer,
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ApplyParserTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ApplyParserTest.java
index 8e31808..25babe2 100644
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ApplyParserTest.java
+++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/parser/ApplyParserTest.java
@@ -21,6 +21,7 @@ package org.apache.olingo.server.core.uri.parser;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import java.util.ArrayList;
@@ -109,11 +110,9 @@ public class ApplyParserTest {
     parse("ESTwoKeyNav", "aggregate(PropertyInt16 with min as min,PropertyInt16 with max as max)")
         .goAggregate(0).isStandardMethod(StandardMethod.MIN).isAlias("min").goUp()
         .goAggregate(1).isStandardMethod(StandardMethod.MAX).isAlias("max");
-
+    
     parseEx("ESTwoKeyNav", "aggregate()")
         .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX);
-    parseEx("ESTwoKeyNav", "aggregate(PropertyInt16)")
-        .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX);
     parseEx("ESTwoKeyNav", "aggregate(PropertyInt16 with sum)")
         .isExSyntax(UriParserSyntaxException.MessageKeys.SYNTAX);
     parseEx("ESTwoKeyNav", "aggregate(PropertyInt16 as s)")
@@ -127,6 +126,26 @@ public class ApplyParserTest {
   }
 
   @Test
+  public void customAggregate() throws Exception {
+	    parse("ESTwoKeyNav", "aggregate(customAggregate)")
+        .is(Aggregate.class)
+        .goAggregate(0)
+   	    .noExpression()
+   	    .noInlineAggregateExpression()
+        .goPath().first().isUriPathInfoKind(UriResourceKind.primitiveProperty);
+  }
+
+  @Test
+  public void customAggregateNamedAsProperty() throws Exception {
+	  parse("ESTwoKeyNav", "aggregate(PropertyInt16)")
+	  .is(Aggregate.class)
+	  .goAggregate(0)
+	  .noExpression()
+	  .noInlineAggregateExpression()
+	  .goPath().first().isPrimitiveProperty("PropertyInt16", PropertyProvider.nameInt16, false);
+  }
+
+  @Test
   public void aggregateExpression() throws Exception {
     parse("ESTwoKeyNav", "aggregate(PropertyInt16 mul PropertyComp/PropertyInt16 with sum as s)")
         .is(Aggregate.class)
@@ -670,6 +689,13 @@ public class ApplyParserTest {
       return this;
     }
 
+    public AggregateValidator noExpression() {
+        assertNotNull(aggregateExpression);
+        assertNull(aggregateExpression.getExpression());
+
+        return this;
+      }
+
     public FilterValidator goExpression() {
       assertNotNull(aggregateExpression);
       assertNotNull(aggregateExpression.getExpression());
@@ -687,6 +713,12 @@ public class ApplyParserTest {
       return new ResourceValidator().setUpValidator(this).setEdm(edm).setUriInfoPath(resource);
     }
 
+    public AggregateValidator noInlineAggregateExpression() {
+    	assertNull(aggregateExpression.getInlineAggregateExpression());
+
+    	return this;
+    }
+
     public AggregateValidator goInlineAggregateExpression() {
       return new AggregateValidator(aggregateExpression.getInlineAggregateExpression(), this);
     }