Kouhei Sutou
null+****@clear*****
Wed May 16 18:12:22 JST 2018
Kouhei Sutou 2018-05-16 18:12:22 +0900 (Wed, 16 May 2018) New Revision: 72574b3e7afe6d5a1ef414eed17fbc3857ae7533 https://github.com/groonga/groonga/commit/72574b3e7afe6d5a1ef414eed17fbc3857ae7533 Message: delete: add --limit option Added files: test/command/suite/delete/filter/limit/large.expected test/command/suite/delete/filter/limit/large.test test/command/suite/delete/filter/limit/negative.expected test/command/suite/delete/filter/limit/negative.test test/command/suite/delete/filter/limit/small.expected test/command/suite/delete/filter/limit/small.test test/command/suite/delete/filter/limit/zero.expected test/command/suite/delete/filter/limit/zero.test test/command/suite/delete/id/limit.expected test/command/suite/delete/id/limit.test test/command/suite/delete/key/limit.expected test/command/suite/delete/key/limit.test Modified files: lib/proc.c Modified: lib/proc.c (+43 -12) =================================================================== --- lib/proc.c 2018-05-16 17:31:01 +0900 (1b20ac3bc) +++ lib/proc.c 2018-05-16 18:12:22 +0900 (6274befcb) @@ -594,6 +594,7 @@ proc_delete(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) grn_obj *table = NULL; uint32_t n_deleted = 0; uint32_t n_errors = 0; + int32_t limit; if (GRN_TEXT_LEN(table_name) == 0) { rc = GRN_INVALID_ARGUMENT; @@ -607,6 +608,14 @@ proc_delete(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) rc = proc_delete_validate_selector(ctx, table, table_name, key, id, filter); if (rc != GRN_SUCCESS) { goto exit; } + limit = grn_plugin_proc_get_var_int32(ctx, + user_data, + "limit", -1, + -1); + if (limit == 0) { + goto exit; + } + if (GRN_TEXT_LEN(key)) { grn_obj casted_key; if (key->header.domain != table->header.domain) { @@ -617,25 +626,40 @@ proc_delete(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) if (ctx->rc) { rc = ctx->rc; } else { - rc = grn_table_delete(ctx, table, GRN_BULK_HEAD(key), GRN_BULK_VSIZE(key)); - if (rc == GRN_SUCCESS) { - n_deleted++; - } else { - n_errors++; + if (limit < 0) { + const int32_t n_records = 1; + limit += n_records + 1; } - if (key == &casted_key) { - GRN_OBJ_FIN(ctx, &casted_key); + if (limit >= 1) { + rc = grn_table_delete(ctx, + table, + GRN_BULK_HEAD(key), + GRN_BULK_VSIZE(key)); + if (rc == GRN_SUCCESS) { + n_deleted++; + } else { + n_errors++; + } } } + if (key == &casted_key) { + GRN_OBJ_FIN(ctx, &casted_key); + } } else if (GRN_TEXT_LEN(id)) { const char *end; grn_id parsed_id = grn_atoui(GRN_TEXT_VALUE(id), GRN_BULK_CURR(id), &end); if (end == GRN_BULK_CURR(id)) { - rc = grn_table_delete_by_id(ctx, table, parsed_id); - if (rc == GRN_SUCCESS) { - n_deleted++; - } else { - n_errors++; + if (limit < 0) { + const int32_t n_records = 1; + limit += n_records + 1; + } + if (limit >= 1) { + rc = grn_table_delete_by_id(ctx, table, parsed_id); + if (rc == GRN_SUCCESS) { + n_deleted++; + } else { + n_errors++; + } } } else { rc = GRN_INVALID_ARGUMENT; @@ -670,6 +694,9 @@ proc_delete(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) records = grn_table_select(ctx, table, cond, NULL, GRN_OP_OR); if (records) { + if (limit < 0) { + limit += grn_table_size(ctx, records) + 1; + } GRN_TABLE_EACH_BEGIN(ctx, records, cursor, result_id) { void *key; grn_id id; @@ -679,6 +706,10 @@ proc_delete(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) continue; } + if (n_deleted >= (uint32_t)limit) { + break; + } + id = *(grn_id *)key; sub_rc = grn_table_delete_by_id(ctx, table, id); if (sub_rc == GRN_SUCCESS) { Added: test/command/suite/delete/filter/limit/large.expected (+18 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/delete/filter/limit/large.expected 2018-05-16 18:12:22 +0900 (61f158357) @@ -0,0 +1,18 @@ +table_create Users TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +load --table Users +[ +{"_key": "alice"}, +{"_key": "bob"}, +{"_key": "bill"}, +{"_key": "brian"} +] +[[0,0.0,0.0],4] +delete --table Users --filter '_key @^ "b"' --limit 4 +[[0,0.0,0.0],true] +#>delete --filter "_key @^ \"b\"" --limit "4" --table "Users" +#:000000000000000 filter(3) +#:000000000000000 delete(3): [0][1] +#<000000000000000 rc=0 +select Users +[[0,0.0,0.0],[[[1],[["_id","UInt32"],["_key","ShortText"]],[1,"alice"]]]] Added: test/command/suite/delete/filter/limit/large.test (+15 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/delete/filter/limit/large.test 2018-05-16 18:12:22 +0900 (6324756c6) @@ -0,0 +1,15 @@ +table_create Users TABLE_PAT_KEY ShortText + +load --table Users +[ +{"_key": "alice"}, +{"_key": "bob"}, +{"_key": "bill"}, +{"_key": "brian"} +] + +#@collect-query-log true +delete --table Users --filter '_key @^ "b"' --limit 4 +#@collect-query-log false + +select Users Added: test/command/suite/delete/filter/limit/negative.expected (+50 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/delete/filter/limit/negative.expected 2018-05-16 18:12:22 +0900 (eb1e6ba4f) @@ -0,0 +1,50 @@ +table_create Users TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +load --table Users +[ +{"_key": "alice"}, +{"_key": "bob"}, +{"_key": "bill"}, +{"_key": "brian"}, +{"_key": "bert"} +] +[[0,0.0,0.0],5] +delete --table Users --filter '_key @^ "b"' --limit -2 +[[0,0.0,0.0],true] +#>delete --filter "_key @^ \"b\"" --limit "-2" --table "Users" +#:000000000000000 filter(4) +#:000000000000000 delete(3): [0][2] +#<000000000000000 rc=0 +select Users +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 2 + ], + [ + [ + "_id", + "UInt32" + ], + [ + "_key", + "ShortText" + ] + ], + [ + 1, + "alice" + ], + [ + 5, + "bert" + ] + ] + ] +] Added: test/command/suite/delete/filter/limit/negative.test (+16 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/delete/filter/limit/negative.test 2018-05-16 18:12:22 +0900 (882f0fc67) @@ -0,0 +1,16 @@ +table_create Users TABLE_PAT_KEY ShortText + +load --table Users +[ +{"_key": "alice"}, +{"_key": "bob"}, +{"_key": "bill"}, +{"_key": "brian"}, +{"_key": "bert"} +] + +#@collect-query-log true +delete --table Users --filter '_key @^ "b"' --limit -2 +#@collect-query-log false + +select Users Added: test/command/suite/delete/filter/limit/small.expected (+49 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/delete/filter/limit/small.expected 2018-05-16 18:12:22 +0900 (fd46f685d) @@ -0,0 +1,49 @@ +table_create Users TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +load --table Users +[ +{"_key": "alice"}, +{"_key": "bob"}, +{"_key": "bill"}, +{"_key": "brian"} +] +[[0,0.0,0.0],4] +delete --table Users --filter '_key @^ "b"' --limit 2 +[[0,0.0,0.0],true] +#>delete --filter "_key @^ \"b\"" --limit "2" --table "Users" +#:000000000000000 filter(3) +#:000000000000000 delete(2): [0][2] +#<000000000000000 rc=0 +select Users +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 2 + ], + [ + [ + "_id", + "UInt32" + ], + [ + "_key", + "ShortText" + ] + ], + [ + 1, + "alice" + ], + [ + 3, + "bill" + ] + ] + ] +] Added: test/command/suite/delete/filter/limit/small.test (+15 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/delete/filter/limit/small.test 2018-05-16 18:12:22 +0900 (2e2f21a9f) @@ -0,0 +1,15 @@ +table_create Users TABLE_PAT_KEY ShortText + +load --table Users +[ +{"_key": "alice"}, +{"_key": "bob"}, +{"_key": "bill"}, +{"_key": "brian"} +] + +#@collect-query-log true +delete --table Users --filter '_key @^ "b"' --limit 2 +#@collect-query-log false + +select Users Added: test/command/suite/delete/filter/limit/zero.expected (+56 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/delete/filter/limit/zero.expected 2018-05-16 18:12:22 +0900 (cc82d2f7a) @@ -0,0 +1,56 @@ +table_create Users TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +load --table Users +[ +{"_key": "alice"}, +{"_key": "bob"}, +{"_key": "bill"}, +{"_key": "brian"} +] +[[0,0.0,0.0],4] +delete --table Users --filter '_key @^ "b"' --limit 0 +[[0,0.0,0.0],true] +#>delete --filter "_key @^ \"b\"" --limit "0" --table "Users" +#:000000000000000 delete(0): [0][4] +#<000000000000000 rc=0 +select Users +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 4 + ], + [ + [ + "_id", + "UInt32" + ], + [ + "_key", + "ShortText" + ] + ], + [ + 1, + "alice" + ], + [ + 3, + "bill" + ], + [ + 2, + "bob" + ], + [ + 4, + "brian" + ] + ] + ] +] Added: test/command/suite/delete/filter/limit/zero.test (+15 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/delete/filter/limit/zero.test 2018-05-16 18:12:22 +0900 (33c07853e) @@ -0,0 +1,15 @@ +table_create Users TABLE_PAT_KEY ShortText + +load --table Users +[ +{"_key": "alice"}, +{"_key": "bob"}, +{"_key": "bill"}, +{"_key": "brian"} +] + +#@collect-query-log true +delete --table Users --filter '_key @^ "b"' --limit 0 +#@collect-query-log false + +select Users Added: test/command/suite/delete/id/limit.expected (+51 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/delete/id/limit.expected 2018-05-16 18:12:22 +0900 (c2e0ffa6a) @@ -0,0 +1,51 @@ +table_create Users TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +load --table Users +[ +{"_key": "alice"}, +{"_key": "bob"}, +{"_key": "bill"} +] +[[0,0.0,0.0],3] +delete --table Users --id 2 --limit 0 +[[0,0.0,0.0],true] +#>delete --id "2" --limit "0" --table "Users" +#:000000000000000 delete(0): [0][3] +#<000000000000000 rc=0 +select Users +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 3 + ], + [ + [ + "_id", + "UInt32" + ], + [ + "_key", + "ShortText" + ] + ], + [ + 1, + "alice" + ], + [ + 3, + "bill" + ], + [ + 2, + "bob" + ] + ] + ] +] Added: test/command/suite/delete/id/limit.test (+14 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/delete/id/limit.test 2018-05-16 18:12:22 +0900 (e60087bdb) @@ -0,0 +1,14 @@ +table_create Users TABLE_PAT_KEY ShortText + +load --table Users +[ +{"_key": "alice"}, +{"_key": "bob"}, +{"_key": "bill"} +] + +#@collect-query-log true +delete --table Users --id 2 --limit 0 +#@collect-query-log false + +select Users Added: test/command/suite/delete/key/limit.expected (+51 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/delete/key/limit.expected 2018-05-16 18:12:22 +0900 (e6e91be85) @@ -0,0 +1,51 @@ +table_create Users TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +load --table Users +[ +{"_key": "alice"}, +{"_key": "bob"}, +{"_key": "bill"} +] +[[0,0.0,0.0],3] +delete --table Users --key 'bob' --limit 0 +[[0,0.0,0.0],true] +#>delete --key "bob" --limit "0" --table "Users" +#:000000000000000 delete(0): [0][3] +#<000000000000000 rc=0 +select Users +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 3 + ], + [ + [ + "_id", + "UInt32" + ], + [ + "_key", + "ShortText" + ] + ], + [ + 1, + "alice" + ], + [ + 3, + "bill" + ], + [ + 2, + "bob" + ] + ] + ] +] Added: test/command/suite/delete/key/limit.test (+14 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/delete/key/limit.test 2018-05-16 18:12:22 +0900 (5b3301625) @@ -0,0 +1,14 @@ +table_create Users TABLE_PAT_KEY ShortText + +load --table Users +[ +{"_key": "alice"}, +{"_key": "bob"}, +{"_key": "bill"} +] + +#@collect-query-log true +delete --table Users --key 'bob' --limit 0 +#@collect-query-log false + +select Users -------------- next part -------------- HTML����������������������������... URL: https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20180516/802640c2/attachment-0001.htm