null+****@clear*****
null+****@clear*****
2012年 7月 27日 (金) 17:07:40 JST
Kouhei Sutou 2012-07-27 17:07:40 +0900 (Fri, 27 Jul 2012) New Revision: 4a281a33a4e5641221c9235ae32320f31bbb21d2 https://github.com/groonga/gcs/commit/4a281a33a4e5641221c9235ae32320f31bbb21d2 Log: BqTranslator: support (or ...) Modified files: lib/bq-translator.js test/bq-translator.test.js Modified: lib/bq-translator.js (+27 -1) =================================================================== --- lib/bq-translator.js 2012-07-27 17:05:10 +0900 (ce81495) +++ lib/bq-translator.js 2012-07-27 17:07:40 +0900 (3c707fe) @@ -38,7 +38,19 @@ BooleanQueryTranslator.prototype = { operator += character; } else if (character == " ") { this.skipSpaces(query, context); - var expression = this.translateGroupAnd(query, context); + var expression; + switch (operator) { + case "and": + expression = this.translateGroupAnd(query, context); + break; + case "or": + expression = this.translateGroupOr(query, context); + break; + default: + // TODO: report error: unknown operator + return ""; + break; + } this.skipSpaces(query, context); if (query[context.offset] != ")") { // TODO: report error: have garbage @@ -72,6 +84,20 @@ BooleanQueryTranslator.prototype = { // TODO: report error: missing close paren <)> return ""; }, + translateGroupOr: function(query, context) { + var expressions = []; + while (context.offset < query.length) { + this.skipSpaces(query, context); + if (query[context.offset] == ")") { + return "(" + expressions.join(" || ") + ")"; + } else { + expressions.push(this.translateExpression(query, context)); + } + } + + // TODO: report error: missing close paren <)> + return ""; + }, translateExpression: function(query, context) { var startOffset = context.offset; var field; Modified: test/bq-translator.test.js (+4 -0) =================================================================== --- test/bq-translator.test.js 2012-07-27 17:05:10 +0900 (f333a63) +++ test/bq-translator.test.js 2012-07-27 17:07:40 +0900 (7080c73) @@ -69,6 +69,10 @@ suite('BoolanQueryTranslator', function() { "field1 @ \"keyword1\" && field2 @ \"keyword2\"", "(and field1:'keyword1' field2:'keyword2')".length, "(and field1:'keyword1' field2:'keyword2') (other group)"); + testGroup("or", + "(field1 @ \"keyword1\" || field2 @ \"keyword2\")", + "(or field1:'keyword1' field2:'keyword2')".length, + "(or field1:'keyword1' field2:'keyword2') (other group)"); testExpression("value only: stirng: keywords", "field @ \"keyword1\" && field @ \"keyword2\"", -------------- next part -------------- HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...Download