aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/juick/service
diff options
context:
space:
mode:
authorGravatar Vitaly Takmazov2019-04-04 20:34:45 +0300
committerGravatar Vitaly Takmazov2019-04-04 20:34:45 +0300
commit0ea0026b4ac5a26b2312e329476a632548ad5fee (patch)
tree450e56545d02912ad4adce3eaa71c7a0aff8617e /src/main/java/com/juick/service
parent55e6924b822417940f7aae2075acae3492684bbb (diff)
Recommendations in feeds
Diffstat (limited to 'src/main/java/com/juick/service')
-rw-r--r--src/main/java/com/juick/service/MessagesService.java3
-rw-r--r--src/main/java/com/juick/service/MessagesServiceImpl.java41
2 files changed, 24 insertions, 20 deletions
diff --git a/src/main/java/com/juick/service/MessagesService.java b/src/main/java/com/juick/service/MessagesService.java
index 922170db..080319cc 100644
--- a/src/main/java/com/juick/service/MessagesService.java
+++ b/src/main/java/com/juick/service/MessagesService.java
@@ -21,6 +21,7 @@ import com.juick.Message;
import com.juick.Reaction;
import com.juick.User;
import com.juick.model.ResponseReply;
+import org.apache.commons.lang3.tuple.Pair;
import java.net.URI;
import java.util.*;
@@ -68,7 +69,7 @@ public interface MessagesService {
User getMessageAuthor(int mid);
- List<User> getMessageRecommendations(int mid);
+ List<Pair<Integer, User>> getMessagesRecommendations(Collection<Integer> mids);
List<Integer> getAll(int visitorUid, int before);
diff --git a/src/main/java/com/juick/service/MessagesServiceImpl.java b/src/main/java/com/juick/service/MessagesServiceImpl.java
index 7dbfe1dd..2ec78494 100644
--- a/src/main/java/com/juick/service/MessagesServiceImpl.java
+++ b/src/main/java/com/juick/service/MessagesServiceImpl.java
@@ -28,6 +28,8 @@ import com.juick.server.www.WebApp;
import com.juick.util.MessageUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
@@ -50,15 +52,7 @@ import java.sql.SQLException;
import java.sql.Timestamp;
import java.sql.Types;
import java.time.Instant;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
+import java.util.*;
import java.util.stream.Collectors;
/**
@@ -490,21 +484,23 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
@Transactional(readOnly = true)
@Override
- public List<User> getMessageRecommendations(final int mid) {
- return getJdbcTemplate().query(
- "SELECT DISTINCT users.id, users.nick, favorites.user_uri FROM favorites " +
- "INNER JOIN users ON (favorites.message_id = ? AND favorites.user_id = users.id) " +
+ public List<Pair<Integer, User>> getMessagesRecommendations(final Collection<Integer> mids) {
+ return getNamedParameterJdbcTemplate().query(
+ "SELECT DISTINCT favorites.message_id, users.id, users.nick, favorites.user_uri FROM favorites " +
+ "INNER JOIN users ON (favorites.user_id = users.id) " +
"INNER JOIN messages m ON favorites.message_id=m.message_id WHERE favorites.like_id=1 " +
"AND NOT EXISTS (SELECT 1 FROM bl_users WHERE " +
"(user_id = favorites.user_id AND bl_user_id = m.user_id) " +
- "OR (user_id = m.user_id AND bl_user_id = favorites.user_id))",
+ "OR (user_id = m.user_id AND bl_user_id = favorites.user_id)) " +
+ "AND favorites.message_id IN (:mids)",
+ new MapSqlParameterSource("mids", mids),
(rs, rowNum) -> {
User user = new User();
- user.setUid(rs.getInt(1));
- user.setName(rs.getString(2));
- user.setUri(URI.create(rs.getString(3)));
- return user;
- }, mid);
+ user.setUid(rs.getInt(2));
+ user.setName(rs.getString(3));
+ user.setUri(URI.create(rs.getString(4)));
+ return new ImmutablePair<>(rs.getInt(1), user);
+ });
}
@Transactional(readOnly = true)
@@ -916,6 +912,13 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ
msgs.forEach(i -> i.setEntities(MessageUtils.getEntities(i)));
+ List<Pair<Integer, User>> allRecommendations = getMessagesRecommendations(mids);
+
+ msgs.forEach(m -> {
+ m.setRecommendations(new HashSet<User>(allRecommendations.stream()
+ .filter(r -> r.getLeft().equals(m.getMid())).map(Pair::getRight).collect(Collectors.toList())));
+ });
+
return msgs;
}
return Collections.emptyList();