null+****@clear*****
null+****@clear*****
2011年 9月 25日 (日) 02:54:24 JST
Kentoku 2011-09-24 17:54:24 +0000 (Sat, 24 Sep 2011)
New Revision: 7c99bc07265f1d4bc0d6155380245202ac0e4185
Log:
#592 add choosable parser
Modified files:
ha_mroonga.cc
ha_mroonga.h
mrn_table.cc
mrn_table.h
Modified: ha_mroonga.cc (+29 -8)
===================================================================
--- ha_mroonga.cc 2011-09-24 14:24:53 +0000 (e1a4b9f)
+++ ha_mroonga.cc 2011-09-24 17:54:24 +0000 (3da1a2e)
@@ -1397,7 +1397,8 @@ int ha_mroonga::wrapper_create_index_table(grn_obj *grn_table,
const char *grn_table_name,
int i,
KEY *key_info,
- grn_obj **index_tables)
+ grn_obj **index_tables,
+ MRN_SHARE *tmp_share)
{
MRN_DBUG_ENTER_METHOD();
@@ -1430,7 +1431,8 @@ int ha_mroonga::wrapper_create_index_table(grn_obj *grn_table,
index_tables[i] = index_table;
grn_info_type info_type = GRN_INFO_DEFAULT_TOKENIZER;
- grn_obj *token_type = grn_ctx_at(ctx, GRN_DB_BIGRAM);
+ grn_obj *token_type = grn_ctx_get(ctx, tmp_share->key_parser[i],
+ tmp_share->key_parser_length[i]);
grn_obj_set_info(ctx, index_table, info_type, token_type);
grn_obj_unlink(ctx, token_type);
@@ -1495,7 +1497,7 @@ int ha_mroonga::wrapper_create_index(const char *name, TABLE *table,
}
error = wrapper_create_index_table(grn_table, grn_table_name, i, &key_info,
- index_tables);
+ index_tables, tmp_share);
if (error)
{
break;
@@ -1627,7 +1629,7 @@ int ha_mroonga::storage_create(const char *name, TABLE *table,
}
}
- error = storage_create_index(table, tbl_name, tbl_obj);
+ error = storage_create_index(table, tbl_name, tbl_obj, tmp_share);
if (error) {
grn_obj_remove(ctx, tbl_obj);
tbl_obj = NULL;
@@ -1721,7 +1723,7 @@ int ha_mroonga::storage_create_validate_index(TABLE *table)
}
int ha_mroonga::storage_create_index(TABLE *table, const char *grn_table_name,
- grn_obj *grn_table)
+ grn_obj *grn_table, MRN_SHARE *tmp_share)
{
MRN_DBUG_ENTER_METHOD();
int error = 0;
@@ -1787,7 +1789,8 @@ int ha_mroonga::storage_create_index(TABLE *table, const char *grn_table_name,
if (key_alg == HA_KEY_ALG_FULLTEXT) {
grn_info_type info_type = GRN_INFO_DEFAULT_TOKENIZER;
- grn_obj *token_type = grn_ctx_at(ctx, GRN_DB_BIGRAM);
+ grn_obj *token_type = grn_ctx_get(ctx, tmp_share->key_parser[i],
+ tmp_share->key_parser_length[i]);
grn_obj_set_info(ctx, index_table, info_type, token_type);
}
@@ -6654,9 +6657,23 @@ int ha_mroonga::wrapper_add_index(TABLE *table_arg, KEY *key_info,
grn_obj *index_tables[num_of_keys + n_keys];
char grn_table_name[MRN_MAX_PATH_SIZE];
THD *thd = ha_thd();
+ MRN_SHARE *tmp_share;
+ char **key_parser;
+ uint *key_parser_length;
MRN_DBUG_ENTER_METHOD();
KEY *wrap_key_info = (KEY *) thd->alloc(sizeof(KEY) * num_of_keys);
KEY *p_key_info = &table->key_info[table_share->primary_key], *tmp_key_info;
+ if (!(tmp_share = (MRN_SHARE *)
+ my_multi_malloc(MYF(MY_WME | MY_ZEROFILL),
+ &tmp_share, sizeof(*tmp_share),
+ &key_parser, sizeof(char *) * (n_keys + num_of_keys),
+ &key_parser_length, sizeof(uint) * (n_keys + num_of_keys),
+ NullS))
+ ) {
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+ }
+ tmp_share->key_parser = key_parser;
+ tmp_share->key_parser_length = key_parser_length;
mrn_table_name_gen(share->table_name, grn_table_name);
hnd_add_index = NULL;
bitmap_clear_all(table->read_set);
@@ -6667,7 +6684,10 @@ int ha_mroonga::wrapper_add_index(TABLE *table_arg, KEY *key_info,
j++;
continue;
}
-
+ if ((res = mrn_add_index_param(tmp_share, &key_info[i], i + n_keys)))
+ {
+ break;
+ }
index_tables[i + n_keys] = NULL;
if ((res = wrapper_validate_key_info(&key_info[i])))
{
@@ -6675,7 +6695,8 @@ int ha_mroonga::wrapper_add_index(TABLE *table_arg, KEY *key_info,
}
if ((res = wrapper_create_index_table(grn_table, grn_table_name,
i + n_keys,
- &key_info[i], index_tables)))
+ &key_info[i], index_tables,
+ tmp_share)))
{
break;
}
Modified: ha_mroonga.h (+3 -2)
===================================================================
--- ha_mroonga.h 2011-09-24 14:24:53 +0000 (4254fcf)
+++ ha_mroonga.h 2011-09-24 17:54:24 +0000 (d957332)
@@ -345,13 +345,14 @@ private:
const char *grn_table_name,
int i,
KEY *key_info,
- grn_obj **index_tables);
+ grn_obj **index_tables,
+ MRN_SHARE *tmp_share);
int wrapper_create_index(const char *name, TABLE *table,
HA_CREATE_INFO *info, MRN_SHARE *tmp_share);
int storage_create_validate_pseudo_column(TABLE *table);
int storage_create_validate_index(TABLE *table);
int storage_create_index(TABLE *table, const char *grn_table_name,
- grn_obj *grn_table);
+ grn_obj *grn_table, MRN_SHARE *tmp_share);
int ensure_database_create(const char *name);
int ensure_database_open(const char *name);
int wrapper_delete_table(const char *name, MRN_SHARE *tmp_share,
Modified: mrn_table.cc (+163 -3)
===================================================================
--- mrn_table.cc 2011-09-24 14:24:53 +0000 (a7212e3)
+++ mrn_table.cc 2011-09-24 17:54:24 +0000 (d3b4406)
@@ -57,6 +57,8 @@
#define MRN_DEFAULT_LEN (sizeof(MRN_DEFAULT_STR) - 1)
#define MRN_GROONGA_STR "GROONGA"
#define MRN_GROONGA_LEN (sizeof(MRN_GROONGA_STR) - 1)
+#define MRN_DEFAULT_KEY_PARSER_STR "TokenBigram"
+#define MRN_DEFAULT_KEY_PARSER_LEN (sizeof(MRN_DEFAULT_KEY_PARSER_STR) - 1)
extern HASH mrn_open_tables;
extern pthread_mutex_t mrn_open_tables_mutex;
@@ -271,6 +273,28 @@ void mrn_get_partition_info(const char *table_name, uint table_name_length,
break; \
}
+#define MRN_PARAM_STR_LIST(title_name, param_name, param_pos) \
+ if (!strncasecmp(tmp_ptr, title_name, title_length)) \
+ { \
+ DBUG_PRINT("info", ("mroonga "title_name" start")); \
+ if (!share->param_name[param_pos]) \
+ { \
+ if ((share->param_name[param_pos] = mrn_get_string_between_quote( \
+ start_ptr, TRUE))) \
+ share->MRN_PARAM_STR_LEN(param_name)[param_pos] = \
+ strlen(share->param_name[param_pos]); \
+ else { \
+ error = ER_MRN_INVALID_TABLE_PARAM_NUM; \
+ my_printf_error(error, ER_MRN_INVALID_TABLE_PARAM_STR, \
+ MYF(0), tmp_ptr); \
+ goto error; \
+ } \
+ DBUG_PRINT("info", ("mroonga "title_name"[%d]=%s", param_pos, \
+ share->param_name[param_pos])); \
+ } \
+ break; \
+ }
+
int mrn_parse_table_param(MRN_SHARE *share, TABLE *table)
{
int i, error;
@@ -448,20 +472,149 @@ error_alloc_param_string:
DBUG_RETURN(error);
}
+int mrn_add_index_param(MRN_SHARE *share, KEY *key_info, int i)
+{
+ int error;
+ int title_length;
+ char *param_string = NULL;
+#if MYSQL_VERSION_ID >= 50500
+ char *sprit_ptr[2];
+ char *tmp_ptr, *tmp_ptr2, *start_ptr;
+#endif
+ DBUG_ENTER("mrn_add_index_param");
+
+#if MYSQL_VERSION_ID >= 50500
+ if (key_info->comment.length == 0)
+ {
+ if (
+ !(share->key_parser[i] = mrn_create_string(
+ MRN_DEFAULT_KEY_PARSER_STR,
+ MRN_DEFAULT_KEY_PARSER_LEN))
+ ) {
+ error = HA_ERR_OUT_OF_MEM;
+ goto error;
+ }
+ DBUG_RETURN(0);
+ }
+ DBUG_PRINT("info", ("mroonga create comment string"));
+ if (
+ !(param_string = mrn_create_string(
+ key_info->comment.str,
+ key_info->comment.length))
+ ) {
+ error = HA_ERR_OUT_OF_MEM;
+ goto error_alloc_param_string;
+ }
+ DBUG_PRINT("info", ("mroonga comment string=%s", param_string));
+
+ sprit_ptr[0] = param_string;
+ while (sprit_ptr[0])
+ {
+ if ((sprit_ptr[1] = strchr(sprit_ptr[0], ',')))
+ {
+ *sprit_ptr[1] = '\0';
+ sprit_ptr[1]++;
+ }
+ tmp_ptr = sprit_ptr[0];
+ sprit_ptr[0] = sprit_ptr[1];
+ while (*tmp_ptr == ' ' || *tmp_ptr == '\r' ||
+ *tmp_ptr == '\n' || *tmp_ptr == '\t')
+ tmp_ptr++;
+
+ if (*tmp_ptr == '\0')
+ continue;
+
+ title_length = 0;
+ start_ptr = tmp_ptr;
+ while (*start_ptr != ' ' && *start_ptr != '\'' &&
+ *start_ptr != '"' && *start_ptr != '\0' &&
+ *start_ptr != '\r' && *start_ptr != '\n' &&
+ *start_ptr != '\t')
+ {
+ title_length++;
+ start_ptr++;
+ }
+
+ switch (title_length)
+ {
+ case 0:
+ continue;
+ case 6:
+ MRN_PARAM_STR_LIST("parser", key_parser, i);
+ error = ER_MRN_INVALID_TABLE_PARAM_NUM;
+ my_printf_error(error, ER_MRN_INVALID_TABLE_PARAM_STR,
+ MYF(0), tmp_ptr);
+ goto error;
+ default:
+ error = ER_MRN_INVALID_TABLE_PARAM_NUM;
+ my_printf_error(error, ER_MRN_INVALID_TABLE_PARAM_STR,
+ MYF(0), tmp_ptr);
+ goto error;
+ }
+ }
+#endif
+ if (
+ !share->key_parser[i] &&
+ !(share->key_parser[i] = mrn_create_string(
+ MRN_DEFAULT_KEY_PARSER_STR,
+ MRN_DEFAULT_KEY_PARSER_LEN))
+ ) {
+ error = HA_ERR_OUT_OF_MEM;
+ goto error;
+ }
+
+ if (param_string)
+ my_free(param_string, MYF(0));
+ DBUG_RETURN(0);
+
+error:
+ if (param_string)
+ my_free(param_string, MYF(0));
+error_alloc_param_string:
+ DBUG_RETURN(error);
+}
+
+int mrn_parse_index_param(MRN_SHARE *share, TABLE *table)
+{
+ int i, error;
+ DBUG_ENTER("mrn_parse_index_param");
+ for (i = 0; i < table->s->keys; i++)
+ {
+ KEY *key_info = &table->s->key_info[i];
+
+ if (!(key_info->flags & HA_FULLTEXT)) {
+ continue;
+ }
+
+ if ((error = mrn_add_index_param(share, key_info, i)))
+ goto error;
+ }
+ DBUG_RETURN(0);
+
+error:
+ DBUG_RETURN(error);
+}
+
int mrn_free_share_alloc(
MRN_SHARE *share
) {
+ uint i;
DBUG_ENTER("mrn_free_share_alloc");
if (share->engine)
my_free(share->engine, MYF(0));
+ for (i = 0; i < share->table_share->keys; i++)
+ {
+ if (share->key_parser[i])
+ my_free(share->key_parser[i], MYF(0));
+ }
DBUG_RETURN(0);
}
MRN_SHARE *mrn_get_share(const char *table_name, TABLE *table, int *error)
{
MRN_SHARE *share;
- char *tmp_name;
- uint length, *wrap_key_nr, i, j;
+ char *tmp_name, **key_parser;
+ uint length, *wrap_key_nr, *key_parser_length, i, j;
KEY *wrap_key_info;
TABLE_SHARE *wrap_table_share;
DBUG_ENTER("mrn_get_share");
@@ -474,6 +627,8 @@ MRN_SHARE *mrn_get_share(const char *table_name, TABLE *table, int *error)
my_multi_malloc(MYF(MY_WME | MY_ZEROFILL),
&share, sizeof(*share),
&tmp_name, length + 1,
+ &key_parser, sizeof(char *) * table->s->keys,
+ &key_parser_length, sizeof(uint) * table->s->keys,
&wrap_key_nr, sizeof(*wrap_key_nr) * table->s->keys,
&wrap_key_info, sizeof(*wrap_key_info) * table->s->keys,
&wrap_table_share, sizeof(*wrap_table_share),
@@ -485,10 +640,15 @@ MRN_SHARE *mrn_get_share(const char *table_name, TABLE *table, int *error)
share->use_count = 0;
share->table_name_length = length;
share->table_name = tmp_name;
+ share->key_parser = key_parser;
+ share->key_parser_length = key_parser_length;
strmov(share->table_name, table_name);
share->table_share = table->s;
- if ((*error = mrn_parse_table_param(share, table)))
+ if (
+ (*error = mrn_parse_table_param(share, table)) ||
+ (*error = mrn_parse_index_param(share, table))
+ )
goto error_parse_table_param;
if (share->wrapper_mode)
Modified: mrn_table.h (+4 -0)
===================================================================
--- mrn_table.h 2011-09-24 14:24:53 +0000 (ec1f367)
+++ mrn_table.h 2011-09-24 17:54:24 +0000 (408b76d)
@@ -38,6 +38,8 @@ typedef struct st_mroonga_share
int engine_length;
plugin_ref plugin;
handlerton *hton;
+ char **key_parser;
+ uint *key_parser_length;
uint *wrap_key_nr;
uint wrap_keys;
uint base_keys;
@@ -78,6 +80,8 @@ void mrn_get_partition_info(const char *table_name, uint table_name_length,
partition_element **sub_elem);
#endif
int mrn_parse_table_param(MRN_SHARE *share, TABLE *table);
+int mrn_add_index_param(MRN_SHARE *share, KEY *key_info, int i);
+int mrn_parse_index_param(MRN_SHARE *share, TABLE *table);
MRN_SHARE *mrn_get_share(const char *table_name, TABLE *table, int *error);
int mrn_free_share(MRN_SHARE *share);
TABLE_SHARE *mrn_get_table_share(TABLE_LIST *table_list, int *error);