Repository: olingo-odata2 Updated Branches: refs/heads/master 9435ccd4d -> 85c993f1c
[OLINGO-829] having multiple startswith method in JPA throws Exception Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/85c993f1 Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/85c993f1 Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/85c993f1 Branch: refs/heads/master Commit: 85c993f1ccb3cdbd7d90a26bb1eefee8430b3656 Parents: 9435ccd Author: ramya vasanth <ramya.vasa...@sap.com> Authored: Fri Sep 1 10:16:43 2017 +0530 Committer: ramya vasanth <ramya.vasa...@sap.com> Committed: Fri Sep 1 10:16:43 2017 +0530 ---------------------------------------------------------------------- .../processor/core/ODataExpressionParser.java | 68 ++++++++++++------ .../core/ODataFilterExpressionParserTest.java | 72 ++++++++++++++++++++ .../core/access/data/JPAEntityTest.java | 4 +- 3 files changed, 122 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/85c993f1/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java index 66190a4..9879e66 100644 --- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java +++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java @@ -18,19 +18,41 @@ ******************************************************************************/ package org.apache.olingo.odata2.jpa.processor.core; -import org.apache.olingo.odata2.api.edm.*; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Iterator; +import java.util.List; + +import org.apache.olingo.odata2.api.edm.EdmException; +import org.apache.olingo.odata2.api.edm.EdmLiteral; +import org.apache.olingo.odata2.api.edm.EdmLiteralKind; +import org.apache.olingo.odata2.api.edm.EdmMapping; +import org.apache.olingo.odata2.api.edm.EdmNavigationProperty; +import org.apache.olingo.odata2.api.edm.EdmProperty; +import org.apache.olingo.odata2.api.edm.EdmSimpleType; +import org.apache.olingo.odata2.api.edm.EdmSimpleTypeException; +import org.apache.olingo.odata2.api.edm.EdmSimpleTypeKind; +import org.apache.olingo.odata2.api.edm.EdmTyped; import org.apache.olingo.odata2.api.exception.ODataException; import org.apache.olingo.odata2.api.exception.ODataNotImplementedException; import org.apache.olingo.odata2.api.uri.KeyPredicate; -import org.apache.olingo.odata2.api.uri.expression.*; +import org.apache.olingo.odata2.api.uri.expression.BinaryExpression; +import org.apache.olingo.odata2.api.uri.expression.BinaryOperator; +import org.apache.olingo.odata2.api.uri.expression.CommonExpression; +import org.apache.olingo.odata2.api.uri.expression.ExpressionKind; +import org.apache.olingo.odata2.api.uri.expression.FilterExpression; +import org.apache.olingo.odata2.api.uri.expression.LiteralExpression; +import org.apache.olingo.odata2.api.uri.expression.MemberExpression; +import org.apache.olingo.odata2.api.uri.expression.MethodExpression; +import org.apache.olingo.odata2.api.uri.expression.MethodOperator; +import org.apache.olingo.odata2.api.uri.expression.OrderByExpression; +import org.apache.olingo.odata2.api.uri.expression.OrderExpression; +import org.apache.olingo.odata2.api.uri.expression.PropertyExpression; +import org.apache.olingo.odata2.api.uri.expression.SortOrder; +import org.apache.olingo.odata2.api.uri.expression.UnaryExpression; import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException; import org.apache.olingo.odata2.jpa.processor.api.jpql.JPQLStatement; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Iterator; -import java.util.List; - /** * This class contains utility methods for parsing the filter expressions built by core library from user OData Query. * @@ -91,18 +113,22 @@ public class ODataExpressionParser { // Special handling for STARTSWITH and ENDSWITH method expression if (operator != null && (operator == MethodOperator.STARTSWITH || operator == MethodOperator.ENDSWITH)) { - if (!binaryExpression.getOperator().equals(BinaryOperator.EQ)) { + if (!binaryExpression.getOperator().equals(BinaryOperator.EQ) && + !(binaryExpression.getRightOperand() instanceof LiteralExpression) && + ("true".equals(right) || "false".equals(right))) { throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.OPERATOR_EQ_NE_MISSING .addContent(binaryExpression.getOperator().toString()), null); - } else if (right.equals("false")) { - return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left.replaceFirst("LIKE", "NOT LIKE") - + JPQLStatement.DELIMITER.SPACE - + JPQLStatement.DELIMITER.PARENTHESIS_RIGHT; - } else { - return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left - + JPQLStatement.DELIMITER.SPACE - + JPQLStatement.DELIMITER.PARENTHESIS_RIGHT; - } + } else if (binaryExpression.getOperator().equals(BinaryOperator.EQ)) { + if ("false".equals(right)) { + return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left.replaceFirst("LIKE", "NOT LIKE") + + JPQLStatement.DELIMITER.SPACE + + JPQLStatement.DELIMITER.PARENTHESIS_RIGHT; + } else if ("true".equals(right)){ + return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left + + JPQLStatement.DELIMITER.SPACE + + JPQLStatement.DELIMITER.PARENTHESIS_RIGHT; + } + } } switch (binaryExpression.getOperator()) { case AND: @@ -227,9 +253,11 @@ public class ODataExpressionParser { * @param first */ private static String updateValueIfWildcards(String value) { - value = value.replace("\\", "\\\\"); - value = value.replace("%", "\\%"); - value = value.replace("_", "\\_"); + if (value != null) { + value = value.replace("\\", "\\\\"); + value = value.replace("%", "\\%"); + value = value.replace("_", "\\_"); + } return value; } /** http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/85c993f1/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataFilterExpressionParserTest.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataFilterExpressionParserTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataFilterExpressionParserTest.java index af798fe..c65dced 100644 --- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataFilterExpressionParserTest.java +++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataFilterExpressionParserTest.java @@ -99,7 +99,32 @@ public class ODataFilterExpressionParserTest { private static final String[] EXPRESSION_NULL = { "date eq null", "(E1.date IS null)" }; private static final String[] EXPRESSION_NOT_NULL = { "date ne null", "(E1.date IS NOT null)" }; + + private static final String[] EXPRESSION_STARTSWITH_EQBINARY = { "startswith(id,'123') and text eq 'abc'", + "(E1.id LIKE CONCAT('123','%') ESCAPE '\\' AND (E1.text = 'abc'))" }; + + private static final String[] EXPRESSION_STARTSWITHEQ_EQBINARY = { "startswith(id,'123') eq true and text eq 'abc'", + "((E1.id LIKE CONCAT('123','%') ESCAPE '\\' ) AND (E1.text = 'abc'))" }; + + private static final String[] EXPRESSION_EQBINARY_STARTSWITH = { "text eq 'abc' and startswith(id,'123')", + "((E1.text = 'abc') AND E1.id LIKE CONCAT('123','%') ESCAPE '\\')" }; + + private static final String[] EXPRESSION_EQBINARY_STARTSWITHEQ = { "text eq 'abc' and startswith(id,'123') eq true", + "((E1.text = 'abc') AND (E1.id LIKE CONCAT('123','%') ESCAPE '\\' ))" }; + private static final String[] EXPRESSION_STARTSWITH_STARTSWITH = { "startswith(text,'abc') and startswith(id,'123')", + "(E1.text LIKE CONCAT('abc','%') ESCAPE '\\' AND E1.id LIKE CONCAT('123','%') ESCAPE '\\')" }; + + private static final String[] EXPRESSION_STARTSWITHEQ_STARTSWITHEQ = { + "startswith(text,'abc') eq true and startswith(id,'123') eq true", + "((E1.text LIKE CONCAT('abc','%') ESCAPE '\\' ) AND (E1.id LIKE CONCAT('123','%') ESCAPE '\\' ))" }; + + private static final String[] EXPRESSION_STARTSWITH_ANDTRUE = {"startswith(text,'abc') and true", + "(E1.text LIKE CONCAT('abc','%') ESCAPE '\\' AND true)"}; + + private static final String[] EXPRESSION_STARTSWITHEQTRUE_ANDTRUE = {"startswith(text,'abc') eq true and true", + "((E1.text LIKE CONCAT('abc','%') ESCAPE '\\' ) AND true)"}; + private static Edm edm = null; @BeforeClass @@ -243,4 +268,51 @@ public class ODataFilterExpressionParserTest { } return ""; } + + @Test + public void testStartsWith_BinaryEq() { + assertEquals(EXPRESSION_STARTSWITH_EQBINARY[OUTPUT], parseWhereExpression( + EXPRESSION_STARTSWITH_EQBINARY[INPUT], false)); + } + + @Test + public void testBinaryEq_StartsWith() { + assertEquals(EXPRESSION_EQBINARY_STARTSWITH[OUTPUT], parseWhereExpression( + EXPRESSION_EQBINARY_STARTSWITH[INPUT], false)); + } + + public void testStartsWithEq_BinaryEq() { + assertEquals(EXPRESSION_STARTSWITHEQ_EQBINARY[OUTPUT], parseWhereExpression( + EXPRESSION_STARTSWITHEQ_EQBINARY[INPUT], false)); + } + + @Test + public void testBinaryEq_StartsWithEq() { + assertEquals(EXPRESSION_EQBINARY_STARTSWITHEQ[OUTPUT], parseWhereExpression( + EXPRESSION_EQBINARY_STARTSWITHEQ[INPUT], false)); + } + + @Test + public void testStartsWith_StartsWith() { + assertEquals(EXPRESSION_STARTSWITH_STARTSWITH[OUTPUT], parseWhereExpression( + EXPRESSION_STARTSWITH_STARTSWITH[INPUT], false)); + } + + @Test + public void testStartsWithEq_StartsWithEq() { + assertEquals(EXPRESSION_STARTSWITHEQ_STARTSWITHEQ[OUTPUT], parseWhereExpression( + EXPRESSION_STARTSWITHEQ_STARTSWITHEQ[INPUT], false)); + } + + @Test + public void testStartsWithEq_AndTrue() { + assertEquals(EXPRESSION_STARTSWITHEQTRUE_ANDTRUE[OUTPUT], parseWhereExpression( + EXPRESSION_STARTSWITHEQTRUE_ANDTRUE[INPUT], false)); + } + + @Test + public void testStarts_AndTrue() { + assertEquals(EXPRESSION_STARTSWITH_ANDTRUE[OUTPUT], parseWhereExpression( + EXPRESSION_STARTSWITH_ANDTRUE[INPUT], false)); + } } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/85c993f1/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java index befee61..331a3d2 100644 --- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java +++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java @@ -352,8 +352,8 @@ public class JPAEntityTest { assertEquals(jpaEmbeddableMock.getMShort(), ODataEntryMockUtil.VALUE_SHORT); assertEquals(jpaEmbeddableMock.getMDate().getDate(), ODataEntryMockUtil.VALUE_DATE.getDate()); - assertEquals(jpaEmbeddableMock.getMDate().getTime(), ODataEntryMockUtil.VALUE_DATE.getTime()); - assertEquals(jpaEmbeddableMock.getMDate1(), ODataEntryMockUtil.VALUE_DATE1); + assertEquals(jpaEmbeddableMock.getMDate().getDay(), ODataEntryMockUtil.VALUE_DATE.getDay()); + assertEquals(jpaEmbeddableMock.getMDate1().getDate(), ODataEntryMockUtil.VALUE_DATE1.getDate()); assertEquals(jpaEmbeddableMock.getMTime(), ODataEntryMockUtil.VALUE_TIME); assertEquals(jpaEmbeddableMock.getMTimestamp(), ODataEntryMockUtil.VALUE_TIMESTAMP); JPATypeEmbeddableMock2 jpaEmbeddableMock2 = jpaEmbeddableMock.getMEmbeddable();