Added methods to retrieve most recent liked feeds and most recent comments by user
git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portal/social-networking-library@130946 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
parent
0754b015fe
commit
bdaf2fef33
|
@ -10,6 +10,7 @@ import java.util.HashSet;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import javax.mail.internet.AddressException;
|
||||
import javax.mail.internet.InternetAddress;
|
||||
|
@ -43,6 +44,7 @@ import org.slf4j.Logger;
|
|||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.netflix.astyanax.MutationBatch;
|
||||
import com.netflix.astyanax.RowCallback;
|
||||
import com.netflix.astyanax.connectionpool.OperationResult;
|
||||
import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
|
||||
import com.netflix.astyanax.model.Column;
|
||||
|
@ -55,9 +57,8 @@ import com.netflix.astyanax.serializers.StringSerializer;
|
|||
import com.netflix.astyanax.util.RangeBuilder;
|
||||
/**
|
||||
* @author Massimiliano Assante ISTI-CNR
|
||||
*
|
||||
* @author Costantino Perciante ISTI-CNR
|
||||
* This class is used for querying and adding data to Cassandra via Astyanax High Level API
|
||||
*
|
||||
*/
|
||||
public final class DBCassandraAstyanaxImpl implements DatabookStore {
|
||||
|
||||
|
@ -1416,6 +1417,70 @@ public final class DBCassandraAstyanaxImpl implements DatabookStore {
|
|||
return toReturn;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public List<Comment> getRecentCommentsByUserAndDate(final String userid,
|
||||
final long timeInMillis) throws Exception {
|
||||
|
||||
long start = System.currentTimeMillis();
|
||||
|
||||
final List<Comment> commentsByUser = new ArrayList<Comment>();
|
||||
final AtomicInteger maxRetryExecutions = new AtomicInteger(10);
|
||||
|
||||
/**
|
||||
* See https://github.com/Netflix/astyanax/wiki/Reading-Data for more information (Query all with callback)
|
||||
*/
|
||||
conn.getKeyspace().prepareQuery(cf_Comments)
|
||||
.getAllRows()
|
||||
.setRowLimit(100) // Read in blocks of 100
|
||||
.withColumnRange(new RangeBuilder().setLimit(10).build())
|
||||
.executeWithCallback(new RowCallback<String, String>() {
|
||||
@Override
|
||||
public void success(Rows<String, String> rows) {
|
||||
synchronized (commentsByUser) {
|
||||
nextRow: for (Row<String, String> row : rows) {
|
||||
for(Column<String> column: row.getColumns())
|
||||
if(column.getName().equals("Userid"))
|
||||
if(column.getStringValue().equals(userid)){
|
||||
try{
|
||||
Comment c = readCommentById(row.getKey());
|
||||
Feed f = readFeed(c.getFeedid());
|
||||
if(c.getTime().getTime() >= timeInMillis &&
|
||||
(f.getType() == FeedType.TWEET || f.getType() == FeedType.SHARE || f.getType() == FeedType.PUBLISH))
|
||||
commentsByUser.add(c);
|
||||
}catch(Exception e){
|
||||
_log.error("Unable to read comment with id" + row.getKey(), e);
|
||||
}
|
||||
continue nextRow;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean failure(ConnectionException e) {
|
||||
// decrement value
|
||||
int currentValue = maxRetryExecutions.decrementAndGet();
|
||||
if(currentValue <= 0){
|
||||
_log.error("Error while fetching user's recent comments ... repeating operation");
|
||||
return true;
|
||||
}else
|
||||
{
|
||||
_log.error("Too many errors while fetching user's comments, returning");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Collections.sort(commentsByUser, Collections.reverseOrder());
|
||||
_log.debug("Time taken to retrieve most recent user's comments is " + (System.currentTimeMillis() - start));
|
||||
|
||||
return commentsByUser;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
|
@ -1587,6 +1652,57 @@ public final class DBCassandraAstyanaxImpl implements DatabookStore {
|
|||
return toReturn;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public List<Feed> getRecentLikedFeedsByUserAndDate(String userid,
|
||||
long timeInMillis) throws IllegalArgumentException {
|
||||
|
||||
List<Feed> toReturn = new ArrayList<Feed>();
|
||||
|
||||
Date now = new Date();
|
||||
if (timeInMillis > now.getTime())
|
||||
throw new IllegalArgumentException("the timeInMillis must be before today");
|
||||
|
||||
if(userid == null || userid.isEmpty())
|
||||
throw new IllegalArgumentException("the userId parameter cannot be null/empty");
|
||||
|
||||
// get the list of liked feeds
|
||||
List<String> likedFeedsIdsByUser = getAllLikedFeedIdsByUser(userid);
|
||||
|
||||
if(likedFeedsIdsByUser != null){
|
||||
|
||||
for(int i = likedFeedsIdsByUser.size() - 1; i >= 0; i--){
|
||||
String feedId = likedFeedsIdsByUser.get(i);
|
||||
try{
|
||||
|
||||
// retrieve the feed
|
||||
Feed toCheck = readFeed(feedId);
|
||||
boolean isFeedOk = (toCheck.getType() == FeedType.TWEET || toCheck.getType() == FeedType.SHARE || toCheck.getType() == FeedType.PUBLISH);
|
||||
|
||||
// retrieve the like of the user for the feed
|
||||
if(isFeedOk){
|
||||
List<Like> likes = getAllLikesByFeed(feedId);
|
||||
for (Like like : likes) {
|
||||
if(like.getTime().getTime() >= timeInMillis && like.getUserid().equals(userid))
|
||||
toReturn.add(toCheck);
|
||||
}
|
||||
}
|
||||
|
||||
}catch(Exception e){
|
||||
_log.error("Skipped feed with id " + feedId, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// please check consider that if a user made like recently to an old post, well it could happen that this
|
||||
// post comes first than a newer post in the toReturn list. Thus we need to sort it.
|
||||
Collections.sort(toReturn, Collections.reverseOrder());
|
||||
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
|
@ -1732,24 +1848,24 @@ public final class DBCassandraAstyanaxImpl implements DatabookStore {
|
|||
_log.error("Unable to retrieve the list of feeds for hashtag" + column.getName() + " in vre " + vreid);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if(feeds.isEmpty()){
|
||||
|
||||
|
||||
_log.info("There are no feeds containing hashtag " + column.getName() + " in vre " + vreid);
|
||||
continue;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
// retrieve the most recent one among these feeds
|
||||
Collections.sort(feeds, Collections.reverseOrder());
|
||||
|
||||
|
||||
if(feeds.get(0).getTime().getTime() < timestamp){
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// else..
|
||||
int curValue = Integer.parseInt(column.getStringValue());
|
||||
|
||||
|
||||
if (curValue > 0)
|
||||
toReturn.put(column.getName(), curValue);
|
||||
}
|
||||
|
|
|
@ -1,24 +1,6 @@
|
|||
package org.gcube.portal.databook.server;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.gcube.portal.databook.shared.Feed;
|
||||
import org.gcube.portal.databook.shared.ex.ColumnNameNotFoundException;
|
||||
import org.gcube.portal.databook.shared.ex.FeedIDNotFoundException;
|
||||
import org.gcube.portal.databook.shared.ex.FeedTypeNotFoundException;
|
||||
import org.gcube.portal.databook.shared.ex.PrivacyLevelTypeNotFoundException;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
public class DatabookCassandraTest {
|
||||
private static DBCassandraAstyanaxImpl store;
|
||||
|
@ -35,6 +17,36 @@ public class DatabookCassandraTest {
|
|||
|
||||
}
|
||||
|
||||
// @Test
|
||||
// public void getRecentCommentsByUserAndDate() throws Exception{
|
||||
//
|
||||
// String userid = "costantino.perciante";
|
||||
// Calendar oneYearAgo = Calendar.getInstance();
|
||||
// oneYearAgo.set(Calendar.YEAR, oneYearAgo.get(Calendar.YEAR) - 1);
|
||||
//
|
||||
// List<Comment> res = store.getRecentCommentsByUserAndDate(userid, oneYearAgo.getTimeInMillis());
|
||||
//
|
||||
// for (Comment comment : res) {
|
||||
// System.out.println("Result is " + comment);
|
||||
// }
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
// }
|
||||
// @Test
|
||||
// public void getRecentLikedFeedsByUser(){
|
||||
//
|
||||
// String userid = "costantino.perciante";
|
||||
// Calendar oneYearAgo = Calendar.getInstance();
|
||||
// oneYearAgo.set(Calendar.YEAR, oneYearAgo.get(Calendar.YEAR) - 1);
|
||||
//
|
||||
// List<Feed> result = store.getRecentLikedFeedsByUserAndDate(userid, oneYearAgo.getTimeInMillis());
|
||||
//
|
||||
// for (Feed feed : result) {
|
||||
// System.out.println("Result is " + feed);
|
||||
// }
|
||||
// }
|
||||
// @Test
|
||||
// public void getHashTagsFilteredByTime() throws PrivacyLevelTypeNotFoundException, FeedTypeNotFoundException, FeedIDNotFoundException, ColumnNameNotFoundException{
|
||||
//
|
||||
|
|
|
@ -32,7 +32,7 @@ import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
|
|||
|
||||
/**
|
||||
* @author Massimiliano Assante ISTI-CNR
|
||||
*
|
||||
* @author Costantino Perciante ISTI-CNR
|
||||
* <class>DatabookStore</class> is the high level interface for querying and adding data to DatabookStore
|
||||
*/
|
||||
public interface DatabookStore {
|
||||
|
@ -236,7 +236,6 @@ public interface DatabookStore {
|
|||
* @throws ColumnNameNotFoundException
|
||||
*/
|
||||
List<Notification> getUnreadNotificationsByUser(String userid) throws NotificationTypeNotFoundException, ColumnNameNotFoundException, NotificationIDNotFoundException;
|
||||
|
||||
/**
|
||||
*
|
||||
* @param userid user identifier
|
||||
|
@ -280,7 +279,7 @@ public interface DatabookStore {
|
|||
* @throws NotificationChannelTypeNotFoundException self explaining
|
||||
*/
|
||||
Map<NotificationType, NotificationChannelType[]> getUserNotificationPreferences(String userid) throws NotificationTypeNotFoundException, NotificationChannelTypeNotFoundException;
|
||||
|
||||
|
||||
/**
|
||||
* @param commentId comment unique identifier
|
||||
* @return the comment belonging to the commentId
|
||||
|
@ -297,13 +296,18 @@ public interface DatabookStore {
|
|||
* return all the comments belonging to the feedid
|
||||
*/
|
||||
List<Comment> getAllCommentByFeed(String feedid);
|
||||
/**
|
||||
* @param userid user identifier
|
||||
* @param timeInMillis time in milliseconds from which you want to start retrieve the feeds
|
||||
* @return a list of comments (sorted starting from the most recent one) made by the user since timeInMillis up to now
|
||||
*/
|
||||
List<Comment> getRecentCommentsByUserAndDate(String userid, long timeInMillis) throws Exception;
|
||||
/**
|
||||
* edit a comment
|
||||
* @param commentid the comment identifier to edit
|
||||
* @return true if success, false otherwise
|
||||
*/
|
||||
boolean editComment(Comment comment) throws PrivacyLevelTypeNotFoundException, FeedTypeNotFoundException, ColumnNameNotFoundException, CommentIDNotFoundException, FeedIDNotFoundException;
|
||||
|
||||
/**
|
||||
* delete a comment
|
||||
* @param commentid the comment identifier to delete
|
||||
|
@ -341,6 +345,13 @@ public interface DatabookStore {
|
|||
* return all the feeds a user has liked
|
||||
*/
|
||||
List<Feed> getAllLikedFeedsByUser(String userid, int limit) throws PrivacyLevelTypeNotFoundException, FeedTypeNotFoundException, FeedIDNotFoundException, ColumnNameNotFoundException;
|
||||
|
||||
/**
|
||||
* @param userid user identifier
|
||||
* @param timeInMillis time in milliseconds from which you want to start retrieve the feeds
|
||||
* @return the likes made to feeds in the range from: today to: timeInMillis
|
||||
*/
|
||||
List<Feed> getRecentLikedFeedsByUserAndDate(String userid, long timeInMillis) throws IllegalArgumentException;
|
||||
/**
|
||||
* @param feedid feed identifier
|
||||
* return all the likes belonging to the feedid
|
||||
|
@ -428,14 +439,14 @@ public interface DatabookStore {
|
|||
* @return the list of attachments of the feed feedId, starting from the second one (first attachment is included in Feed instance already)
|
||||
*/
|
||||
List<Attachment> getAttachmentsByFeedId(String feedId) throws FeedIDNotFoundException;
|
||||
|
||||
|
||||
/**
|
||||
* Retrieve all the ids of the vre
|
||||
* @return the set of ids of the vre available or empty list in case of errors.
|
||||
* @throws ConnectionException
|
||||
*/
|
||||
public List<String> getAllVREIds() throws ConnectionException;
|
||||
|
||||
|
||||
/**
|
||||
* close the connection to the underlying database
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue