@@ -79,28 +79,33 @@ def show
7979 @changeset = Changeset . find ( params [ :id ] )
8080 case turbo_frame_request_id
8181 when "changeset_nodes"
82- @node_pages , @nodes = paginate ( :old_nodes , :conditions => { :changeset_id => @changeset . id } , :order => [ :node_id , :version ] , :per_page => 20 , :parameter => "node_page" )
83- render :partial => "elements" , :locals => { :type => "node" , :elements => @nodes , :pages => @node_pages }
82+ load_nodes
83+
84+ render :partial => "elements" , :locals => { :type => "node" , :paginator => @nodes_paginator }
8485 when "changeset_ways"
85- @way_pages , @ways = paginate ( :old_ways , :conditions => { :changeset_id => @changeset . id } , :order => [ :way_id , :version ] , :per_page => 20 , :parameter => "way_page" )
86- render :partial => "elements" , :locals => { :type => "way" , :elements => @ways , :pages => @way_pages }
86+ load_ways
87+
88+ render :partial => "elements" , :locals => { :type => "way" , :paginator => @ways_paginator }
8789 when "changeset_relations"
88- @relation_pages , @relations = paginate ( :old_relations , :conditions => { :changeset_id => @changeset . id } , :order => [ :relation_id , :version ] , :per_page => 20 , :parameter => "relation_page" )
89- render :partial => "elements" , :locals => { :type => "relation" , :elements => @relations , :pages => @relation_pages }
90+ load_relations
91+
92+ render :partial => "elements" , :locals => { :type => "relation" , :paginator => @relations_paginator }
9093 else
9194 @comments = if current_user &.moderator?
9295 @changeset . comments . unscope ( :where => :visible ) . includes ( :author )
9396 else
9497 @changeset . comments . includes ( :author )
9598 end
96- @node_pages , @nodes = paginate ( :old_nodes , :conditions => { :changeset_id => @changeset . id } , :order => [ :node_id , :version ] , :per_page => 20 , :parameter => "node_page" )
97- @way_pages , @ways = paginate ( :old_ways , :conditions => { :changeset_id => @changeset . id } , :order => [ :way_id , :version ] , :per_page => 20 , :parameter => "way_page" )
98- @relation_pages , @relations = paginate ( :old_relations , :conditions => { :changeset_id => @changeset . id } , :order => [ :relation_id , :version ] , :per_page => 20 , :parameter => "relation_page" )
99+ load_nodes
100+ load_ways
101+ load_relations
102+
99103 if @changeset . user . active? && @changeset . user . data_public?
100104 changesets = conditions_nonempty ( @changeset . user . changesets )
101105 @next_by_user = changesets . where ( "id > ?" , @changeset . id ) . reorder ( :id => :asc ) . first
102106 @prev_by_user = changesets . where ( :id => ...@changeset . id ) . reorder ( :id => :desc ) . first
103107 end
108+
104109 render :layout => map_layout
105110 end
106111 rescue ActiveRecord ::RecordNotFound
@@ -163,4 +168,50 @@ def conditions_bbox(changesets, bbox)
163168 def conditions_nonempty ( changesets )
164169 changesets . where ( "num_changes > 0" )
165170 end
171+
172+ def load_nodes
173+ nodes = OldNode . where ( :changeset => @changeset ) . order ( :node_id , :version )
174+ @nodes_paginator = ElementsPaginator . new ( nodes , 20 , params [ :node_page ] )
175+ end
176+
177+ def load_ways
178+ ways = OldWay . where ( :changeset => @changeset ) . order ( :way_id , :version )
179+ @ways_paginator = ElementsPaginator . new ( ways , 20 , params [ :way_page ] )
180+ end
181+
182+ def load_relations
183+ relations = OldRelation . where ( :changeset => @changeset ) . order ( :relation_id , :version )
184+ @relations_paginator = ElementsPaginator . new ( relations , 20 , params [ :relation_page ] )
185+ end
186+
187+ class ElementsPaginator
188+ attr_reader :elements_count , :elements_per_page , :current_page , :current_page_elements
189+
190+ def initialize ( elements , elements_per_page , current_page = 1 )
191+ @elements_count = elements . count
192+ @elements_per_page = elements_per_page . to_i
193+ @current_page = current_page . to_i . clamp ( 1 , pages_count )
194+ @current_page_elements = elements . offset ( @elements_per_page * ( @current_page - 1 ) ) . limit ( @elements_per_page )
195+ end
196+
197+ def pages_count
198+ [ 1 , 1 + ( ( elements_count - 1 ) / elements_per_page ) ] . max
199+ end
200+
201+ def pages
202+ 1 ..pages_count
203+ end
204+
205+ def pages_window ( window_size , page = current_page )
206+ [ page - window_size , pages . first ] . max ..[ page + window_size , pages . last ] . min
207+ end
208+
209+ def lower_element_number ( page = current_page )
210+ ( elements_per_page * ( page - 1 ) ) + 1
211+ end
212+
213+ def upper_element_number ( page = current_page )
214+ [ elements_per_page * page , elements_count ] . min
215+ end
216+ end
166217end
0 commit comments