[Groonga-mysql-commit] mroonga/mroonga [master] #592 add choosable parser

Back to archive index

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);




Groonga-mysql-commit メーリングリストの案内
Back to archive index