[Groonga-commit] ranguba/rroonga at db8d298 [master] Add Groonga::Object#remove(:dependent => true)

Back to archive index

Kouhei Sutou null+****@clear*****
Fri Apr 22 18:21:31 JST 2016


Kouhei Sutou	2016-04-22 18:21:31 +0900 (Fri, 22 Apr 2016)

  New Revision: db8d29825dadbc84cdf2874684d9487c2c1a0e72
  https://github.com/ranguba/rroonga/commit/db8d29825dadbc84cdf2874684d9487c2c1a0e72

  Message:
    Add Groonga::Object#remove(:dependent => true)

  Modified files:
    ext/groonga/rb-grn-object.c
    test/test-table.rb

  Modified: ext/groonga/rb-grn-object.c (+28 -6)
===================================================================
--- ext/groonga/rb-grn-object.c    2016-04-20 22:14:29 +0900 (904e7fa)
+++ ext/groonga/rb-grn-object.c    2016-04-22 18:21:31 +0900 (6ef3a33)
@@ -1461,23 +1461,45 @@ rb_grn_object_prepend_value (VALUE self, VALUE rb_id, VALUE rb_value)
 }
 
 /*
- * _object_ をメモリから解放し、それが永続オブジェクトであっ
- * た場合は、該当するファイル一式を削除する。
+ * Free the `object`. If the `object` is persistent object, all files
+ * related with the object are removed.
  *
- * @overload remove
+ * @overload remove(options={})
+ *
+ *   @param [::Hash] options The optional parameters.
+ *
+ *   @option options [Boolean] :dependent (false)
+ *     If it's `true`, all tables and columns that depend on the
+ *     `object`.
  */
 static VALUE
-rb_grn_object_remove (VALUE self)
+rb_grn_object_remove (int argc, VALUE *argv, VALUE self)
 {
     RbGrnObject *rb_grn_object;
     grn_ctx *context;
+    VALUE rb_options;
+    VALUE rb_dependent_p;
+    grn_bool dependent_p = GRN_FALSE;
 
     rb_grn_object = SELF(self);
     if (!rb_grn_object->object)
         return Qnil;
 
+    rb_scan_args(argc, argv, "01", &rb_options);
+    rb_grn_scan_options(rb_options,
+                        "dependent", &rb_dependent_p,
+                        NULL);
+
+    if (!NIL_P(rb_dependent_p)) {
+        dependent_p = RVAL2CBOOL(rb_dependent_p);
+    }
+
     context = rb_grn_object->context;
-    grn_obj_remove(context, rb_grn_object->object);
+    if (dependent_p) {
+        grn_obj_remove_dependent(context, rb_grn_object->object);
+    } else {
+        grn_obj_remove(context, rb_grn_object->object);
+    }
     rb_grn_context_check(context, self);
 
     rb_iv_set(self, "@context", Qnil);
@@ -1750,7 +1772,7 @@ rb_grn_init_object (VALUE mGrn)
     rb_define_method(rb_cGrnObject, "append", rb_grn_object_append_value, 2);
     rb_define_method(rb_cGrnObject, "prepend", rb_grn_object_prepend_value, 2);
 
-    rb_define_method(rb_cGrnObject, "remove", rb_grn_object_remove, 0);
+    rb_define_method(rb_cGrnObject, "remove", rb_grn_object_remove, -1);
 
     rb_define_method(rb_cGrnObject, "builtin?", rb_grn_object_builtin_p, 0);
     rb_define_method(rb_cGrnObject, "table?", rb_grn_object_table_p, 0);

  Modified: test/test-table.rb (+43 -7)
===================================================================
--- test/test-table.rb    2016-04-20 22:14:29 +0900 (cbf8b26)
+++ test/test-table.rb    2016-04-22 18:21:31 +0900 (ec6b66a)
@@ -302,13 +302,49 @@ class TableTest < Test::Unit::TestCase
     end
   end
 
-  def test_remove
-    bookmarks_path = @tables_dir + "bookmarks"
-    bookmarks = Groonga::Array.create(:name => "Bookmarks",
-                                      :path => bookmarks_path.to_s)
-    assert_predicate(bookmarks_path, :exist?)
-    bookmarks.remove
-    assert_not_predicate(bookmarks_path, :exist?)
+  class RemoveTest < self
+    def test_default
+      bookmarks_path = @tables_dir + "bookmarks"
+      bookmarks = Groonga::Array.create(:name => "Bookmarks",
+                                        :path => bookmarks_path.to_s)
+      assert_predicate(bookmarks_path, :exist?)
+      bookmarks.remove
+      assert_not_predicate(bookmarks_path, :exist?)
+    end
+
+    def test_dependent
+      names_path = @tables_dir + "names"
+      names = Groonga::Hash.create(:name => "Names",
+                                   :path => names_path.to_s,
+                                   :key_type => "ShortText")
+      users_path = @tables_dir + "users"
+      Groonga::Hash.create(:name => "Users",
+                           :path => users_path.to_s,
+                           :key_type => "Names")
+      administrators_path = @tables_dir + "administrators"
+      Groonga::Hash.create(:name => "Administrator",
+                           :path => administrators_path.to_s,
+                           :key_type => "Names")
+      members_path = @tables_dir + "members"
+      members = Groonga::Hash.create(:name => "Members",
+                                     :path => members_path.to_s,
+                                     :key_type => "ShortText")
+      members_name_path = @columns_dir + "name"
+      members.define_column("name", "Names",
+                            :path => members_name_path.to_s)
+
+      assert {names_path.exist?}
+      assert {users_path.exist?}
+      assert {administrators_path.exist?}
+      assert {members_path.exist?}
+      assert {members_name_path.exist?}
+      names.remove(:dependent => true)
+      assert {not names_path.exist?}
+      assert {not users_path.exist?}
+      assert {not administrators_path.exist?}
+      assert {members_path.exist?}
+      assert {not members_name_path.exist?}
+    end
   end
 
   def test_temporary_add
-------------- next part --------------
HTML����������������������������...
다운로드 



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