null+****@clear*****
null+****@clear*****
2011年 12月 26日 (月) 12:09:48 JST
Ryo Onodera 2011-12-26 12:09:48 +0900 (Mon, 26 Dec 2011) New Revision: e16f96b766b6cda070e2a15fd458de3e793baf80 Log: add --filter option to delete command Modified files: lib/proc.c test/unit/core/test-command-delete.c Modified: lib/proc.c (+24 -0) =================================================================== --- lib/proc.c 2011-12-26 12:31:12 +0900 (9992fdf) +++ lib/proc.c 2011-12-26 12:09:48 +0900 (feea18e) @@ -1627,6 +1627,29 @@ proc_delete(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) ERR(GRN_INVALID_ARGUMENT, "invalid id"); rc = ctx->rc; } + } else if (GRN_TEXT_LEN(VAR(3))) { + grn_obj *cond, *v; + const char *filter = GRN_TEXT_VALUE(VAR(3)); + unsigned filter_len = GRN_TEXT_LEN(VAR(3)); + + GRN_EXPR_CREATE_FOR_QUERY(ctx, table, cond, v); + grn_expr_parse(ctx, cond, filter, filter_len, + NULL, GRN_OP_MATCH, GRN_OP_AND, + GRN_EXPR_SYNTAX_SCRIPT); + if (!ctx->rc) { + grn_obj *res; + void *res_key, *value; + uint32_t res_key_size; + + res = grn_table_select(ctx, table, cond, NULL, GRN_OP_OR); + GRN_TABLE_EACH(ctx, res, 0, 0, res_id, &res_key, &res_key_size, &value, { + grn_id id = *(grn_id *)res_key; + grn_table_delete_by_id(ctx, table, id); + }); + grn_obj_unlink(ctx, res); + } + + grn_obj_unlink(ctx, cond); } } else { ERR(GRN_INVALID_ARGUMENT, "unknown table name"); @@ -2680,6 +2703,7 @@ grn_db_init_builtin_query(grn_ctx *ctx) DEF_VAR(vars[0], "table"); DEF_VAR(vars[1], "key"); DEF_VAR(vars[2], "id"); + DEF_VAR(vars[3], "filter"); DEF_COMMAND("delete", proc_delete, 3, vars); DEF_VAR(vars[0], "max"); Modified: test/unit/core/test-command-delete.c (+12 -0) =================================================================== --- test/unit/core/test-command-delete.c 2011-12-26 12:31:12 +0900 (87b575c) +++ test/unit/core/test-command-delete.c 2011-12-26 12:09:48 +0900 (c49fd5b) @@ -126,6 +126,18 @@ test_by_id(void) } void +test_by_filter(void) +{ + assert_send_command("delete Users --filter \"_key == \\\"mori\\\" || _key == \\\"tapo\\\"\""); + cut_assert_equal_string("[[[2]," + "[[\"_key\",\"ShortText\"]]," + "[\"yu\"]," + "[\"tasukuchan\"]]]", + send_command("select Users " + "--output_columns _key")); +} + +void test_by_delete(void) { assert_send_command("delete Users tapo");