null+****@clear*****
null+****@clear*****
2011年 10月 3日 (月) 19:24:47 JST
Kouhei Sutou 2011-10-03 10:24:47 +0000 (Mon, 03 Oct 2011) New Revision: cad8ac53329f3cbbe217723c856f2fa1658b8e95 Log: [wrapper] support records_in_range for spatial index. Modified files: ha_mroonga.cc ha_mroonga.h Modified: ha_mroonga.cc (+15 -10) =================================================================== --- ha_mroonga.cc 2011-10-03 10:17:40 +0000 (ccc35e5) +++ ha_mroonga.cc 2011-10-03 10:24:47 +0000 (3eb160b) @@ -3991,11 +3991,16 @@ ha_rows ha_mroonga::wrapper_records_in_range(uint key_nr, key_range *range_min, { ha_rows row_count; MRN_DBUG_ENTER_METHOD(); - MRN_SET_WRAP_SHARE_KEY(share, table->s); - MRN_SET_WRAP_TABLE_KEY(this, table); - row_count = wrap_handler->records_in_range(key_nr, range_min, range_max); - MRN_SET_BASE_SHARE_KEY(share, table->s); - MRN_SET_BASE_TABLE_KEY(this, table); + KEY key_info = table->s->key_info[key_nr]; + if (mrn_is_geo_key(&key_info)) { + row_count = generic_records_in_range_geo(key_nr, range_min, range_max); + } else { + MRN_SET_WRAP_SHARE_KEY(share, table->s); + MRN_SET_WRAP_TABLE_KEY(this, table); + row_count = wrap_handler->records_in_range(key_nr, range_min, range_max); + MRN_SET_BASE_SHARE_KEY(share, table->s); + MRN_SET_BASE_TABLE_KEY(this, table); + } DBUG_RETURN(row_count); } @@ -4037,7 +4042,7 @@ ha_rows ha_mroonga::storage_records_in_range(uint key_nr, key_range *range_min, } } } else if (mrn_is_geo_key(&key_info)) { - row_count = storage_records_in_range_geo(key_nr, range_min, range_max); + row_count = generic_records_in_range_geo(key_nr, range_min, range_max); DBUG_RETURN(row_count); } else { KEY_PART_INFO key_part = key_info.key_part[0]; @@ -4106,7 +4111,7 @@ ha_rows ha_mroonga::storage_records_in_range(uint key_nr, key_range *range_min, DBUG_RETURN(row_count); } -ha_rows ha_mroonga::storage_records_in_range_geo(uint key_nr, +ha_rows ha_mroonga::generic_records_in_range_geo(uint key_nr, key_range *range_min, key_range *range_max) { @@ -4127,7 +4132,7 @@ ha_rows ha_mroonga::storage_records_in_range_geo(uint key_nr, DBUG_RETURN(row_count); } - grn_obj *result = storage_geo_select_in_rectangle(grn_index_columns[key_nr], + grn_obj *result = generic_geo_select_in_rectangle(grn_index_columns[key_nr], range_min->key); row_count = grn_table_size(ctx, result); grn_obj_unlink(ctx, result); @@ -4345,7 +4350,7 @@ int ha_mroonga::storage_index_read_map_geo(uchar *buf, const uchar *key, int error = 0; int flags = 0; if (find_flag & HA_READ_MBR_CONTAIN) { - result_geo = storage_geo_select_in_rectangle(grn_index_columns[active_index], + result_geo = generic_geo_select_in_rectangle(grn_index_columns[active_index], key); // TODO: check result cursor = grn_table_cursor_open(ctx, result_geo, NULL, 0, NULL, 0, @@ -5407,7 +5412,7 @@ int ha_mroonga::storage_get_next_record(uchar *buf) DBUG_RETURN(0); } -grn_obj *ha_mroonga::storage_geo_select_in_rectangle(grn_obj *index_column, +grn_obj *ha_mroonga::generic_geo_select_in_rectangle(grn_obj *index_column, const uchar *rectangle) { double locations[4]; Modified: ha_mroonga.h (+2 -2) =================================================================== --- ha_mroonga.h 2011-10-03 10:17:40 +0000 (b0c6d64) +++ ha_mroonga.h 2011-10-03 10:24:47 +0000 (5118290) @@ -333,7 +333,7 @@ private: void clear_search_result(); grn_obj *find_tokenizer(const char *name, int name_length); int storage_get_next_record(uchar *buf); - grn_obj *storage_geo_select_in_rectangle(grn_obj *index_column, + grn_obj *generic_geo_select_in_rectangle(grn_obj *index_column, const uchar *rectangle); #ifdef MRN_HANDLER_HAVE_HA_CLOSE @@ -439,7 +439,7 @@ private: key_range *range_max); ha_rows storage_records_in_range(uint key_nr, key_range *range_min, key_range *range_max); - ha_rows storage_records_in_range_geo(uint key_nr, key_range *range_min, + ha_rows generic_records_in_range_geo(uint key_nr, key_range *range_min, key_range *range_max); int wrapper_index_init(uint idx, bool sorted); int storage_index_init(uint idx, bool sorted);