[Groonga-commit] groonga/gcs [master] bq: support multi phrase in a string

Back to archive index

null+****@clear***** null+****@clear*****
2012年 8月 6日 (月) 14:36:06 JST


Kouhei Sutou	2012-08-06 14:36:06 +0900 (Mon, 06 Aug 2012)

  New Revision: 6f917580416e3a7bb162a61b1272d7fd979e2266
  https://github.com/groonga/gcs/commit/6f917580416e3a7bb162a61b1272d7fd979e2266

  Log:
    bq: support multi phrase in a string

  Modified files:
    lib/bq-translator.js

  Modified: lib/bq-translator.js (+16 -23)
===================================================================
--- lib/bq-translator.js    2012-08-06 14:16:42 +0900 (f1db762)
+++ lib/bq-translator.js    2012-08-06 14:36:06 +0900 (3656d67)
@@ -225,39 +225,43 @@ BooleanQueryTranslator.prototype = {
     if (this.query[this.offset] != "'") {
       this.throwTranslateError("open single quote for string value is missing");
     }
-    if (this.query[this.offset + 1] == "\"") {
-      return this.translateExpressionValuePhrase(field);
-    }
-
     this.offset++;
+
     var tokens = [];
     var value = "";
     for (; this.offset < this.query.length; this.offset++) {
       var character = this.query[this.offset];
       if (character == "'") {
         this.offset++;
-        tokens.push(this.translateExpressionValueStringKeyword(field, value));
+        if (value.length > 0) {
+          tokens.push(this.translateExpressionValueStringKeyword(field, value));
+        }
         return tokens.join(" ");
       }
 
       if (character == " " || character == "+") {
         if (value.length > 0) {
           tokens.push(this.translateExpressionValueStringKeyword(field, value));
-          tokens.push("&&");
           value = "";
         }
+        tokens.push("&&");
       } else if (character == "|") {
         if (value.length > 0) {
           tokens.push(this.translateExpressionValueStringKeyword(field, value));
-          tokens.push("||");
           value = "";
         }
+        tokens.push("||");
       } else if (character == "\\") {
         this.offset++;
+        // TODO: check length
         character = this.query[this.offset];
         value += character;
       } else if (character == "\"") {
-        value += "\\\"";
+        if (value.length > 0) {
+          this.throwTranslateError("TODO");
+        }
+        tokens.push(this.translateExpressionValuePhrase(field));
+        this.offset--;
       } else {
         value += character;
       }
@@ -274,32 +278,21 @@ BooleanQueryTranslator.prototype = {
     return field + " " + operator + " " + "\"" + value + "\"";
   },
   translateExpressionValuePhrase: function(field) {
-    if (!(this.query[this.offset] == "'" &&
-          this.query[this.offset + 1] == "\"")) {
-      // TODO: report error
-      return "";
+    if (this.query[this.offset] != "\"") {
+      this.throwTranslateError("open double quote for phrase value is missing");
     }
 
-    this.offset += 2;
+    this.offset += 1;
     var value = "";
     for (; this.offset < this.query.length; this.offset++) {
       var character = this.query[this.offset];
-      if (character == "'") {
-        // TODO: report error: missing close quote <">
-        return "";
-      }
-
       if (character == "\\") {
         this.offset++;
+        // TODO: check length
         character = this.query[this.offset];
         value += character;
       } else if (character == "\"") {
         this.offset++;
-        if (this.query[this.offset] != "'") {
-          // TODO: report error: missing close quote <'> after <">
-          return "";
-        }
-        this.offset++;
         return field + " @ " + "\"" + value + "\"";
       } else {
         value += character;
-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
Download 



Groonga-commit メーリングリストの案内
Back to archive index