class Egis::TableDataWiper

@!visibility private

Attributes

cartesian_product_generator[R]
s3_cleaner[R]
s3_location_parser[R]

Public Class Methods

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

Public Instance Methods

wipe_table_data(table, partitions) click to toggle source
# File lib/egis/table_data_wiper.rb, line 14
def wipe_table_data(table, partitions)
  bucket, location = s3_location_parser.parse_url(table.location)

  return s3_cleaner.delete(bucket, location) unless partitions

  partition_values_to_remove = partition_values_to_remove(table, partitions)

  validate_partition_values(partition_values_to_remove, partitions)

  remove_partition_files(bucket, location, partition_values_to_remove)
end

Private Instance Methods

partition_values_to_remove(table, partitions) click to toggle source
# File lib/egis/table_data_wiper.rb, line 30
def partition_values_to_remove(table, partitions)
  table_partitions = table.schema.partitions.map(&:name)
  given_partitions = partitions.keys

  partitions_to_delete = table_partitions.take_while { |partition| given_partitions.include?(partition) }
  partitions_to_delete.map { |partition_name| [partition_name, partitions.fetch(partition_name)] }.to_h
end
remove_partition_files(bucket, location, partitions_with_values) click to toggle source
# File lib/egis/table_data_wiper.rb, line 44
def remove_partition_files(bucket, location, partitions_with_values)
  cartesian_product_generator.cartesian_product(partitions_with_values).each do |partition_value_set|
    partition_prefix = partition_value_set.map { |name_value| name_value.join('=') }.join('/')
    s3_cleaner.delete(bucket, "#{location}/#{partition_prefix}")
  end
end
validate_partition_values(removed_partition_values, partitions) click to toggle source
# File lib/egis/table_data_wiper.rb, line 38
def validate_partition_values(removed_partition_values, partitions)
  return unless removed_partition_values.empty? || removed_partition_values.values.any?(&:empty?)

  raise Egis::Errors::PartitionError, "Incorrect partitions given: #{partitions}"
end