53 lines
2.0 KiB
Ruby
53 lines
2.0 KiB
Ruby
require 'active_record'
|
|
|
|
class Carto::VisualizationQueryIncluder
|
|
|
|
def initialize(query)
|
|
@query = query
|
|
end
|
|
|
|
def include_dependent_visualization_count(params = {})
|
|
join_sql = "LEFT OUTER JOIN (#{dependencies_query(params)}) AS dependencies ON dependencies.id = visualizations.id"
|
|
@query.joins(join_sql)
|
|
end
|
|
|
|
def include_favorited(user_id)
|
|
@query.joins(
|
|
%{
|
|
LEFT JOIN likes
|
|
ON "likes"."subject" = "visualizations"."id"
|
|
AND "likes"."actor" = #{ActiveRecord::Base::sanitize(user_id)}
|
|
}.squish
|
|
)
|
|
end
|
|
|
|
private
|
|
|
|
def dependencies_query(params)
|
|
select_count = 'count(distinct(visualizations.id, dependency_visualizations.id)) as dependent_visualization_count'
|
|
query = Carto::Visualization.select(:id, select_count)
|
|
.joins(dependency_joins)
|
|
.where(dependency_visualizations: { type: 'derived' })
|
|
.group(:id)
|
|
filtered_query = Carto::VisualizationQueryFilterer.new(query).filter(params)
|
|
filtered_query.to_sql
|
|
end
|
|
|
|
def dependency_joins
|
|
%{
|
|
INNER JOIN "maps" "dependency_maps" ON "dependency_maps"."id" = "visualizations"."map_id"
|
|
INNER JOIN "user_tables" "dependency_user_tables" ON "dependency_user_tables"."map_id" = "dependency_maps"."id"
|
|
INNER JOIN "layers_user_tables" "dependency_layers_user_tables"
|
|
ON "dependency_layers_user_tables"."user_table_id" = "dependency_user_tables"."id"
|
|
INNER JOIN "layers" "dependency_layers"
|
|
ON "dependency_layers"."id" = "dependency_layers_user_tables"."layer_id"
|
|
INNER JOIN "layers_maps" "dependency_layers_maps"
|
|
ON "dependency_layers_maps"."layer_id" = "dependency_layers"."id"
|
|
INNER JOIN "maps" "dependency_maps_2" ON "dependency_maps_2"."id" = "dependency_layers_maps"."map_id"
|
|
INNER JOIN "visualizations" "dependency_visualizations"
|
|
ON "dependency_visualizations"."map_id" = "dependency_maps_2"."id"
|
|
}.squish
|
|
end
|
|
|
|
end
|