[Groonga-commit] groonga/gcs [master] Add support for tinia's bq parameter

Back to archive index

null+****@clear***** null+****@clear*****
2012年 7月 26日 (木) 16:30:50 JST


Yoji SHIDARA	2012-07-26 16:30:50 +0900 (Thu, 26 Jul 2012)

  New Revision: 45125e0468aef93f7dfec805762d96c4202d9c98
  https://github.com/groonga/gcs/commit/45125e0468aef93f7dfec805762d96c4202d9c98

  Log:
    Add support for tinia's bq parameter
    
    https://github.com/dlangevin/tinia

  Added files:
    lib/bq-translator.js
    test/bq-translator.test.js
  Modified files:
    lib/api/2011-02-01/search.js

  Modified: lib/api/2011-02-01/search.js (+38 -13)
===================================================================
--- lib/api/2011-02-01/search.js    2012-07-26 13:05:35 +0900 (b6eb50b)
+++ lib/api/2011-02-01/search.js    2012-07-26 16:30:50 +0900 (125f5dd)
@@ -1,5 +1,6 @@
 var Domain = require('../../database').Domain;
 var nroonga = require('../../wrapped-nroonga');
+var BooleanQueryTranslator = require('../../bq-translator').BooleanQueryTranslator;
 
 function formatSelectResults(data) {
   var columnList = data[0][1];
@@ -32,11 +33,44 @@ function select(context, options, callback) {
   });
 }
 
+function createErrorBody(options) {
+  return {
+    error: 'info',
+    rid: options.rid,
+    'time-ms': options.elapsedTime || 0,
+    'cpu-time-ms': 0, // TODO
+    messages: [
+    {
+      severity: "fatal",
+      code: "",
+      message: options.message || ""
+    }
+    ]
+  };
+}
+
 exports.createHandler = function(context) {
   return function(request, response) {
+    var dummyRid = '000000000000000000000000000000000000000000000000000000000000000';
     var startedAt = new Date();
     var domain = new Domain(request, context);
     var query = request.query.q || '';
+    var booleanQuery = request.query.bq || '';
+
+    if (!query && booleanQuery) {
+      var translator = new BooleanQueryTranslator();
+      var translatedQuery = translator.translateTinia(booleanQuery);
+      if (translatedQuery) {
+        query = translatedQuery;
+      } else {
+        var body = createErrorBody({
+          rid: dummyRid,
+          message: 'Unsupported bq parameter'
+        });
+        return response.send(body, 400);
+      }
+    }
+
     var matchIndexFields = domain.indexFields;
     matchIndexFields = matchIndexFields.filter(function(field) {
       return field.type == 'text';
@@ -63,26 +97,17 @@ exports.createHandler = function(context) {
     select(context, options, function(error, data, numFoundRecords) {
       var finishedAt = new Date();
       var elapsedTime = finishedAt - startedAt;
-      var dummyRid = '000000000000000000000000000000000000000000000000000000000000000';
       var info = {
         rid: dummyRid,
         'time-ms': elapsedTime,
         'cpu-time-ms': 0 // TODO
       };
       if (error) {
-        var body = {
-          error: 'info',
+        var body = createErrorBody({
           rid: dummyRid,
-          'time-ms': elapsedTime,
-          'cpu-time-ms': 0, // TODO
-          messages: [
-            {
-              severity: "fatal",
-              code: "",
-              message: error.message
-            }
-          ]
-        };
+          message: error.message,
+          elapsedTime: elapsedTime
+        });
         return response.send(body, 400); // TODO
       }
       var result = {

  Added: lib/bq-translator.js (+38 -0) 100644
===================================================================
--- /dev/null
+++ lib/bq-translator.js    2012-07-26 16:30:50 +0900 (4093f7d)
@@ -0,0 +1,38 @@
+/*
+  Translates Boolean Queries used in tinia https://github.com/dlangevin/tinia
+  into groonga query.
+
+  Not all of Boolean Search Queries are supported.
+  http://docs.amazonwebservices.com/cloudsearch/latest/developerguide/booleansearch.html
+
+  Returns null if the given query is not supported.
+*/
+
+
+function BooleanQueryTranslator() {
+}
+
+BooleanQueryTranslator.prototype = {
+  translateTinia: function(query) {
+    var matched = null;
+
+    matched = query.match(/^type:'(.+)'$/);
+    if (matched) {
+      return 'type:"' + matched[1] + '"';
+    }
+
+    matched = query.match(/^\(and '([^']+)' type:'(.+)'\)$/);
+    if (matched) {
+      return '"' + matched[1] + '" type:"' + matched[2] + '"';
+    }
+
+    matched = query.match(/^\(and (.+) type:'(.+)'\)$/);
+    if (matched) {
+      return matched[1] + ' type:"' + matched[2] + '"';
+    }
+
+    return null;
+  }
+};
+
+exports.BooleanQueryTranslator = BooleanQueryTranslator;

  Added: test/bq-translator.test.js (+16 -0) 100644
===================================================================
--- /dev/null
+++ test/bq-translator.test.js    2012-07-26 16:30:50 +0900 (747c170)
@@ -0,0 +1,16 @@
+var assert = require('chai').assert;
+
+var BooleanQueryTranslator = require('../lib/bq-translator').BooleanQueryTranslator;
+
+function testBooleanQueryTranslator(expected, query) {
+  test('translating query ' + query + ' -> ' + expected, function() {
+    var translator = new BooleanQueryTranslator();
+    assert.equal(expected, translator.translateTinia(query));
+  });
+}
+
+suite('BoolanQueryTranslator', function() {
+  testBooleanQueryTranslator('type:"ModelName"', "type:'ModelName'");
+  testBooleanQueryTranslator('query query type:"ModelName"', "(and query query type:'ModelName')");
+  testBooleanQueryTranslator('"query query" type:"ModelName"', "(and 'query query' type:'ModelName')");
+})
-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
Download 



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