Module: EasyPartition::ActiveRecord::Migration
- Defined in:
- lib/easy_partition/active_record/migration.rb
Instance Method Summary collapse
- #child_table_index_name(column_name, partition) ⇒ Object
- #child_table_name(partition) ⇒ Object
- #create_child_table(column_name, partition) ⇒ Object
- #create_child_table_partition_index(column_name, partition) ⇒ Object
- #create_child_tables(column_name, partitions) ⇒ Object
- #create_partitions_tables!(column_name, *partitions) ⇒ Object
- #define_trigger(column_name, partitions) ⇒ Object
- #drop_child_table(partition) ⇒ Object
- #drop_child_table_partition_index(column_name, partition) ⇒ Object
- #drop_child_tables(column_name, partitions) ⇒ Object
- #drop_partitions_tables!(column_name, *partitions) ⇒ Object
- #drop_trigger ⇒ Object
- #drop_trigger_definition ⇒ Object
- #enable_trigger ⇒ Object
- #master_table ⇒ Object
- #trigger_footer ⇒ Object
- #trigger_header ⇒ Object
Instance Method Details
#child_table_index_name(column_name, partition) ⇒ Object
114 115 116 |
# File 'lib/easy_partition/active_record/migration.rb', line 114 def child_table_index_name(column_name, partition) [child_table_name(partition), column_name].join('_') end |
#child_table_name(partition) ⇒ Object
110 111 112 |
# File 'lib/easy_partition/active_record/migration.rb', line 110 def child_table_name(partition) [master_table, partition].join('_') end |
#create_child_table(column_name, partition) ⇒ Object
30 31 32 33 34 35 36 |
# File 'lib/easy_partition/active_record/migration.rb', line 30 def create_child_table(column_name, partition) connection.execute <<-SQL CREATE TABLE #{child_table_name(partition)} ( CHECK ( #{column_name} = '#{partition}' ) ) INHERITS (#{master_table}); SQL end |
#create_child_table_partition_index(column_name, partition) ⇒ Object
44 45 46 47 48 |
# File 'lib/easy_partition/active_record/migration.rb', line 44 def create_child_table_partition_index(column_name, partition) connection.execute <<-SQL CREATE INDEX #{child_table_index_name(column_name, partition)} ON #{child_table_name(partition)} (#{column_name}); SQL end |
#create_child_tables(column_name, partitions) ⇒ Object
16 17 18 19 20 21 |
# File 'lib/easy_partition/active_record/migration.rb', line 16 def create_child_tables(column_name, partitions) partitions.each do |partition| create_child_table(column_name, partition) create_child_table_partition_index(column_name, partition) end end |
#create_partitions_tables!(column_name, *partitions) ⇒ Object
4 5 6 7 8 |
# File 'lib/easy_partition/active_record/migration.rb', line 4 def create_partitions_tables!(column_name, *partitions) create_child_tables(column_name, partitions) define_trigger(column_name, partitions) enable_trigger end |
#define_trigger(column_name, partitions) ⇒ Object
56 57 58 59 60 61 62 63 64 65 |
# File 'lib/easy_partition/active_record/migration.rb', line 56 def define_trigger(column_name, partitions) query = trigger_header partitions.each do |partition| query += %[IF (NEW.#{column_name} = '#{partition}') THEN INSERT INTO #{child_table_name(partition)} VALUES (NEW.*); ELS] end query += connection.execute query end |
#drop_child_table(partition) ⇒ Object
38 39 40 41 42 |
# File 'lib/easy_partition/active_record/migration.rb', line 38 def drop_child_table(partition) connection.execute <<-SQL DROP TABLE #{child_table_name(partition)}; SQL end |
#drop_child_table_partition_index(column_name, partition) ⇒ Object
50 51 52 53 54 |
# File 'lib/easy_partition/active_record/migration.rb', line 50 def drop_child_table_partition_index(column_name, partition) connection.execute <<-SQL DROP INDEX #{child_table_index_name(column_name, partition)}; SQL end |
#drop_child_tables(column_name, partitions) ⇒ Object
23 24 25 26 27 28 |
# File 'lib/easy_partition/active_record/migration.rb', line 23 def drop_child_tables(column_name, partitions) partitions.each do |partition| drop_child_table_partition_index(column_name, partition) drop_child_table(partition) end end |
#drop_partitions_tables!(column_name, *partitions) ⇒ Object
10 11 12 13 14 |
# File 'lib/easy_partition/active_record/migration.rb', line 10 def drop_partitions_tables!(column_name, *partitions) drop_trigger drop_trigger_definition drop_child_tables(column_name, partitions) end |
#drop_trigger ⇒ Object
81 82 83 84 85 |
# File 'lib/easy_partition/active_record/migration.rb', line 81 def drop_trigger connection.execute <<-SQL DROP TRIGGER IF EXISTS insert_#{master_table}_trigger ON #{master_table}; SQL end |
#drop_trigger_definition ⇒ Object
67 68 69 70 71 |
# File 'lib/easy_partition/active_record/migration.rb', line 67 def drop_trigger_definition connection.execute <<-SQL DROP FUNCTION IF EXISTS #{master_table}_insert_trigger(); SQL end |
#enable_trigger ⇒ Object
73 74 75 76 77 78 79 |
# File 'lib/easy_partition/active_record/migration.rb', line 73 def enable_trigger connection.execute <<-SQL CREATE TRIGGER insert_#{master_table}_trigger BEFORE INSERT ON #{master_table} FOR EACH ROW EXECUTE PROCEDURE #{master_table}_insert_trigger(); SQL end |
#master_table ⇒ Object
106 107 108 |
# File 'lib/easy_partition/active_record/migration.rb', line 106 def master_table table_name end |
#trigger_footer ⇒ Object
95 96 97 98 99 100 101 102 103 104 |
# File 'lib/easy_partition/active_record/migration.rb', line 95 def %(E RAISE EXCEPTION 'partition out of range'; END IF; RETURN NULL; END; $$ LANGUAGE plpgsql; ) end |
#trigger_header ⇒ Object
87 88 89 90 91 92 93 |
# File 'lib/easy_partition/active_record/migration.rb', line 87 def trigger_header <<-SQL CREATE OR REPLACE FUNCTION #{master_table}_insert_trigger() RETURNS TRIGGER AS $$ BEGIN SQL end |