Skip to content

Instantly share code, notes, and snippets.

@sadfuzzy
Created April 8, 2016 18:46
Show Gist options
  • Save sadfuzzy/d046d3875ed8d643b7a32aa1a36e9c76 to your computer and use it in GitHub Desktop.
Save sadfuzzy/d046d3875ed8d643b7a32aa1a36e9c76 to your computer and use it in GitHub Desktop.
class RecountMediamapService
def initialize(task)
@task = task
@comparisons_ids = Film.where.not(kinopoisk_rate: nil).where.not(kinopoisk_rate: 0).where('kinopoisk_num > 10').order(year: :desc, kinopoisk_rate: :desc, kinopoisk_num: :desc).limit(20000).pluck(:id)
@film = Film.includes(:genres, :subgenres, :countries, :tags, :people).find(@task.task.to_i)
end
def recount
begin
kbs = {}
@comparisons_ids.each do |comparison_id|
comparison = Film.includes(:genres, :subgenres, :countries, :tags, :people).find(comparison_id)
unless comparison.id == @film.id
kb = genres_count(comparison) + subgenres_count(comparison) + tags_count(comparison) + countries_count(comparison) + people_count(comparison)
kbs.update({ comparison.id => kb })
end
end
kbs = kbs.sort {|a,b| b[1]<=>a[1]}
kbs[0...50].each do |item|
Likefilm.where(film_id: @film.id, likefilm_id: item[0]).first_or_create(kb: item[1])
end
@task.complete
rescue => e
@task.error(e)
end
end
protected
def genres_count(comparison)
genres_ids = []
@film.genres.each do |genre|
genres_ids << genre.id
end
like_genres_ids = []
comparison.genres.each do |genre|
like_genres_ids << genre.id
end
ids = genres_ids & like_genres_ids
genres_size = ids.size
if genres_size == 0
genres_count = 0
elsif genres_size == 1
genres_count = 10
elsif genres_size == 2
genres_count = 20
elsif genres_size >= 3
genres_count = 30
end
end
def subgenres_count(comparison)
subgenres_ids = []
@film.subgenres.each do |subgenre|
subgenres_ids << subgenre.id
end
like_subgenres_ids = []
comparison.subgenres.each do |subgenre|
like_subgenres_ids << subgenre.id
end
if subgenres_ids.size == 0 || like_subgenres_ids.size == 0
subgenres_count=0
else
ids = subgenres_ids & like_subgenres_ids
subgenres_size = ids.size
if subgenres_size >= 1
subgenres_count = 30
elsif subgenres_size == 0
subgenres_count = 0
end
end
end
def tags_count(comparison)
tags_ids = []
@film.tags.each do |tag|
tags_ids << tag.id
end
like_tags_ids = []
comparison.tags.each do |tag|
like_tags_ids << tag.id
end
ids = tags_ids & like_tags_ids
tags_size = ids.size
if tags_size == 0
tags_count = 0
elsif tags_size == 1
tags_count = 20
elsif tags_size == 2
tags_count = 25
elsif tags_size >= 3
tags_count = 30
end
end
def countries_count(comparison)
countries_ids = []
@film.countries.each do |country|
countries_ids << country.id
end
like_countries_ids = []
comparison.countries.each do |country|
like_countries_ids << country.id
end
ids = countries_ids & like_countries_ids
if ids.size >= 1
countries_count = 10
else
countries_count = 0
end
end
def people_count(comparison)
directors_ids = []
writers_ids = []
actors_ids = []
@film.films_people.each do |person|
case person.role
when 1
directors_ids << person.person_id
when 2
writers_ids << person.person_id
when 3
actors_ids << person.person_id
end
end
like_directors_ids = []
like_writers_ids = []
like_actors_ids = []
comparison.films_people.each do |person|
case person.role
when 1
like_directors_ids << person.person_id
when 2
like_writers_ids << person.person_id
when 3
like_actors_ids << person.person_id
end
end
directors = directors_ids & like_directors_ids
writers = writers_ids & like_writers_ids
actors = actors_ids & like_actors_ids
directors_size = directors.size
if directors_size == 0
directors_count = 0
elsif directors_size >= 1
directors_count = 20
end
writers_size = writers.size
if writers_size == 0
writers_count = 0
elsif writers_size >= 1
writers_count = 20
end
actors_size = actors.size
if actors_size == 0
actors_count = 0
elsif actors_size == 1
actors_count = 7
elsif actors_size >= 2
actors_count = 10
end
people_count = directors_count + writers_count + actors_count
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment