null+****@clear*****
null+****@clear*****
2011年 10月 27日 (木) 12:18:31 JST
Kouhei Sutou 2011-10-27 03:18:31 +0000 (Thu, 27 Oct 2011)
New Revision: f4ff9c1b19b02bdab13f5d0bd6bf1c2e89d7bb81
Log:
support '*D+', '*D-', '*DOR' operator in boolean mode. refs #657
Added files:
test/sql/groonga_storage/r/fulltext_boolean_mode_pragma_default_operator.result
test/sql/groonga_storage/t/fulltext_boolean_mode_pragma_default_operator.test
test/sql/groonga_wrapper/r/fulltext_boolean_mode_pragma_default_operator.result
test/sql/groonga_wrapper/t/fulltext_boolean_mode_pragma_default_operator.test
Modified files:
ha_mroonga.cc
Modified: ha_mroonga.cc (+30 -1)
===================================================================
--- ha_mroonga.cc 2011-10-27 02:49:04 +0000 (4797056)
+++ ha_mroonga.cc 2011-10-27 03:18:31 +0000 (dd2196f)
@@ -5252,7 +5252,36 @@ FT_INFO *ha_mroonga::generic_ft_init_ext(uint flags, uint key_nr, String *key)
if (flags & FT_BOOL) {
const char *keyword = key->ptr();
uint keyword_length = key->length();
+ grn_operator default_operator = GRN_OP_OR;
+ // WORKAROUND: support only '*D+', '*D-' and '*DOR' pragma.
+ if (keyword_length > 0) {
+ if (keyword[0] == '*' && keyword_length > 1) {
+ switch (keyword[1]) {
+ case 'D':
+ if (keyword_length > 2 && keyword[2] == '+') {
+ default_operator = GRN_OP_AND;
+ keyword += 3;
+ keyword_length -= 3;
+ } else if (keyword_length > 2 && keyword[2] == '-') {
+ default_operator = GRN_OP_OR;
+ keyword += 3;
+ keyword_length -= 3;
+ } else if (keyword_length > 3 && memcmp(keyword + 2, "OR", 2) == 0) {
+ default_operator = GRN_OP_OR;
+ keyword += 4;
+ keyword_length -= 4;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
// WORKAROUND: ignore the first '+' to support "+apple macintosh" pattern.
+ while (keyword_length > 0 && keyword[0] == ' ') {
+ keyword++;
+ keyword_length--;
+ }
if (keyword_length > 0 && keyword[0] == '+') {
keyword++;
keyword_length--;
@@ -5261,7 +5290,7 @@ FT_INFO *ha_mroonga::generic_ft_init_ext(uint flags, uint key_nr, String *key)
grn_rc rc;
rc = grn_expr_parse(info->ctx, expression,
keyword, keyword_length,
- match_columns, GRN_OP_MATCH, GRN_OP_OR,
+ match_columns, GRN_OP_MATCH, default_operator,
expression_flags);
// TODO: check rc
grn_table_select(info->ctx, info->table, expression,
Added: test/sql/groonga_storage/r/fulltext_boolean_mode_pragma_default_operator.result (+45 -0) 100644
===================================================================
--- /dev/null
+++ test/sql/groonga_storage/r/fulltext_boolean_mode_pragma_default_operator.result 2011-10-27 03:18:31 +0000 (c1e4298)
@@ -0,0 +1,45 @@
+drop table if exists diaries;
+set names utf8;
+create table diaries (
+id int primary key,
+title varchar(255),
+content text,
+fulltext index (content)
+) default charset utf8;
+show create table diaries;
+Table Create Table
+diaries CREATE TABLE `diaries` (
+ `id` int(11) NOT NULL,
+ `title` varchar(255) DEFAULT NULL,
+ `content` text,
+ PRIMARY KEY (`id`),
+ FULLTEXT KEY `content` (`content`)
+) ENGINE=groonga DEFAULT CHARSET=utf8
+insert into diaries values(1, "Hello", "今日からはじめました。");
+insert into diaries values(2, "天気", "明日の富士山の天気について");
+insert into diaries values(3, "富士山", "今日も天気がよくてきれいに見える。");
+select * from diaries where match(content) against("今日 天気" in boolean mode);
+id title content
+1 Hello 今日からはじめました。
+3 富士山 今日も天気がよくてきれいに見える。
+2 天気 明日の富士山の天気について
+select * from diaries where match(content) against("*D+ 今日 天気" in boolean mode);
+id title content
+3 富士山 今日も天気がよくてきれいに見える。
+select * from diaries where match(content) against("*D- 今日 天気" in boolean mode);
+id title content
+1 Hello 今日からはじめました。
+3 富士山 今日も天気がよくてきれいに見える。
+2 天気 明日の富士山の天気について
+select * from diaries where match(content) against("*D- +今日 +天気" in boolean mode);
+id title content
+3 富士山 今日も天気がよくてきれいに見える。
+select * from diaries where match(content) against("*DOR 今日 天気" in boolean mode);
+id title content
+1 Hello 今日からはじめました。
+3 富士山 今日も天気がよくてきれいに見える。
+2 天気 明日の富士山の天気について
+select * from diaries where match(content) against("*DOR +今日 +天気" in boolean mode);
+id title content
+3 富士山 今日も天気がよくてきれいに見える。
+drop table diaries;
Added: test/sql/groonga_storage/t/fulltext_boolean_mode_pragma_default_operator.test (+48 -0) 100644
===================================================================
--- /dev/null
+++ test/sql/groonga_storage/t/fulltext_boolean_mode_pragma_default_operator.test 2011-10-27 03:18:31 +0000 (299ca78)
@@ -0,0 +1,48 @@
+# Copyright(C) 2011 Kouhei Sutou <kou****@clear*****>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+--source suite/groonga_include/groonga_init.inc
+
+--disable_warnings
+drop table if exists diaries;
+--enable_warnings
+
+set names utf8;
+create table diaries (
+ id int primary key,
+ title varchar(255),
+ content text,
+ fulltext index (content)
+) default charset utf8;
+show create table diaries;
+
+insert into diaries values(1, "Hello", "今日からはじめました。");
+insert into diaries values(2, "天気", "明日の富士山の天気について");
+insert into diaries values(3, "富士山", "今日も天気がよくてきれいに見える。");
+
+select * from diaries where match(content) against("今日 天気" in boolean mode);
+
+select * from diaries where match(content) against("*D+ 今日 天気" in boolean mode);
+
+select * from diaries where match(content) against("*D- 今日 天気" in boolean mode);
+select * from diaries where match(content) against("*D- +今日 +天気" in boolean mode);
+
+select * from diaries where match(content) against("*DOR 今日 天気" in boolean mode);
+select * from diaries where match(content) against("*DOR +今日 +天気" in boolean mode);
+
+drop table diaries;
+
+--source suite/groonga_include/groonga_deinit.inc
Added: test/sql/groonga_wrapper/r/fulltext_boolean_mode_pragma_default_operator.result (+45 -0) 100644
===================================================================
--- /dev/null
+++ test/sql/groonga_wrapper/r/fulltext_boolean_mode_pragma_default_operator.result 2011-10-27 03:18:31 +0000 (42ebf8f)
@@ -0,0 +1,45 @@
+drop table if exists diaries;
+set names utf8;
+create table diaries (
+id int primary key,
+title varchar(255),
+content text,
+fulltext index (content)
+) default charset utf8 comment = 'engine "innodb"';
+show create table diaries;
+Table Create Table
+diaries CREATE TABLE `diaries` (
+ `id` int(11) NOT NULL,
+ `title` varchar(255) DEFAULT NULL,
+ `content` text,
+ PRIMARY KEY (`id`),
+ FULLTEXT KEY `content` (`content`)
+) ENGINE=groonga DEFAULT CHARSET=utf8 COMMENT='engine "innodb"'
+insert into diaries values(1, "Hello", "今日からはじめました。");
+insert into diaries values(2, "天気", "明日の富士山の天気について");
+insert into diaries values(3, "富士山", "今日も天気がよくてきれいに見える。");
+select * from diaries where match(content) against("今日 天気" in boolean mode);
+id title content
+1 Hello 今日からはじめました。
+3 富士山 今日も天気がよくてきれいに見える。
+2 天気 明日の富士山の天気について
+select * from diaries where match(content) against("*D+ 今日 天気" in boolean mode);
+id title content
+3 富士山 今日も天気がよくてきれいに見える。
+select * from diaries where match(content) against("*D- 今日 天気" in boolean mode);
+id title content
+1 Hello 今日からはじめました。
+3 富士山 今日も天気がよくてきれいに見える。
+2 天気 明日の富士山の天気について
+select * from diaries where match(content) against("*D- +今日 +天気" in boolean mode);
+id title content
+3 富士山 今日も天気がよくてきれいに見える。
+select * from diaries where match(content) against("*DOR 今日 天気" in boolean mode);
+id title content
+1 Hello 今日からはじめました。
+3 富士山 今日も天気がよくてきれいに見える。
+2 天気 明日の富士山の天気について
+select * from diaries where match(content) against("*DOR +今日 +天気" in boolean mode);
+id title content
+3 富士山 今日も天気がよくてきれいに見える。
+drop table diaries;
Added: test/sql/groonga_wrapper/t/fulltext_boolean_mode_pragma_default_operator.test (+48 -0) 100644
===================================================================
--- /dev/null
+++ test/sql/groonga_wrapper/t/fulltext_boolean_mode_pragma_default_operator.test 2011-10-27 03:18:31 +0000 (5c6874b)
@@ -0,0 +1,48 @@
+# Copyright(C) 2011 Kouhei Sutou <kou****@clear*****>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+--source suite/groonga_include/groonga_init.inc
+
+--disable_warnings
+drop table if exists diaries;
+--enable_warnings
+
+set names utf8;
+create table diaries (
+ id int primary key,
+ title varchar(255),
+ content text,
+ fulltext index (content)
+) default charset utf8 comment = 'engine "innodb"';
+show create table diaries;
+
+insert into diaries values(1, "Hello", "今日からはじめました。");
+insert into diaries values(2, "天気", "明日の富士山の天気について");
+insert into diaries values(3, "富士山", "今日も天気がよくてきれいに見える。");
+
+select * from diaries where match(content) against("今日 天気" in boolean mode);
+
+select * from diaries where match(content) against("*D+ 今日 天気" in boolean mode);
+
+select * from diaries where match(content) against("*D- 今日 天気" in boolean mode);
+select * from diaries where match(content) against("*D- +今日 +天気" in boolean mode);
+
+select * from diaries where match(content) against("*DOR 今日 天気" in boolean mode);
+select * from diaries where match(content) against("*DOR +今日 +天気" in boolean mode);
+
+drop table diaries;
+
+--source suite/groonga_include/groonga_deinit.inc