CartoDB/cartodb20

View on GitHub
lib/tasks/fix_unique_legends.rake

Summary

Maintainability
Test Coverage
namespace :cartodb do
  desc "fixes duplicated unique legends"
  task fix_unique_legends: :environment do
    query = 'SELECT layer_id, count(*) from legends group by layer_id having count(*) > 1'
    ActiveRecord::Base.connection.execute(query).each do |row|
      legends = Carto::Layer.find(row['layer_id']).legends
      legend_types = Carto::Legend::LEGEND_TYPES_PER_ATTRIBUTE.keys
      legends_per_type = legend_types.reduce({}) { |m, o| m.merge(o => []) }
      legend_per_type = legends.reduce(legends_per_type) do |m, legend|
        legend_types.reduce(m) do |m2, t|
          m2[t] << legend if Carto::Legend::LEGEND_TYPES_PER_ATTRIBUTE[t].include?(legend.type)
          m2
        end
      end
      legend_per_type.each { |_, l| l.sort_by(&:updated_at).slice(0..l.count - 2).each(&:destroy) if l.size > 1 }
    end
  end
end