Module: Ridgepole::Ext::AbstractMysqlAdapter::Partitioning

Included in:
ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter
Defined in:
lib/ridgepole/ext/abstract_mysql_adapter/partitioning.rb

Instance Method Summary collapse

Instance Method Details

#add_partition(table_name, name:, values:) ⇒ Object



52
53
54
55
# File 'lib/ridgepole/ext/abstract_mysql_adapter/partitioning.rb', line 52

def add_partition(table_name, name:, values:)
  pd = ActiveRecord::ConnectionAdapters::PartitionDefinition.new(name, values)
  execute "ALTER TABLE #{quote_table_name(table_name)} ADD PARTITION (#{schema_creation.accept(pd)})"
end

#create_partition(table_name, type:, columns:, partition_definitions:) ⇒ Object

SchemaStatements



48
49
50
# File 'lib/ridgepole/ext/abstract_mysql_adapter/partitioning.rb', line 48

def create_partition(table_name, type:, columns:, partition_definitions:)
  execute schema_creation.accept(ActiveRecord::ConnectionAdapters::PartitionOptions.new(table_name, type, columns, partition_definitions: partition_definitions))
end

#partition(table_name) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/ridgepole/ext/abstract_mysql_adapter/partitioning.rb', line 9

def partition(table_name)
  scope = quoted_scope(table_name)

  partition_info = exec_query(<<~SQL, 'SCHEMA')
    SELECT PARTITION_NAME, PARTITION_DESCRIPTION, PARTITION_METHOD, PARTITION_EXPRESSION
    FROM information_schema.partitions
    WHERE partition_name IS NOT NULL
      AND table_schema = #{scope[:schema]}
      AND table_name = #{scope[:name]}
  SQL
  return if partition_info.count == 0

  type = case partition_info.first['PARTITION_METHOD']
         when 'LIST COLUMNS'
           :list
         when 'RANGE COLUMNS'
           :range
         else
           raise NotImplementedError, partition_info.first['PARTITION_METHOD'].to_s
         end
  columns = partition_info.first['PARTITION_EXPRESSION'].delete('`').split(',').map(&:to_sym)

  partition_definitions = partition_info.map do |row|
    values = case type
             when :list
               { in: instance_eval("[#{row['PARTITION_DESCRIPTION'].gsub(/\(/, '[').gsub(/\)/, ']')}] # [1,2]", __FILE__, __LINE__) }
             when :range
               { to: instance_eval("[#{row['PARTITION_DESCRIPTION']}] # [1,2]", __FILE__, __LINE__) }
             else
               raise NotImplementedError
             end

    { name: row['PARTITION_NAME'], values: values }
  end

  ActiveRecord::ConnectionAdapters::PartitionOptions.new(table_name, type, columns, partition_definitions: partition_definitions)
end

#remove_partition(table_name, name:) ⇒ Object



57
58
59
# File 'lib/ridgepole/ext/abstract_mysql_adapter/partitioning.rb', line 57

def remove_partition(table_name, name:)
  execute "ALTER TABLE #{quote_table_name(table_name)} DROP PARTITION #{name}"
end