class Egis::PartitionsGenerator

@!visibility private

Attributes

cartesian_product_generator[R]

Public Class Methods

new(cartesian_product_generator: Egis::CartesianProductGenerator.new) click to toggle source
# File lib/egis/partitions_generator.rb, line 6
def initialize(cartesian_product_generator: Egis::CartesianProductGenerator.new)
  @cartesian_product_generator = cartesian_product_generator
end

Public Instance Methods

to_sql(table_name, values_by_partition, permissive: false) click to toggle source
# File lib/egis/partitions_generator.rb, line 10
    def to_sql(table_name, values_by_partition, permissive: false)
      validate_partition_values(values_by_partition)

      <<~SQL
        ALTER TABLE #{table_name} ADD #{permissive_statement(permissive)}
          #{partitions_definition(values_by_partition)};
      SQL
    end

Private Instance Methods

partition_values(partition_values_combination) click to toggle source
# File lib/egis/partitions_generator.rb, line 45
def partition_values(partition_values_combination)
  partition_values_combination.map do |partition_name, value|
    if value.is_a?(String)
      "#{partition_name} = '#{value}'"
    else
      "#{partition_name} = #{value}"
    end
  end
end
partition_values_clause(partition_values_combination) click to toggle source
# File lib/egis/partitions_generator.rb, line 41
def partition_values_clause(partition_values_combination)
  "PARTITION (#{partition_values(partition_values_combination).join(', ')})"
end
partition_values_missing?(values_by_partition) click to toggle source
# File lib/egis/partitions_generator.rb, line 27
def partition_values_missing?(values_by_partition)
  values_by_partition.nil? || values_by_partition.empty? || values_by_partition.values.any?(&:empty?)
end
partitions_definition(values_by_partition) click to toggle source
# File lib/egis/partitions_generator.rb, line 35
def partitions_definition(values_by_partition)
  cartesian_product_generator.cartesian_product(values_by_partition).
    map { |partition_values_combination| partition_values_clause(partition_values_combination) }.
    join("\n")
end
permissive_statement(permissive) click to toggle source
# File lib/egis/partitions_generator.rb, line 31
def permissive_statement(permissive)
  'IF NOT EXISTS' if permissive
end
validate_partition_values(values_by_partition) click to toggle source
# File lib/egis/partitions_generator.rb, line 23
def validate_partition_values(values_by_partition)
  raise Errors::PartitionError, 'Partition value(s) missing' if partition_values_missing?(values_by_partition)
end