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(