Add RankedTrend concern for trends classes (#29388)
				
					
				
			This commit is contained in:
		
							parent
							
								
									98e3dc2578
								
							
						
					
					
						commit
						8429d07454
					
				
							
								
								
									
										29
									
								
								app/models/concerns/ranked_trend.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								app/models/concerns/ranked_trend.rb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | |||||||
|  | # frozen_string_literal: true | ||||||
|  | 
 | ||||||
|  | module RankedTrend | ||||||
|  |   extend ActiveSupport::Concern | ||||||
|  | 
 | ||||||
|  |   included do | ||||||
|  |     scope :by_rank, -> { order(rank: :desc) } | ||||||
|  |     scope :ranked_below, ->(value) { where(rank: ..value) } | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   class_methods do | ||||||
|  |     def recalculate_ordered_rank | ||||||
|  |       connection | ||||||
|  |         .exec_update(<<~SQL.squish) | ||||||
|  |           UPDATE #{table_name} | ||||||
|  |           SET rank = inner_ordered.calculated_rank | ||||||
|  |           FROM ( | ||||||
|  |             SELECT id, row_number() OVER w AS calculated_rank | ||||||
|  |             FROM #{table_name} | ||||||
|  |             WINDOW w AS ( | ||||||
|  |               PARTITION BY language | ||||||
|  |               ORDER BY score DESC | ||||||
|  |             ) | ||||||
|  |           ) inner_ordered | ||||||
|  |           WHERE #{table_name}.id = inner_ordered.id | ||||||
|  |         SQL | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
| @ -12,6 +12,8 @@ | |||||||
| #  language        :string | #  language        :string | ||||||
| # | # | ||||||
| class PreviewCardTrend < ApplicationRecord | class PreviewCardTrend < ApplicationRecord | ||||||
|  |   include RankedTrend | ||||||
|  | 
 | ||||||
|   belongs_to :preview_card |   belongs_to :preview_card | ||||||
|   scope :allowed, -> { where(allowed: true) } |   scope :allowed, -> { where(allowed: true) } | ||||||
| end | end | ||||||
|  | |||||||
| @ -14,6 +14,8 @@ | |||||||
| # | # | ||||||
| 
 | 
 | ||||||
| class StatusTrend < ApplicationRecord | class StatusTrend < ApplicationRecord | ||||||
|  |   include RankedTrend | ||||||
|  | 
 | ||||||
|   belongs_to :status |   belongs_to :status | ||||||
|   belongs_to :account |   belongs_to :account | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -81,12 +81,12 @@ class Trends::Links < Trends::Base | |||||||
| 
 | 
 | ||||||
|     # Now that all trends have up-to-date scores, and all the ones below the threshold have |     # Now that all trends have up-to-date scores, and all the ones below the threshold have | ||||||
|     # been removed, we can recalculate their positions |     # been removed, we can recalculate their positions | ||||||
|     PreviewCardTrend.connection.exec_update('UPDATE preview_card_trends SET rank = t0.calculated_rank FROM (SELECT id, row_number() OVER w AS calculated_rank FROM preview_card_trends WINDOW w AS (PARTITION BY language ORDER BY score DESC)) t0 WHERE preview_card_trends.id = t0.id') |     PreviewCardTrend.recalculate_ordered_rank | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def request_review |   def request_review | ||||||
|     PreviewCardTrend.pluck('distinct language').flat_map do |language| |     PreviewCardTrend.pluck('distinct language').flat_map do |language| | ||||||
|       score_at_threshold  = PreviewCardTrend.where(language: language, allowed: true).order(rank: :desc).where('rank <= ?', options[:review_threshold]).first&.score || 0 |       score_at_threshold  = PreviewCardTrend.where(language: language, allowed: true).by_rank.ranked_below(options[:review_threshold]).first&.score || 0 | ||||||
|       preview_card_trends = PreviewCardTrend.where(language: language, allowed: false).joins(:preview_card) |       preview_card_trends = PreviewCardTrend.where(language: language, allowed: false).joins(:preview_card) | ||||||
| 
 | 
 | ||||||
|       preview_card_trends.filter_map do |trend| |       preview_card_trends.filter_map do |trend| | ||||||
|  | |||||||
| @ -74,12 +74,12 @@ class Trends::Statuses < Trends::Base | |||||||
| 
 | 
 | ||||||
|     # Now that all trends have up-to-date scores, and all the ones below the threshold have |     # Now that all trends have up-to-date scores, and all the ones below the threshold have | ||||||
|     # been removed, we can recalculate their positions |     # been removed, we can recalculate their positions | ||||||
|     StatusTrend.connection.exec_update('UPDATE status_trends SET rank = t0.calculated_rank FROM (SELECT id, row_number() OVER w AS calculated_rank FROM status_trends WINDOW w AS (PARTITION BY language ORDER BY score DESC)) t0 WHERE status_trends.id = t0.id') |     StatusTrend.recalculate_ordered_rank | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def request_review |   def request_review | ||||||
|     StatusTrend.pluck('distinct language').flat_map do |language| |     StatusTrend.pluck('distinct language').flat_map do |language| | ||||||
|       score_at_threshold = StatusTrend.where(language: language, allowed: true).order(rank: :desc).where('rank <= ?', options[:review_threshold]).first&.score || 0 |       score_at_threshold = StatusTrend.where(language: language, allowed: true).by_rank.ranked_below(options[:review_threshold]).first&.score || 0 | ||||||
|       status_trends      = StatusTrend.where(language: language, allowed: false).joins(:status).includes(status: :account) |       status_trends      = StatusTrend.where(language: language, allowed: false).joins(:status).includes(status: :account) | ||||||
| 
 | 
 | ||||||
|       status_trends.filter_map do |trend| |       status_trends.filter_map do |trend| | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user