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