47 lines
1.4 KiB
Ruby
47 lines
1.4 KiB
Ruby
require 'csv'
|
|
|
|
module Carto
|
|
module Export
|
|
class MapStatistics
|
|
|
|
attr_reader :filepath
|
|
|
|
def initialize(types: ['derived'])
|
|
@types = types
|
|
@headers_written = false
|
|
@filepath = "/tmp/map_statistics_#{Time.now.strftime('%Y%m%d%H%M%S')}.csv"
|
|
end
|
|
|
|
def run!
|
|
csv = CSV.open(filepath, 'wb', headers: true)
|
|
Carto::Visualization.where(type: @types).find_each { |vis| process_row(statistics_for_visualization(vis), csv) if vis.user.present? }
|
|
csv.close
|
|
end
|
|
|
|
private
|
|
|
|
def process_row(row, csv)
|
|
if !@headers_written
|
|
csv << row.keys
|
|
@headers_written = true
|
|
end
|
|
csv << row.values
|
|
end
|
|
|
|
def statistics_for_visualization(visualization)
|
|
analysis_nodes = visualization.analyses.flat_map { |a| a.analysis_node.descendants }.uniq(&:id)
|
|
{
|
|
id: visualization.id,
|
|
total_data_layers: visualization.data_layers.count,
|
|
total_analysis_nodes: analysis_nodes.count,
|
|
non_source_analysis_nodes: analysis_nodes.reject(&:source?).count,
|
|
analysis_nodes_per_layer: (analysis_nodes.count.to_f / visualization.layers.count.to_f).round(2),
|
|
user_account_type: visualization.user.account_type,
|
|
creation_date: visualization.created_at,
|
|
type: visualization.builder? ? 'builder' : 'editor'
|
|
}
|
|
end
|
|
end
|
|
end
|
|
end
|