You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2015/11/28 06:30:26 UTC

[18/47] olingo-odata4 git commit: [OLINGO-568] Added missing SearchParser parse paths

[OLINGO-568] Added missing SearchParser parse paths


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

Branch: refs/heads/OLINGO-811_CountForExpand
Commit: cef72e45ab0509310ed46c26d0c3df4a30885d5f
Parents: 40962a9
Author: mibo <mi...@apache.org>
Authored: Fri Nov 13 08:16:15 2015 +0100
Committer: mibo <mi...@apache.org>
Committed: Fri Nov 13 08:16:15 2015 +0100

----------------------------------------------------------------------
 .../core/uri/parser/search/SearchParser.java    | 99 +++++++++++++-------
 .../search/SearchParserAndTokenizerTest.java    | 19 +++-
 .../uri/parser/search/SearchParserTest.java     |  9 +-
 3 files changed, 85 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/cef72e45/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchParser.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchParser.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchParser.java
index 25c52f2..d5109a5 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchParser.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchParser.java
@@ -29,20 +29,20 @@ import java.util.List;
 public class SearchParser {
 
   private Iterator<SearchQueryToken> tokens;
-  private SearchExpression root;
   private SearchQueryToken token;
 
   public SearchOption parse(String path, String value) {
     SearchTokenizer tokenizer = new SearchTokenizer();
+    SearchExpression searchExpression;
     try {
       tokens = tokenizer.tokenize(value).iterator();
       nextToken();
-      root = processSearchExpression(null);
+      searchExpression = processSearchExpression(null);
     } catch (SearchTokenizerException e) {
       return null;
     }
     final SearchOptionImpl searchOption = new SearchOptionImpl();
-    searchOption.setSearchExpression(root);
+    searchOption.setSearchExpression(searchExpression);
     return searchOption;
   }
 
@@ -57,26 +57,47 @@ public class SearchParser {
       return left;
     }
 
-    if(token.getToken() == SearchQueryToken.Token.OPEN) {
+    SearchExpression expression = left;
+    if(isToken(SearchQueryToken.Token.OPEN)) {
       processOpen();
-      throw illegalState();
-    } else if(token.getToken() == SearchQueryToken.Token.CLOSE) {
-        processClose();
-        throw illegalState();
-    } else if(token.getToken() == SearchQueryToken.Token.NOT) {
-      processNot();
-    } else if(token.getToken() == SearchQueryToken.Token.PHRASE ||
-        token.getToken() == SearchQueryToken.Token.WORD) {
-      return processSearchExpression(processTerm());
-    } else if(token.getToken() == SearchQueryToken.Token.AND) {
-        SearchExpression se = processAnd(left);
-        return processSearchExpression(se);
-    } else if(token.getToken() == SearchQueryToken.Token.OR) {
-        return processOr(left);
-    } else {
+      expression = processSearchExpression(left);
+      validateToken(SearchQueryToken.Token.CLOSE);
+      processClose();
+    } else if(isTerm()) {
+      expression = processTerm();
+    }
+
+    if(isToken(SearchQueryToken.Token.AND) || isTerm()) {
+        expression = processAnd(expression);
+    } else if(isToken(SearchQueryToken.Token.OR)) {
+        expression = processOr(expression);
+    } else if(isEof()) {
+      return expression;
+    }
+    return expression;
+  }
+
+  private boolean isTerm() {
+    return isToken(SearchQueryToken.Token.NOT)
+        || isToken(SearchQueryToken.Token.PHRASE)
+        || isToken(SearchQueryToken.Token.WORD);
+  }
+
+  private boolean isEof() {
+    return token == null;
+  }
+
+  private boolean isToken(SearchQueryToken.Token toCheckToken) {
+    if(token == null) {
+      return false;
+    }
+    return token.getToken() == toCheckToken;
+  }
+
+  private void validateToken(SearchQueryToken.Token toValidateToken) {
+    if(!isToken(toValidateToken)) {
       throw illegalState();
     }
-    throw illegalState();
   }
 
   private void processClose() {
@@ -88,13 +109,24 @@ public class SearchParser {
   }
 
   private SearchExpression processAnd(SearchExpression left) {
-    nextToken();
-    SearchExpression se = processTerm();
-    return new SearchBinaryImpl(left, SearchBinaryOperatorKind.AND, se);
+    if(isToken(SearchQueryToken.Token.AND)) {
+      nextToken();
+    }
+    SearchExpression se = left;
+    if(isTerm()) {
+      se = processTerm();
+      se = new SearchBinaryImpl(left, SearchBinaryOperatorKind.AND, se);
+      return processSearchExpression(se);
+    } else {
+      se = processSearchExpression(se);
+      return new SearchBinaryImpl(left, SearchBinaryOperatorKind.AND, se);
+    }
   }
 
   public SearchExpression processOr(SearchExpression left) {
-    nextToken();
+    if(isToken(SearchQueryToken.Token.OR)) {
+      nextToken();
+    }
     SearchExpression se = processSearchExpression(left);
     return new SearchBinaryImpl(left, SearchBinaryOperatorKind.OR, se);
   }
@@ -103,8 +135,13 @@ public class SearchParser {
     return new RuntimeException();
   }
 
-  private void processNot() {
+  private SearchExpression processNot() {
     nextToken();
+    SearchExpression searchExpression = processTerm();
+    if(searchExpression.isSearchTerm()) {
+      return new SearchUnaryImpl(searchExpression.asSearchTerm());
+    }
+    throw illegalState();
   }
 
   private void nextToken() {
@@ -113,20 +150,18 @@ public class SearchParser {
     } else {
       token = null;
     }
-//    return null;
   }
 
   private SearchExpression processTerm() {
-    if(token.getToken() == SearchQueryToken.Token.NOT) {
-      return new SearchUnaryImpl(processPhrase());
+    if(isToken(SearchQueryToken.Token.NOT)) {
+      return processNot();
     }
-    if(token.getToken() == SearchQueryToken.Token.PHRASE) {
+    if(isToken(SearchQueryToken.Token.PHRASE)) {
       return processPhrase();
-    }
-    if(token.getToken() == SearchQueryToken.Token.WORD) {
+    } else if(isToken(SearchQueryToken.Token.WORD)) {
       return processWord();
     }
-    return null;
+    throw illegalState();
   }
 
   private SearchTermImpl processWord() {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/cef72e45/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchParserAndTokenizerTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchParserAndTokenizerTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchParserAndTokenizerTest.java
index 3ecd517..271b617 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchParserAndTokenizerTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchParserAndTokenizerTest.java
@@ -34,9 +34,6 @@ public class SearchParserAndTokenizerTest {
 
   @Test
   public void basicParsing() throws SearchTokenizerException {
-//    SearchExpressionValidator.init("a AND b OR c").enableLogging()
-//        .validate(with("a"));
-
     SearchExpressionValidator.init("a")
         .validate(with("a"));
     SearchExpressionValidator.init("a AND b")
@@ -57,6 +54,22 @@ public class SearchParserAndTokenizerTest {
         .validate("{'a' OR {'b' AND 'c'}}");
   }
 
+  @Test
+  public void notParsing() throws Exception {
+    SearchExpressionValidator.init("NOT a AND b OR c")
+        .validate("{{{NOT 'a'} AND 'b'} OR 'c'}");
+    SearchExpressionValidator.init("a OR b AND NOT c")
+        .validate("{'a' OR {'b' AND {NOT 'c'}}}");
+  }
+
+  @Test
+  public void parenthesesParsing() throws Exception {
+    SearchExpressionValidator.init("a AND (b OR c)")
+        .validate("{'a' AND {'b' OR 'c'}}");
+    SearchExpressionValidator.init("(a OR b) AND NOT c")
+        .validate("{{'a' OR 'b'} AND {NOT 'c'}}");
+  }
+
   @Ignore
   @Test
   public void sebuilder() {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/cef72e45/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchParserTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchParserTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchParserTest.java
index ce37f3d..89b59b4 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchParserTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchParserTest.java
@@ -83,7 +83,6 @@ public class SearchParserTest extends SearchParser {
     assertEquals("phrase2", se.asSearchBinary().getRightOperand().asSearchTerm().getSearchTerm());
   }
   
-  @Ignore
   @Test
   public void simpleImplicitAnd() {
     SearchExpression se = run(Token.WORD, Token.WORD);
@@ -101,7 +100,6 @@ public class SearchParserTest extends SearchParser {
     assertEquals("phrase2", se.asSearchBinary().getRightOperand().asSearchTerm().getSearchTerm());
   }
   
-  @Ignore
   @Test
   public void simpleBrackets() {
     SearchExpression se = run(Token.OPEN, Token.WORD, Token.CLOSE);
@@ -115,7 +113,6 @@ public class SearchParserTest extends SearchParser {
     assertEquals("phrase1", se.asSearchTerm().getSearchTerm());
   }
   
-  @Ignore
   @Test
   public void simpleNot() {
     SearchExpression se = run(Token.NOT, Token.WORD);
@@ -123,13 +120,12 @@ public class SearchParserTest extends SearchParser {
     assertTrue(se.isSearchUnary());
     assertEquals("word1", se.asSearchUnary().getOperand().asSearchTerm().getSearchTerm());
     
-    se = run(Token.NOT, Token.WORD);
-    assertEquals("'phrase1'", se.toString());
+    se = run(Token.NOT, Token.PHRASE);
+    assertEquals("{NOT 'phrase1'}", se.toString());
     assertTrue(se.isSearchUnary());
     assertEquals("phrase1", se.asSearchUnary().getOperand().asSearchTerm().getSearchTerm());
   }
   
-  @Ignore
   @Test
   public void precedenceLast() {
     //word1 AND (word2 AND word3) 
@@ -137,7 +133,6 @@ public class SearchParserTest extends SearchParser {
     assertEquals("{'word1' AND {'word2' AND 'word3'}}", se.toString());
   }
   
-  @Ignore
   @Test
   public void precedenceFirst() {
     //(word1 AND word2) AND word3