[Groonga-commit] groonga/groonga [master] [table_create] supported --normalizer.

Back to archive index

null+****@clear***** null+****@clear*****
2012年 2月 10日 (金) 15:56:51 JST


Kouhei Sutou	2012-02-10 15:56:51 +0900 (Fri, 10 Feb 2012)

  New Revision: edfe27730eacd23a46cea331300192af89fcd02e

  Log:
    [table_create] supported --normalizer.

  Modified files:
    lib/proc.c
    test/unit/core/test-command-table-create.c

  Modified: lib/proc.c (+57 -12)
===================================================================
--- lib/proc.c    2012-02-10 15:56:26 +0900 (613f1f8)
+++ lib/proc.c    2012-02-10 15:56:51 +0900 (b8fb21e)
@@ -819,7 +819,7 @@ grn_column_create_flags_to_text(grn_ctx *ctx, grn_obj *buf, grn_obj_flags flags)
 static grn_obj *
 proc_table_create(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
 {
-  grn_obj *table;
+  grn_obj *table, *table_name;
   const char *rest;
   grn_obj_flags flags = grn_atoi(GRN_TEXT_VALUE(VAR(1)),
                                  GRN_BULK_CURR(VAR(1)), &rest);
@@ -828,7 +828,9 @@ proc_table_create(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_d
                                          GRN_BULK_CURR(VAR(1)));
     if (ctx->rc) { goto exit; }
   }
-  if (GRN_TEXT_LEN(VAR(0))) {
+
+  table_name = VAR(0);
+  if (GRN_TEXT_LEN(table_name)) {
     grn_obj *key_type = NULL, *value_type = NULL;
     if (GRN_TEXT_LEN(VAR(2)) > 0) {
       key_type = grn_ctx_get(ctx, GRN_TEXT_VALUE(VAR(2)),
@@ -836,7 +838,7 @@ proc_table_create(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_d
       if (!key_type) {
         ERR(GRN_INVALID_ARGUMENT,
             "[table][create] key type doesn't exist: <%.*s> (%.*s)",
-            GRN_TEXT_LEN(VAR(0)), GRN_TEXT_VALUE(VAR(0)),
+            GRN_TEXT_LEN(table_name), GRN_TEXT_VALUE(table_name),
             GRN_TEXT_LEN(VAR(2)), GRN_TEXT_VALUE(VAR(2)));
         return NULL;
       }
@@ -847,24 +849,66 @@ proc_table_create(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_d
       if (!value_type) {
         ERR(GRN_INVALID_ARGUMENT,
             "[table][create] value type doesn't exist: <%.*s> (%.*s)",
-            GRN_TEXT_LEN(VAR(0)), GRN_TEXT_VALUE(VAR(0)),
+            GRN_TEXT_LEN(table_name), GRN_TEXT_VALUE(table_name),
             GRN_TEXT_LEN(VAR(3)), GRN_TEXT_VALUE(VAR(3)));
         return NULL;
       }
     }
     flags |= GRN_OBJ_PERSISTENT;
     table = grn_table_create(ctx,
-                             GRN_TEXT_VALUE(VAR(0)),
-                             GRN_TEXT_LEN(VAR(0)),
+                             GRN_TEXT_VALUE(table_name),
+                             GRN_TEXT_LEN(table_name),
                              NULL, flags,
                              key_type,
                              value_type);
     if (table) {
-      grn_obj_set_info(ctx, table,
-                       GRN_INFO_DEFAULT_TOKENIZER,
-                       grn_ctx_get(ctx, GRN_TEXT_VALUE(VAR(4)),
-                                   GRN_TEXT_LEN(VAR(4))));
-      grn_obj_unlink(ctx, table);
+      grn_obj *tokenizer_name;
+      grn_obj *normalizer_name;
+
+      tokenizer_name = VAR(4);
+      normalizer_name = VAR(5);
+
+      if (GRN_TEXT_LEN(tokenizer_name)) {
+        grn_obj *tokenizer;
+
+        tokenizer = grn_ctx_get(ctx,
+                                GRN_TEXT_VALUE(tokenizer_name),
+                                GRN_TEXT_LEN(tokenizer_name));
+        if (tokenizer) {
+          grn_obj_set_info(ctx, table, GRN_INFO_DEFAULT_TOKENIZER, tokenizer);
+        } else {
+          ERR(GRN_INVALID_ARGUMENT,
+              "[table][create] unknown default tokenizer is specified: "
+              "<%.*s> (%.*s)",
+              GRN_TEXT_LEN(table_name), GRN_TEXT_VALUE(table_name),
+              GRN_TEXT_LEN(tokenizer_name), GRN_TEXT_VALUE(tokenizer_name));
+          grn_obj_remove(ctx, table);
+          table = NULL;
+        }
+      }
+
+      if (GRN_TEXT_LEN(normalizer_name)) {
+        grn_obj *normalizer;
+
+        normalizer = grn_ctx_get(ctx,
+                                 GRN_TEXT_VALUE(normalizer_name),
+                                 GRN_TEXT_LEN(normalizer_name));
+        if (normalizer) {
+          grn_obj_set_info(ctx, table, GRN_INFO_NORMALIZER, normalizer);
+        } else {
+          ERR(GRN_INVALID_ARGUMENT,
+              "[table][create] unknown normalizer is specified: ",
+              "<%.*s> (%.*s)",
+              GRN_TEXT_LEN(table_name), GRN_TEXT_VALUE(table_name),
+              GRN_TEXT_LEN(normalizer_name), GRN_TEXT_VALUE(normalizer_name));
+          grn_obj_remove(ctx, table);
+          table = NULL;
+        }
+      }
+
+      if (table) {
+        grn_obj_unlink(ctx, table);
+      }
     }
   } else {
     ERR(GRN_INVALID_ARGUMENT,
@@ -2883,7 +2927,8 @@ grn_db_init_builtin_query(grn_ctx *ctx)
   DEF_VAR(vars[2], "key_type");
   DEF_VAR(vars[3], "value_type");
   DEF_VAR(vars[4], "default_tokenizer");
-  DEF_COMMAND("table_create", proc_table_create, 5, vars);
+  DEF_VAR(vars[5], "normalizer");
+  DEF_COMMAND("table_create", proc_table_create, 6, vars);
 
   DEF_VAR(vars[0], "name");
   DEF_COMMAND("table_remove", proc_table_remove, 1, vars);

  Modified: test/unit/core/test-command-table-create.c (+14 -0)
===================================================================
--- test/unit/core/test-command-table-create.c    2012-02-10 15:56:26 +0900 (4f1e772)
+++ test/unit/core/test-command-table-create.c    2012-02-10 15:56:51 +0900 (0b73c66)
@@ -28,6 +28,7 @@ void test_pat_key(void);
 void test_dat_key(void);
 void test_no_key(void);
 void test_default_tokenizer(void);
+void test_normalizer(void);
 
 void test_invalid_name(void);
 
@@ -137,6 +138,19 @@ test_default_tokenizer(void)
 }
 
 void
+test_normalizer(void)
+{
+  grn_obj *normalizer;
+  assert_send_command("table_create Users TABLE_PAT_KEY ShortText "
+                      "--normalizer NormalizerASCII");
+  grn_test_assert_users_exist();
+  normalizer = grn_obj_get_info(context, users, GRN_INFO_NORMALIZER, NULL);
+  grn_test_assert_equal_id(context,
+                           GRN_DB_NORMALIZER_ASCII,
+                           grn_obj_id(context, normalizer));
+}
+
+void
 test_invalid_name(void)
 {
   grn_test_assert_send_command_error(




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