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