[Groonga-commit] groonga/groonga at 72574b3 [master] delete: add --limit option

Back to archive index

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 



More information about the Groonga-commit mailing list
Back to archive index