[Groonga-commit] groonga/gcs [master] BqTranslator: support field and value expression

Back to archive index

null+****@clear***** null+****@clear*****
2012年 7月 27日 (金) 16:27:36 JST


Kouhei Sutou	2012-07-27 16:27:36 +0900 (Fri, 27 Jul 2012)

  New Revision: 85910e404523dcab6add6799854b592c46ab831d
  https://github.com/groonga/gcs/commit/85910e404523dcab6add6799854b592c46ab831d

  Log:
    BqTranslator: support field and value expression

  Modified files:
    lib/bq-translator.js
    test/bq-translator.test.js

  Modified: lib/bq-translator.js (+31 -9)
===================================================================
--- lib/bq-translator.js    2012-07-27 16:18:51 +0900 (df33afd)
+++ lib/bq-translator.js    2012-07-27 16:27:36 +0900 (b9a7ab5)
@@ -18,21 +18,43 @@ BooleanQueryTranslator.prototype = {
     return this.translateTinia(query);
   },
   translateExpression: function(query, context) {
+    var startOffset = context.offset;
+    var field;
+    if (/^[a-z0-9]$/.test(query[context.offset])) {
+      field = "";
+      for (; context.offset < query.length; context.offset++) {
+        var character = query[context.offset];
+        if (!/^[\-a-z0-9]$/.test(character)) {
+          break;
+        }
+        field += character;
+      }
+      if (query[context.offset] == ":") {
+        context.offset++;
+      } else {
+        var is_unsigned_integer_value = /^[0-9]+$/.test(field);
+        if (is_unsigned_integer_value) {
+          field = context.defaultField;
+          context.offset = startOffset;
+        } else {
+          // TODO: report error: field and value separator ":" is missing
+          return "";
+        }
+      }
+    } else {
+      field = context.defaultField;
+    }
+
     if (query[context.offset] == "'") {
       if (query[context.offset + 1] == "\"") {
-        return this.translateExpressionValuePhrase(query,
-                                                   context.defaultField,
-                                                   context);
+        return this.translateExpressionValuePhrase(query, field, context);
       }
-      return this.translateExpressionValueString(query,
-                                                 context.defaultField,
-                                                 context);
+      return this.translateExpressionValueString(query, field, context);
     }
     if (/^[0-9]/.test(query[context.offset])) {
-      return this.translateExpressionValueUnsignedInteger(query,
-                                                          context.defaultField,
-                                                          context);
+      return this.translateExpressionValueUnsignedInteger(query, field, context);
     }
+    // TODO: report error
     return "";
   },
   translateExpressionValuePhrase: function(query, field, context) {

  Modified: test/bq-translator.test.js (+5 -1)
===================================================================
--- test/bq-translator.test.js    2012-07-27 16:18:51 +0900 (a8da45b)
+++ test/bq-translator.test.js    2012-07-27 16:27:36 +0900 (e8037d7)
@@ -57,4 +57,8 @@ suite('BoolanQueryTranslator', function() {
                  "field == 29",
                  "29".length,
                  "29 75");
-})
+  testExpression("field value: string",
+                 "field1 @ \"keyword1\" && field1 @ \"keyword2\"",
+                 "field1:'keyword1 keyword2'".length,
+                 "field1:'keyword1 keyword2' field2:'other keyword'");
+});
-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
Download 



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