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