From: Tom Hughes Date: Sun, 9 Feb 2025 15:40:49 +0000 (+0000) Subject: Use subqueries to find nested members more efficiently X-Git-Tag: live~88^2 X-Git-Url: https://git.openstreetmap.org./rails.git/commitdiff_plain/ba481319f4c86528054c0490a0846ea7474c6612?ds=inline;hp=--cc Use subqueries to find nested members more efficiently --- ba481319f4c86528054c0490a0846ea7474c6612 diff --git a/app/controllers/api/nodes/relations_controller.rb b/app/controllers/api/nodes/relations_controller.rb index 0f0409e19..c6b33eab8 100644 --- a/app/controllers/api/nodes/relations_controller.rb +++ b/app/controllers/api/nodes/relations_controller.rb @@ -6,13 +6,12 @@ module Api before_action :set_request_formats def index - relation_ids = RelationMember.where(:member_type => "Node", :member_id => params[:node_id]).collect(&:relation_id).uniq - - @relations = [] - - Relation.find(relation_ids).each do |relation| - @relations << relation if relation.visible - end + @relations = Relation + .visible + .where(:id => RelationMember.where( + :member_type => "Node", + :member_id => params[:node_id] + ).select(:relation_id)) # Render the result respond_to do |format| diff --git a/app/controllers/api/nodes/ways_controller.rb b/app/controllers/api/nodes/ways_controller.rb index 2a71f1903..cdbdc07d0 100644 --- a/app/controllers/api/nodes/ways_controller.rb +++ b/app/controllers/api/nodes/ways_controller.rb @@ -10,9 +10,11 @@ module Api # :node_id parameter. note that this used to return deleted ways as well, but # this seemed not to be the expected behaviour, so it was removed. def index - way_ids = WayNode.where(:node_id => params[:node_id]).collect { |ws| ws.id[0] }.uniq - - @ways = Way.where(:id => way_ids, :visible => true) + @ways = Way + .visible + .where(:id => WayNode.where( + :node_id => params[:node_id] + ).select(:way_id)) # Render the result respond_to do |format| diff --git a/app/controllers/api/relations/relations_controller.rb b/app/controllers/api/relations/relations_controller.rb index 1769e1396..9b8292526 100644 --- a/app/controllers/api/relations/relations_controller.rb +++ b/app/controllers/api/relations/relations_controller.rb @@ -6,13 +6,12 @@ module Api before_action :set_request_formats def index - relation_ids = RelationMember.where(:member_type => "Relation", :member_id => params[:relation_id]).collect(&:relation_id).uniq - - @relations = [] - - Relation.find(relation_ids).each do |relation| - @relations << relation if relation.visible - end + @relations = Relation + .visible + .where(:id => RelationMember.where( + :member_type => "Relation", + :member_id => params[:relation_id] + ).select(:relation_id)) # Render the result respond_to do |format| diff --git a/app/controllers/api/ways/relations_controller.rb b/app/controllers/api/ways/relations_controller.rb index fcd8b40dd..4188dfe4e 100644 --- a/app/controllers/api/ways/relations_controller.rb +++ b/app/controllers/api/ways/relations_controller.rb @@ -6,13 +6,12 @@ module Api before_action :set_request_formats def index - relation_ids = RelationMember.where(:member_type => "Way", :member_id => params[:way_id]).collect(&:relation_id).uniq - - @relations = [] - - Relation.find(relation_ids).each do |relation| - @relations << relation if relation.visible - end + @relations = Relation + .visible + .where(:id => RelationMember.where( + :member_type => "Way", + :member_id => params[:way_id] + ).select(:relation_id)) # Render the result respond_to do |format|