Skip to content

Commit

Permalink
Merge pull request #8 from Nebiross/master
Browse files Browse the repository at this point in the history
Добавил правило исключающее "свои" треки для пользователя, которому делается рекомендация в функции getrecommendedtrackid_v1(userid uuid)
  • Loading branch information
netvoxlab authored Apr 25, 2017
2 parents 83498b8 + f8ef8da commit 605c4b7
Showing 1 changed file with 25 additions and 14 deletions.
39 changes: 25 additions & 14 deletions dbScripts/ownradio_db_v3.sql
Original file line number Diff line number Diff line change
Expand Up @@ -1273,7 +1273,7 @@ ALTER FUNCTION getnexttrackid_v7(uuid)

-- DROP FUNCTION public.getrecommendedtrackid_v1(uuid);

CREATE OR REPLACE FUNCTION public.getrecommendedtrackid_v1(userid uuid)
CREATE OR REPLACE FUNCTION public.getrecommendedtrackid_v1(in_userid uuid)
RETURNS uuid AS
$BODY$

Expand All @@ -1283,34 +1283,44 @@ preferenced_track uuid;
BEGIN
-- Соединяем таблицу tracks с таблицой сумм произведений рейтинга трека на коэффициент
-- у конкретного пользователя для возможности вывода дополнительной информации о треке
-- в отладочных целях
-- в отладочных целях и для фильтра по столбцам tracks
SELECT tracks.recid INTO preferenced_track
--tracks.recid, table2.sum_rate, tracks.localdevicepathupload, tracks.path
FROM tracks
INNER JOIN (
-- Группируем по треку и считаем сумму произведений рейтингов на коэффициент для
-- каждого из них
--Группируем по треку и считаем сумму произведений рейтингов на коэффициент для
--каждого из них
SELECT trackid, SUM(track_rating) AS sum_rate
FROM(
-- Запрашиваем таблицу с рейтингом всех треков, оцененных пользователями, которые имеют коэффициент
-- с исходным, умноженным на их коэффициент
--Запрашиваем таблицу с рейтингом всех треков, оцененных пользователями, которые имеют коэффициент
--с исходным, умноженным на их коэффициент
SELECT ratings.trackid, ratings.ratingsum * ratios.ratio AS track_rating, ratings.userid, ratios.ratio
FROM ratings, ratios
-- Будем считать рейтинги треков, только у пользователей с положительным коэффициентом с исходным
WHERE ratios.ratio > 0 AND (ratings.userid = ratios.userid2 AND ratios.userid1 = $1 OR ratings.userid = ratios.userid1 AND ratios.userid2 = $1)
FROM ratings
INNER JOIN ratios
--Выбираем рейтинги треков у тех пользователей, у которых есть пересечение
--с исходным в таблице ratios (кэффициенты совпадения вкусов), проверяя сначала
--с левой стороны
ON ((ratings.userid = ratios.userid2 AND ratios.userid1 = in_userid)
-- потом с правой
OR (ratings.userid = ratios.userid1 AND ratios.userid2 = in_userid))
AND ratings.userid <> in_userid --Выбирем все оценки треков, кроме оценок, данных исходным пользователем
AND ratios.ratio > 0 --Считать рейтинги треков, только у пользователей с положительным коэффициентом совпадения вкусов с исходным
) AS TracksRatings
GROUP BY trackid
ORDER BY sum_rate DESC
) AS table2
ON tracks.recid = table2.trackid
AND tracks.isexist = 1
AND tracks.iscensorial <> 0
AND tracks.isexist = 1 --Трек должен существовать на сервере
AND tracks.iscensorial <> 0 --Трек не должен быть помечен как нецензурный
AND tracks.length >= 120
--Трек не должен был выдаваться исходному пользователю в течении последних двух месяцев
AND tracks.recid NOT IN (SELECT trackid FROM downloadtracks
WHERE reccreated > localtimestamp - INTERVAL '1 day')
-- В итоге рекомендоваться будут только треки с положительной суммой произведений рейтингов на коэффициенты
AND sum_rate > 0
WHERE reccreated > localtimestamp - INTERVAL '2 months' AND deviceid = in_userid)
AND sum_rate > 0 --В итоге рекомендоваться будут только треки с положительной суммой произведений рейтингов на коэффициенты
ORDER BY table2.sum_rate DESC
--Сортировка по второму столбцу нужна для случаев, когда получаем много треков с одинковым table2.sum_rate,
--в таких случаях план выполнения запроса меняется и производительность сильно падает
,tracks.recid
LIMIT 1;
RETURN preferenced_track;
END;
Expand All @@ -1319,3 +1329,4 @@ $BODY$
COST 100;
ALTER FUNCTION public.getrecommendedtrackid_v1(uuid)
OWNER TO postgres;

0 comments on commit 605c4b7

Please sign in to comment.