Merge branch 'master' into 5197-collection-name-owner-unique
authorRadhika Chippada <radhika@curoverse.com>
Mon, 16 Feb 2015 20:31:55 +0000 (15:31 -0500)
committerRadhika Chippada <radhika@curoverse.com>
Mon, 16 Feb 2015 20:31:55 +0000 (15:31 -0500)
services/api/db/migrate/20150216193428_collection_name_owner_unique_only_non_expired.rb [new file with mode: 0644]
services/api/db/structure.sql
services/api/test/unit/collection_test.rb

diff --git a/services/api/db/migrate/20150216193428_collection_name_owner_unique_only_non_expired.rb b/services/api/db/migrate/20150216193428_collection_name_owner_unique_only_non_expired.rb
new file mode 100644 (file)
index 0000000..9285688
--- /dev/null
@@ -0,0 +1,24 @@
+class CollectionNameOwnerUniqueOnlyNonExpired < ActiveRecord::Migration
+  def find_index
+    indexes = ActiveRecord::Base.connection.indexes('collections')
+    name_owner_index = indexes.select do |index|
+      index.name == 'collection_owner_uuid_name_unique'
+    end
+    name_owner_index
+  end
+
+  def up
+    remove_index :collections, :name => 'collection_owner_uuid_name_unique' if !find_index.empty?
+    add_index(:collections, [:owner_uuid, :name], unique: true,
+              where: 'expires_at is null',
+              name: 'collection_owner_uuid_name_unique')
+  end
+
+  def down
+    # it failed during up. is it going to pass now? should we do nothing?
+    remove_index :collections, :name => 'collection_owner_uuid_name_unique' if !find_index.empty?
+    # and this is failing ...
+    # add_index(:collections, [:owner_uuid, :name], unique: true,
+    #          name: 'collection_owner_uuid_name_unique')
+  end
+end
index e2c6b66719b97cf959e89b1c4fb0c5aa287e7ec3..aded46557d0ef5bf77e28deeddc1d728d854ebde 100644 (file)
@@ -160,7 +160,6 @@ CREATE TABLE collections (
     modified_at timestamp without time zone,
     portable_data_hash character varying(255),
     redundancy integer,
-    redundancy_confirmed_by_client_uuid character varying(255),
     redundancy_confirmed_at timestamp without time zone,
     redundancy_confirmed_as integer,
     updated_at timestamp without time zone NOT NULL,
@@ -170,6 +169,7 @@ CREATE TABLE collections (
     description character varying(524288),
     properties text,
     expires_at date,
+    redundancy_confirmed_by_client_uuid character varying(255),
     file_names character varying(8192)
 );
 
@@ -1304,14 +1304,14 @@ CREATE INDEX authorized_keys_search_index ON authorized_keys USING btree (uuid,
 -- Name: collection_owner_uuid_name_unique; Type: INDEX; Schema: public; Owner: -; Tablespace: 
 --
 
-CREATE UNIQUE INDEX collection_owner_uuid_name_unique ON collections USING btree (owner_uuid, name);
+CREATE UNIQUE INDEX collection_owner_uuid_name_unique ON collections USING btree (owner_uuid, name) WHERE (expires_at IS NULL);
 
 
 --
 -- Name: collections_full_text_search_idx; Type: INDEX; Schema: public; Owner: -; Tablespace: 
 --
 
-CREATE INDEX collections_full_text_search_idx ON collections USING gin (to_tsvector('english'::regconfig, (((((((((((((((((((COALESCE(owner_uuid, ''::character varying))::text || ' '::text) || (COALESCE(modified_by_client_uuid, ''::character varying))::text) || ' '::text) || (COALESCE(modified_by_user_uuid, ''::character varying))::text) || ' '::text) || (COALESCE(portable_data_hash, ''::character varying))::text) || ' '::text) || (COALESCE(redundancy_confirmed_by_client_uuid, ''::character varying))::text) || ' '::text) || (COALESCE(uuid, ''::character varying))::text) || ' '::text) || (COALESCE(name, ''::character varying))::text) || ' '::text) || (COALESCE(description, ''::character varying))::text) || ' '::text) || COALESCE(properties, ''::text)) || ' '::text) || (COALESCE(file_names, ''::character varying))::text)));
+CREATE INDEX collections_full_text_search_idx ON collections USING gin (to_tsvector('english'::regconfig, (((((((((((((((((COALESCE(owner_uuid, ''::character varying))::text || ' '::text) || (COALESCE(modified_by_client_uuid, ''::character varying))::text) || ' '::text) || (COALESCE(modified_by_user_uuid, ''::character varying))::text) || ' '::text) || (COALESCE(portable_data_hash, ''::character varying))::text) || ' '::text) || (COALESCE(uuid, ''::character varying))::text) || ' '::text) || (COALESCE(name, ''::character varying))::text) || ' '::text) || (COALESCE(description, ''::character varying))::text) || ' '::text) || COALESCE(properties, ''::text)) || ' '::text) || (COALESCE(redundancy_confirmed_by_client_uuid, ''::character varying))::text)));
 
 
 --
@@ -2357,4 +2357,6 @@ INSERT INTO schema_migrations (version) VALUES ('20150123142953');
 
 INSERT INTO schema_migrations (version) VALUES ('20150203180223');
 
-INSERT INTO schema_migrations (version) VALUES ('20150206210804');
\ No newline at end of file
+INSERT INTO schema_migrations (version) VALUES ('20150206210804');
+
+INSERT INTO schema_migrations (version) VALUES ('20150216193428');
\ No newline at end of file
index 08f46fddccced0974db6cf12f51f04827f862734..f76c278e9a403f7ded2853eb900f3fafa15761d4 100644 (file)
@@ -137,4 +137,24 @@ class CollectionTest < ActiveSupport::TestCase
       assert_equal 'value_1', c.properties['property_1']
     end
   end
+
+  test 'create, delete, recreate collection with same name and owner' do
+    act_as_user users(:active) do
+      # create collection with name
+      c = Collection.create(manifest_text: '',
+                            name: "test collection name")
+      assert c.valid?
+      uuid = c.uuid
+
+      # mark collection as expired
+      c.update_attribute 'expires_at', Time.new.strftime("%Y-%m-%d")
+      c = Collection.where(uuid: uuid)
+      assert_empty c, 'Should not be able to find expired collection'
+
+      # recreate collection with the same name
+      c = Collection.create(manifest_text: '',
+                            name: "test collection name")
+      assert c.valid?
+    end
+  end
 end