Improve feed query performance.

This commit is contained in:
FireMasterK 2021-09-21 22:35:12 +01:00
parent aae627a423
commit 84bd3aa164
No known key found for this signature in database
GPG Key ID: 49451E4482CC5BCD

View File

@ -694,26 +694,30 @@ public class ResponseHelper {
Session s = DatabaseSessionFactory.createSession(); Session s = DatabaseSessionFactory.createSession();
User user = DatabaseHelper.getUserFromSessionWithSubscribed(s, session); User user = DatabaseHelper.getUserFromSession(s, session);
if (user != null) { if (user != null) {
@SuppressWarnings("unchecked")
List<Object[]> queryResults = s.createNativeQuery(
"select Video.*, Channel.* from videos as Video left join channels as Channel on Video.uploader_id = Channel.uploader_id inner join users_subscribed on users_subscribed.channel = Channel.uploader_id where users_subscribed.subscriber = :user")
.setParameter("user", user.getId()).addEntity("Video", Video.class)
.addEntity("Channel", me.kavin.piped.utils.obj.db.Channel.class).getResultList();
List<FeedItem> feedItems = new ObjectArrayList<>(); List<FeedItem> feedItems = new ObjectArrayList<>();
if (user.getSubscribed() != null && !user.getSubscribed().isEmpty()) { queryResults.forEach(obj -> {
Video video = (Video) obj[0];
me.kavin.piped.utils.obj.db.Channel channel = (me.kavin.piped.utils.obj.db.Channel) obj[1];
List<Video> videos = DatabaseHelper.getVideosFromChannelIds(s, user.getSubscribed()); feedItems.add(new FeedItem("/watch?v=" + video.getId(), video.getTitle(),
rewriteURL(video.getThumbnail()), "/channel/" + channel.getUploaderId(), channel.getUploader(),
rewriteURL(channel.getUploaderAvatar()), video.getViews(), video.getDuration(),
video.getUploaded(), channel.isVerified()));
videos.forEach(video -> { });
feedItems.add(new FeedItem("/watch?v=" + video.getId(), video.getTitle(),
rewriteURL(video.getThumbnail()), "/channel/" + video.getChannel().getUploaderId(),
video.getChannel().getUploader(), rewriteURL(video.getChannel().getUploaderAvatar()),
video.getViews(), video.getDuration(), video.getUploaded(),
video.getChannel().isVerified()));
});
Collections.sort(feedItems, (a, b) -> (int) (b.uploaded - a.uploaded)); Collections.sort(feedItems, (a, b) -> (int) (b.uploaded - a.uploaded));
}
s.close(); s.close();
@ -731,7 +735,7 @@ public class ResponseHelper {
Session s = DatabaseSessionFactory.createSession(); Session s = DatabaseSessionFactory.createSession();
User user = DatabaseHelper.getUserFromSessionWithSubscribed(s, session); User user = DatabaseHelper.getUserFromSession(s, session);
if (user != null) { if (user != null) {
@ -743,18 +747,25 @@ public class ResponseHelper {
if (user.getSubscribed() != null && !user.getSubscribed().isEmpty()) { if (user.getSubscribed() != null && !user.getSubscribed().isEmpty()) {
List<Video> videos = DatabaseHelper.getVideosFromChannelIds(s, user.getSubscribed()); @SuppressWarnings("unchecked")
List<Object[]> queryResults = s.createNativeQuery(
"select Video.*, Channel.* from videos as Video left join channels as Channel on Video.uploader_id = Channel.uploader_id inner join users_subscribed on users_subscribed.channel = Channel.uploader_id where users_subscribed.subscriber = :user")
.setParameter("user", user.getId()).addEntity("Video", Video.class)
.addEntity("Channel", me.kavin.piped.utils.obj.db.Channel.class).getResultList();
Collections.sort(videos, (a, b) -> (int) (b.getUploaded() - a.getUploaded())); Collections.sort(queryResults,
(a, b) -> (int) (((Video) b[0]).getUploaded() - ((Video) a[0]).getUploaded()));
final List<SyndEntry> entries = new ObjectArrayList<>(); final List<SyndEntry> entries = new ObjectArrayList<>();
for (Video video : videos) { for (Object[] result : queryResults) {
Video video = (Video) result[0];
me.kavin.piped.utils.obj.db.Channel channel = (me.kavin.piped.utils.obj.db.Channel) result[1];
SyndEntry entry = new SyndEntryImpl(); SyndEntry entry = new SyndEntryImpl();
SyndPerson person = new SyndPersonImpl(); SyndPerson person = new SyndPersonImpl();
person.setName(video.getChannel().getUploader()); person.setName(channel.getUploader());
person.setUri(Constants.FRONTEND_URL + "/channel/" + video.getChannel().getUploaderId()); person.setUri(Constants.FRONTEND_URL + "/channel/" + channel.getUploaderId());
entry.setAuthors(Collections.singletonList(person)); entry.setAuthors(Collections.singletonList(person));