null+****@clear*****
null+****@clear*****
2012年 8月 6日 (月) 14:36:06 JST
Kouhei Sutou 2012-08-06 14:36:06 +0900 (Mon, 06 Aug 2012) New Revision: 6f917580416e3a7bb162a61b1272d7fd979e2266 https://github.com/groonga/gcs/commit/6f917580416e3a7bb162a61b1272d7fd979e2266 Log: bq: support multi phrase in a string Modified files: lib/bq-translator.js Modified: lib/bq-translator.js (+16 -23) =================================================================== --- lib/bq-translator.js 2012-08-06 14:16:42 +0900 (f1db762) +++ lib/bq-translator.js 2012-08-06 14:36:06 +0900 (3656d67) @@ -225,39 +225,43 @@ BooleanQueryTranslator.prototype = { if (this.query[this.offset] != "'") { this.throwTranslateError("open single quote for string value is missing"); } - if (this.query[this.offset + 1] == "\"") { - return this.translateExpressionValuePhrase(field); - } - this.offset++; + var tokens = []; var value = ""; for (; this.offset < this.query.length; this.offset++) { var character = this.query[this.offset]; if (character == "'") { this.offset++; - tokens.push(this.translateExpressionValueStringKeyword(field, value)); + if (value.length > 0) { + tokens.push(this.translateExpressionValueStringKeyword(field, value)); + } return tokens.join(" "); } if (character == " " || character == "+") { if (value.length > 0) { tokens.push(this.translateExpressionValueStringKeyword(field, value)); - tokens.push("&&"); value = ""; } + tokens.push("&&"); } else if (character == "|") { if (value.length > 0) { tokens.push(this.translateExpressionValueStringKeyword(field, value)); - tokens.push("||"); value = ""; } + tokens.push("||"); } else if (character == "\\") { this.offset++; + // TODO: check length character = this.query[this.offset]; value += character; } else if (character == "\"") { - value += "\\\""; + if (value.length > 0) { + this.throwTranslateError("TODO"); + } + tokens.push(this.translateExpressionValuePhrase(field)); + this.offset--; } else { value += character; } @@ -274,32 +278,21 @@ BooleanQueryTranslator.prototype = { return field + " " + operator + " " + "\"" + value + "\""; }, translateExpressionValuePhrase: function(field) { - if (!(this.query[this.offset] == "'" && - this.query[this.offset + 1] == "\"")) { - // TODO: report error - return ""; + if (this.query[this.offset] != "\"") { + this.throwTranslateError("open double quote for phrase value is missing"); } - this.offset += 2; + this.offset += 1; var value = ""; for (; this.offset < this.query.length; this.offset++) { var character = this.query[this.offset]; - if (character == "'") { - // TODO: report error: missing close quote <"> - return ""; - } - if (character == "\\") { this.offset++; + // TODO: check length character = this.query[this.offset]; value += character; } else if (character == "\"") { this.offset++; - if (this.query[this.offset] != "'") { - // TODO: report error: missing close quote <'> after <"> - return ""; - } - this.offset++; return field + " @ " + "\"" + value + "\""; } else { value += character; -------------- next part -------------- HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...Download