null+****@clear*****
null+****@clear*****
2011年 11月 6日 (日) 17:37:14 JST
Kentoku 2011-11-06 08:37:14 +0000 (Sun, 06 Nov 2011)
New Revision: d6768325653c26691b82f0a2a4a091ca529287a4
Log:
fix update/delete operation using spatial index for wrapper mode. refs #1156
Modified files:
ha_mroonga.cc
test/sql/groonga_wrapper/r/geometry_contains.result
test/sql/groonga_wrapper/r/geometry_delete.result
test/sql/groonga_wrapper/r/geometry_update.result
test/sql/groonga_wrapper/t/geometry_contains.test
test/sql/groonga_wrapper/t/geometry_delete.test
test/sql/groonga_wrapper/t/geometry_update.test
Modified: ha_mroonga.cc (+67 -6)
===================================================================
--- ha_mroonga.cc 2011-11-03 15:39:33 +0000 (ac2221a)
+++ ha_mroonga.cc 2011-11-06 08:37:14 +0000 (cfaeb35)
@@ -4354,14 +4354,15 @@ ha_rows ha_mroonga::generic_records_in_range_geo(uint key_nr,
ha_rows ha_mroonga::records_in_range(uint key_nr, key_range *range_min, key_range *range_max)
{
MRN_DBUG_ENTER_METHOD();
- int error = 0;
+ ha_rows row_count = 0;
if (share->wrapper_mode)
{
- error = wrapper_records_in_range(key_nr, range_min, range_max);
+ row_count = wrapper_records_in_range(key_nr, range_min, range_max);
} else {
- error = storage_records_in_range(key_nr, range_min, range_max);
+ row_count = storage_records_in_range(key_nr, range_min, range_max);
}
- DBUG_RETURN(error);
+ DBUG_PRINT("info", ("mroonga row_count=%d", row_count));
+ DBUG_RETURN(row_count);
}
int ha_mroonga::wrapper_index_init(uint idx, bool sorted)
@@ -4371,7 +4372,8 @@ int ha_mroonga::wrapper_index_init(uint idx, bool sorted)
MRN_DBUG_ENTER_METHOD();
MRN_SET_WRAP_SHARE_KEY(share, table->s);
MRN_SET_WRAP_TABLE_KEY(this, table);
- if (key_info.algorithm != HA_KEY_ALG_FULLTEXT) {
+ if (!mrn_is_geo_key(&key_info) && key_info.algorithm != HA_KEY_ALG_FULLTEXT)
+ {
error = wrap_handler->ha_index_init(share->wrap_key_nr[idx], sorted);
} else {
error = wrap_handler->ha_index_init(share->wrap_primary_key, sorted);
@@ -4586,6 +4588,7 @@ int ha_mroonga::index_read_map(uchar *buf, const uchar *key,
} else {
error = storage_index_read_map(buf, key, keypart_map, find_flag);
}
+ DBUG_PRINT("info", ("mroonga error=%d", error));
DBUG_RETURN(error);
}
@@ -4952,6 +4955,16 @@ int ha_mroonga::wrapper_read_range_first(const key_range *start_key,
{
int error = 0;
MRN_DBUG_ENTER_METHOD();
+ KEY key_info = table->key_info[active_index];
+ if (mrn_is_geo_key(&key_info)) {
+ clear_cursor();
+ clear_cursor_geo();
+ error = generic_geo_open_cursor(start_key->key, start_key->flag);
+ if (!error) {
+ error = wrapper_get_next_record(table->record[0]);
+ }
+ DBUG_RETURN(error);
+ }
MRN_SET_WRAP_SHARE_KEY(share, table->s);
MRN_SET_WRAP_TABLE_KEY(this, table);
if (fulltext_searching)
@@ -5095,6 +5108,11 @@ int ha_mroonga::wrapper_read_range_next()
{
int error = 0;
MRN_DBUG_ENTER_METHOD();
+ KEY key_info = table->key_info[active_index];
+ if (mrn_is_geo_key(&key_info)) {
+ error = wrapper_get_next_record(table->record[0]);
+ DBUG_RETURN(error);
+ }
MRN_SET_WRAP_SHARE_KEY(share, table->s);
MRN_SET_WRAP_TABLE_KEY(this, table);
if (fulltext_searching)
@@ -6216,6 +6234,12 @@ ha_rows ha_mroonga::wrapper_multi_range_read_info_const(uint keyno,
{
MRN_DBUG_ENTER_METHOD();
ha_rows rows;
+ KEY key_info = table->key_info[keyno];
+ if (mrn_is_geo_key(&key_info)) {
+ rows = handler::multi_range_read_info_const(keyno, seq, seq_init_param,
+ n_ranges, bufsz, flags, cost);
+ DBUG_RETURN(rows);
+ }
MRN_SET_WRAP_SHARE_KEY(share, table->s);
MRN_SET_WRAP_TABLE_KEY(this, table);
if (fulltext_searching)
@@ -6237,7 +6261,8 @@ ha_rows ha_mroonga::storage_multi_range_read_info_const(uint keyno,
COST_VECT *cost)
{
MRN_DBUG_ENTER_METHOD();
- ha_rows rows = handler::multi_range_read_info_const(keyno, seq, seq_init_param,
+ ha_rows rows = handler::multi_range_read_info_const(keyno, seq,
+ seq_init_param,
n_ranges, bufsz, flags,
cost);
DBUG_RETURN(rows);
@@ -6273,6 +6298,15 @@ ha_rows ha_mroonga::wrapper_multi_range_read_info(uint keyno, uint n_ranges,
{
MRN_DBUG_ENTER_METHOD();
ha_rows rows;
+ KEY key_info = table->key_info[keyno];
+ if (mrn_is_geo_key(&key_info)) {
+ rows = handler::multi_range_read_info(keyno, n_ranges, keys,
+#ifdef MRN_HANDLER_HAVE_MULTI_RANGE_READ_INFO_KEY_PARTS
+ key_parts,
+#endif
+ bufsz, flags, cost);
+ DBUG_RETURN(rows);
+ }
MRN_SET_WRAP_SHARE_KEY(share, table->s);
MRN_SET_WRAP_TABLE_KEY(this, table);
if (fulltext_searching)
@@ -6337,6 +6371,12 @@ int ha_mroonga::wrapper_multi_range_read_init(RANGE_SEQ_IF *seq,
{
MRN_DBUG_ENTER_METHOD();
int error = 0;
+ KEY key_info = table->key_info[active_index];
+ if (mrn_is_geo_key(&key_info)) {
+ error = handler::multi_range_read_init(seq, seq_init_param,
+ n_ranges, mode, buf);
+ DBUG_RETURN(error);
+ }
MRN_SET_WRAP_SHARE_KEY(share, table->s);
MRN_SET_WRAP_TABLE_KEY(this, table);
if (fulltext_searching)
@@ -6380,6 +6420,11 @@ int ha_mroonga::wrapper_multi_range_read_next(range_id_t *range_info)
{
MRN_DBUG_ENTER_METHOD();
int error = 0;
+ KEY key_info = table->key_info[active_index];
+ if (mrn_is_geo_key(&key_info)) {
+ error = handler::multi_range_read_next(range_info);
+ DBUG_RETURN(error);
+ }
MRN_SET_WRAP_SHARE_KEY(share, table->s);
MRN_SET_WRAP_TABLE_KEY(this, table);
if (fulltext_searching)
@@ -6418,6 +6463,12 @@ int ha_mroonga::wrapper_read_multi_range_first(KEY_MULTI_RANGE **found_range_p,
{
int error = 0;
MRN_DBUG_ENTER_METHOD();
+ KEY key_info = table->key_info[active_index];
+ if (mrn_is_geo_key(&key_info)) {
+ error = handler::read_multi_range_first(found_range_p, ranges,
+ range_count, sorted, buffer);
+ DBUG_RETURN(error);
+ }
MRN_SET_WRAP_SHARE_KEY(share, table->s);
MRN_SET_WRAP_TABLE_KEY(this, table);
if (fulltext_searching)
@@ -6464,6 +6515,11 @@ int ha_mroonga::wrapper_read_multi_range_next(KEY_MULTI_RANGE **found_range_p)
{
int error = 0;
MRN_DBUG_ENTER_METHOD();
+ KEY key_info = table->key_info[active_index];
+ if (mrn_is_geo_key(&key_info)) {
+ error = handler::read_multi_range_next(found_range_p);
+ DBUG_RETURN(error);
+ }
MRN_SET_WRAP_SHARE_KEY(share, table->s);
MRN_SET_WRAP_TABLE_KEY(this, table);
if (fulltext_searching)
@@ -6653,6 +6709,11 @@ double ha_mroonga::wrapper_read_time(uint index, uint ranges, ha_rows rows)
{
double res;
MRN_DBUG_ENTER_METHOD();
+ KEY key_info = table->key_info[index];
+ if (mrn_is_geo_key(&key_info)) {
+ res = handler::read_time(index, ranges, rows);
+ DBUG_RETURN(res);
+ }
MRN_SET_WRAP_SHARE_KEY(share, table->s);
MRN_SET_WRAP_TABLE_KEY(this, table);
res = wrap_handler->read_time(share->wrap_key_nr[index], ranges, rows);
Modified: test/sql/groonga_wrapper/r/geometry_contains.result (+1 -1)
===================================================================
--- test/sql/groonga_wrapper/r/geometry_contains.result 2011-11-03 15:39:33 +0000 (2ae5f67)
+++ test/sql/groonga_wrapper/r/geometry_contains.result 2011-11-06 08:37:14 +0000 (088c59e)
@@ -1,4 +1,4 @@
-drop table if exists diaries;
+drop table if exists shops;
create table shops (
id int primary key auto_increment,
name text,
Modified: test/sql/groonga_wrapper/r/geometry_delete.result (+1 -1)
===================================================================
--- test/sql/groonga_wrapper/r/geometry_delete.result 2011-11-03 15:39:33 +0000 (5ef931f)
+++ test/sql/groonga_wrapper/r/geometry_delete.result 2011-11-06 08:37:14 +0000 (9ab2162)
@@ -1,4 +1,4 @@
-drop table if exists diaries;
+drop table if exists shops;
create table shops (
id int primary key auto_increment,
name text,
Modified: test/sql/groonga_wrapper/r/geometry_update.result (+1 -1)
===================================================================
--- test/sql/groonga_wrapper/r/geometry_update.result 2011-11-03 15:39:33 +0000 (d985f4b)
+++ test/sql/groonga_wrapper/r/geometry_update.result 2011-11-06 08:37:14 +0000 (9d43b7b)
@@ -1,4 +1,4 @@
-drop table if exists diaries;
+drop table if exists shops;
create table shops (
id int primary key auto_increment,
name text,
Modified: test/sql/groonga_wrapper/t/geometry_contains.test (+1 -1)
===================================================================
--- test/sql/groonga_wrapper/t/geometry_contains.test 2011-11-03 15:39:33 +0000 (75ea56f)
+++ test/sql/groonga_wrapper/t/geometry_contains.test 2011-11-06 08:37:14 +0000 (6470265)
@@ -17,7 +17,7 @@
--source suite/groonga_include/groonga_init.inc
--disable_warnings
-drop table if exists diaries;
+drop table if exists shops;
--enable_warnings
create table shops (
Modified: test/sql/groonga_wrapper/t/geometry_delete.test (+1 -1)
===================================================================
--- test/sql/groonga_wrapper/t/geometry_delete.test 2011-11-03 15:39:33 +0000 (1d120e2)
+++ test/sql/groonga_wrapper/t/geometry_delete.test 2011-11-06 08:37:14 +0000 (4c96e7f)
@@ -17,7 +17,7 @@
--source suite/groonga_include/groonga_init.inc
--disable_warnings
-drop table if exists diaries;
+drop table if exists shops;
--enable_warnings
create table shops (
Modified: test/sql/groonga_wrapper/t/geometry_update.test (+1 -1)
===================================================================
--- test/sql/groonga_wrapper/t/geometry_update.test 2011-11-03 15:39:33 +0000 (3e79891)
+++ test/sql/groonga_wrapper/t/geometry_update.test 2011-11-06 08:37:14 +0000 (7b194bc)
@@ -17,7 +17,7 @@
--source suite/groonga_include/groonga_init.inc
--disable_warnings
-drop table if exists diaries;
+drop table if exists shops;
--enable_warnings
create table shops (