[Groonga-commit] groonga/gcs [master] BqTranslator: support (filter ...)

Back to archive index

null+****@clear***** null+****@clear*****
2012年 7月 27日 (金) 17:58:37 JST


Kouhei Sutou	2012-07-27 17:58:37 +0900 (Fri, 27 Jul 2012)

  New Revision: f14db1c297529f763ad95516061eddd5d9382958
  https://github.com/groonga/gcs/commit/f14db1c297529f763ad95516061eddd5d9382958

  Log:
    BqTranslator: support (filter ...)

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

  Modified: lib/bq-translator.js (+32 -1)
===================================================================
--- lib/bq-translator.js    2012-07-27 17:49:10 +0900 (8b70261)
+++ lib/bq-translator.js    2012-07-27 17:58:37 +0900 (ed4d960)
@@ -11,7 +11,6 @@
 
   Unsupported syntaxes of Boolean Queries:
     * range in field value
-    * (filter ...)
     * (not ...)
 
   FIXME: Returns null if the given query is not supported.
@@ -66,6 +65,9 @@ BooleanQueryTranslator.prototype = {
         case "field":
           expression = this.translateGroupField(query, context);
           break;
+        case "filter":
+          expression = this.translateGroupFilter(query, context);
+          break;
         case "and":
           expression = this.translateGroupSetOperation(query, "&&", context);
           break;
@@ -125,6 +127,35 @@ BooleanQueryTranslator.prototype = {
     // TODO: report error: missing close paren <)>
     return "";
   },
+  translateGroupFilter: function(query, context) {
+    var field = "";
+    for (; context.offset < query.length; context.offset++) {
+      var character = query[context.offset];
+      if (/^[\-a-z0-9]$/.test(character)) {
+        field += character;
+      } else if (character == " ") {
+        this.skipSpaces(query, context);
+        var expression = this.translateExpressionValueUnsignedInteger(query,
+                                                                      field,
+                                                                      context);
+        this.skipSpaces(query, context);
+        if (query[context.offset] != ")") {
+          // TODO: report error: have garbage
+          return "";
+        }
+        return expression;
+      } else if (character == ")") {
+        // TODO: report error: field and value is missing
+        return "";
+      } else {
+        // TODO: report error: invalid field character
+        return "";
+      }
+    }
+
+    // TODO: report error: missing close paren <)>
+    return "";
+  },
   translateGroupSetOperation: function(query, setOperator, context) {
     var expressions = [];
     while (context.offset < query.length) {

  Modified: test/bq-translator.test.js (+4 -0)
===================================================================
--- test/bq-translator.test.js    2012-07-27 17:49:10 +0900 (fba15b2)
+++ test/bq-translator.test.js    2012-07-27 17:58:37 +0900 (aefffe7)
@@ -70,6 +70,10 @@ suite('BoolanQueryTranslator', function() {
             "field1 @ \"keyword1\"",
             "(field field1 'keyword1')".length,
             "(field field1 'keyword1') (other group)");
+  testGroup("filter",
+            "field1 == 29",
+            "(filter field1 29)".length,
+            "(filter field1 29) (other group)");
   testGroup("and",
             "(field1 @ \"keyword1\" && field2 @ \"keyword2\")",
             "(and field1:'keyword1' field2:'keyword2')".length,
-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
Descargar 



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