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/10 06:29:23 UTC

olingo-odata4 git commit: [OLINGO-568] Fixed issue with implicit and

Repository: olingo-odata4
Updated Branches:
  refs/heads/OLINGO-568_SearchParserPoC 96483ae55 -> f64abe136


[OLINGO-568] Fixed issue with implicit and


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

Branch: refs/heads/OLINGO-568_SearchParserPoC
Commit: f64abe136b0d8b6b8ec195319f2a5e3db98c27d5
Parents: 96483ae
Author: Michael Bolz <mi...@sap.com>
Authored: Tue Nov 10 06:25:54 2015 +0100
Committer: Michael Bolz <mi...@sap.com>
Committed: Tue Nov 10 06:25:54 2015 +0100

----------------------------------------------------------------------
 .../core/uri/parser/search/SearchTokenizer.java | 94 ++++++++------------
 .../uri/parser/search/SearchTokenizerTest.java  |  9 +-
 2 files changed, 40 insertions(+), 63 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f64abe13/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizer.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizer.java
index 12af609..f393d22 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizer.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizer.java
@@ -73,6 +73,11 @@ public class SearchTokenizer {
       return this;
     }
 
+    public State finish(Token token) {
+      this.token = token;
+      return finish();
+    }
+
     public boolean isFinished() {
       return finished;
     }
@@ -167,12 +172,15 @@ public class SearchTokenizer {
     public SearchExpressionState() {
       super(null);
     }
+    public SearchExpressionState(String initLiteral) {
+      super(null, initLiteral);
+    }
     @Override
     public State nextChar(char c) {
       if (c == CHAR_OPEN) {
         return new OpenState();
       } else if (isWhitespace(c)) {
-        return new RwsImplicitAndState();
+        return new RwsImplicitAndOrState();
       } else if(c == CHAR_CLOSE) {
         return new CloseState();
       } else {
@@ -224,7 +232,7 @@ public class SearchTokenizer {
         return new CloseState();
       } else if (isWhitespace(c)) {
         finish();
-        return new RwsImplicitAndState();
+        return new RwsImplicitAndOrState();
       }
       return forbidden(c);
     }
@@ -254,14 +262,8 @@ public class SearchTokenizer {
         allowed(c);
         return new SearchExpressionState();
       } else if (isWhitespace(c)) {
-        if(isFinished()) {
-          return new RwsImplicitAndState();
-        }
         return allowed(c);
       } else if (c == CHAR_CLOSE) {
-        if(isFinished()) {
-          return new CloseState();
-        }
         return allowed(c);
       }
       return forbidden(c);
@@ -317,48 +319,6 @@ public class SearchTokenizer {
     }
   }
 
-  private class AndState extends LiteralState {
-    public AndState(char c) {
-      super(Token.AND, c);
-      if(c != CHAR_A) {
-        forbidden(c);
-      }
-    }
-    @Override
-    public State nextChar(char c) {
-      if (literal.length() == 1 && c == CHAR_N) {
-        return allowed(c);
-      } else if (literal.length() == 2 && c == CHAR_D) {
-        return allowed(c);
-      } else if(literal.length() == 3 && isWhitespace(c)) {
-        finish();
-        return new BeforeSearchExpressionRwsState();
-      } else {
-        return new SearchWordState(this);
-      }
-    }
-  }
-
-  private class OrState extends LiteralState {
-    public OrState(char c) {
-      super(Token.OR, c);
-      if(c != CHAR_O) {
-        forbidden(c);
-      }
-    }
-    @Override
-    public State nextChar(char c) {
-      if (literal.length() == 1 && (c == CHAR_R)) {
-        return allowed(c);
-      } else if(literal.length() == 2 && isWhitespace(c)) {
-        finish();
-        return new BeforeSearchExpressionRwsState();
-      } else {
-        return new SearchWordState(this);
-      }
-    }
-  }
-
   // RWS 'OR'  RWS searchExpr
   // RWS [ 'AND' RWS ] searchExpr
   private class BeforeSearchExpressionRwsState extends State {
@@ -376,21 +336,39 @@ public class SearchTokenizer {
   }
 
   // implicit and
-  private class RwsImplicitAndState extends State {
-    public RwsImplicitAndState() {
-      super(Token.AND);
+  private class RwsImplicitAndOrState extends LiteralState {
+    private boolean noneRws = false;
+    public RwsImplicitAndOrState() {
+      super(null);
     }
     @Override
     public State nextChar(char c) {
-      if (isWhitespace(c)) {
+      if (!noneRws && isWhitespace(c)) {
         return allowed(c);
       } else if (c == CHAR_O) {
-        return new OrState(c);
+        noneRws = true;
+        return allowed(c);
+      } else if (literal.length() == 1 && c == CHAR_R) {
+        return allowed(c);
+      } else if (literal.length() == 2 && isWhitespace(c)) {
+        finish(Token.OR);
+        return new BeforeSearchExpressionRwsState();
       } else if (c == CHAR_A) {
-        return new AndState(c);
+        noneRws = true;
+        return allowed(c);
+      } else if (literal.length() == 1 && c == CHAR_N) {
+        return allowed(c);
+      } else if (literal.length() == 2 && c == CHAR_D) {
+        return allowed(c);
+      } else if(literal.length() == 3 && isWhitespace(c)) {
+        finish(Token.AND);
+        return new BeforeSearchExpressionRwsState();
+      } else if(noneRws) {
+        finish(Token.AND);
+        return new SearchWordState(this);
       } else {
-        finish();
-        return new SearchExpressionState().init(c);
+        finish(Token.AND);
+        return new SearchExpressionState(literal.toString()).init(c);
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f64abe13/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizerTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizerTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizerTest.java
index 29287cd..548d3fd 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizerTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/uri/parser/search/SearchTokenizerTest.java
@@ -290,12 +290,11 @@ public class SearchTokenizerTest {
     SearchValidator.init("abc AND ANDsomething")
         .addExpected(WORD, AND, WORD).validate();
 
-    // FIXME (mibo): issue with implicit and
-//    SearchValidator.init("abc ANDsomething").enableLogging()
-//        .addExpected(WORD, AND, WORD).validate();
+    SearchValidator.init("abc ANDsomething")
+        .addExpected(WORD, AND, WORD).validate();
 
-//    SearchValidator.init("abc ORsomething")
-//        .addExpected(WORD, AND, WORD).validate();
+    SearchValidator.init("abc ORsomething")
+        .addExpected(WORD, AND, WORD).validate();
 
     SearchValidator.init("abc OR orsomething")
         .addExpected(WORD, OR, WORD).validate();