X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdatabase%2Fmemory%2FMemoryDatabase.java;h=0b2c5a21c14869ec2f3545c0f4847bf69ba60b61;hb=b1057c2e5f77a74a3d64c5ad9ff6b0c5894c4a73;hp=67ea6710798633be7af108f0ddda902216822894;hpb=6c45481d2b225a7614bf7624cdb3e9fbddae1a94;p=Sone.git
diff --git a/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java b/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java
index 67ea671..0b2c5a2 100644
--- a/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java
+++ b/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java
@@ -19,6 +19,7 @@ package net.pterodactylus.sone.database.memory;
import static com.google.common.base.Optional.fromNullable;
import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.FluentIterable.from;
import static net.pterodactylus.sone.data.Reply.TIME_COMPARATOR;
import java.util.ArrayList;
@@ -52,18 +53,21 @@ import net.pterodactylus.util.config.Configuration;
import net.pterodactylus.util.config.ConfigurationException;
import com.google.common.base.Optional;
+import com.google.common.base.Predicate;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.SortedSetMultimap;
import com.google.common.collect.TreeMultimap;
import com.google.common.util.concurrent.AbstractService;
import com.google.inject.Inject;
+import com.google.inject.Singleton;
/**
* Memory-based {@link PostDatabase} implementation.
*
* @author David âBombeâ Roden
*/
+@Singleton
public class MemoryDatabase extends AbstractService implements Database {
/** The lock. */
@@ -81,9 +85,6 @@ public class MemoryDatabase extends AbstractService implements Database {
/** All posts by their Sones. */
private final Multimap sonePosts = HashMultimap.create();
- /** All posts by their recipient. */
- private final Multimap recipientPosts = HashMultimap.create();
-
/** Whether posts are known. */
private final Set knownPosts = new HashSet();
@@ -112,8 +113,10 @@ public class MemoryDatabase extends AbstractService implements Database {
private final Set knownPostReplies = new HashSet();
private final Map allAlbums = new HashMap();
+ private final Multimap soneAlbums = HashMultimap.create();
private final Map allImages = new HashMap();
+ private final Multimap soneImages = HashMultimap.create();
/**
* Creates a new memory database.
@@ -191,11 +194,15 @@ public class MemoryDatabase extends AbstractService implements Database {
/** {@inheritDocs} */
@Override
- public Collection getDirectedPosts(String recipientId) {
+ public Collection getDirectedPosts(final String recipientId) {
lock.readLock().lock();
try {
- Collection posts = recipientPosts.get(recipientId);
- return (posts == null) ? Collections.emptySet() : new HashSet(posts);
+ return from(sonePosts.values()).filter(new Predicate() {
+ @Override
+ public boolean apply(Post post) {
+ return post.getRecipientId().asSet().contains(recipientId);
+ }
+ }).toSet();
} finally {
lock.readLock().unlock();
}
@@ -223,9 +230,6 @@ public class MemoryDatabase extends AbstractService implements Database {
try {
allPosts.put(post.getId(), post);
getPostsFrom(post.getSone().getId()).add(post);
- if (post.getRecipientId().isPresent()) {
- getPostsTo(post.getRecipientId().get()).add(post);
- }
} finally {
lock.writeLock().unlock();
}
@@ -239,9 +243,6 @@ public class MemoryDatabase extends AbstractService implements Database {
try {
allPosts.remove(post.getId());
getPostsFrom(post.getSone().getId()).remove(post);
- if (post.getRecipientId().isPresent()) {
- getPostsTo(post.getRecipientId().get()).remove(post);
- }
post.getSone().removePost(post);
} finally {
lock.writeLock().unlock();
@@ -265,18 +266,12 @@ public class MemoryDatabase extends AbstractService implements Database {
Collection oldPosts = getPostsFrom(sone.getId());
for (Post post : oldPosts) {
allPosts.remove(post.getId());
- if (post.getRecipientId().isPresent()) {
- getPostsTo(post.getRecipientId().get()).remove(post);
- }
}
/* add new posts. */
getPostsFrom(sone.getId()).addAll(posts);
for (Post post : posts) {
allPosts.put(post.getId(), post);
- if (post.getRecipientId().isPresent()) {
- getPostsTo(post.getRecipientId().get()).add(post);
- }
}
} finally {
lock.writeLock().unlock();
@@ -293,9 +288,6 @@ public class MemoryDatabase extends AbstractService implements Database {
getPostsFrom(sone.getId()).clear();
for (Post post : sone.getPosts()) {
allPosts.remove(post.getId());
- if (post.getRecipientId().isPresent()) {
- getPostsTo(post.getRecipientId().get()).remove(post);
- }
}
} finally {
lock.writeLock().unlock();
@@ -445,6 +437,7 @@ public class MemoryDatabase extends AbstractService implements Database {
lock.writeLock().lock();
try {
allAlbums.put(album.getId(), album);
+ soneAlbums.put(album.getSone().getId(), album);
} finally {
lock.writeLock().unlock();
}
@@ -455,6 +448,7 @@ public class MemoryDatabase extends AbstractService implements Database {
lock.writeLock().lock();
try {
allAlbums.remove(album.getId());
+ soneAlbums.remove(album.getSone().getId(), album);
} finally {
lock.writeLock().unlock();
}
@@ -492,6 +486,7 @@ public class MemoryDatabase extends AbstractService implements Database {
lock.writeLock().lock();
try {
allImages.put(image.getId(), image);
+ soneImages.put(image.getSone().getId(), image);
} finally {
lock.writeLock().unlock();
}
@@ -502,6 +497,7 @@ public class MemoryDatabase extends AbstractService implements Database {
lock.writeLock().lock();
try {
allImages.remove(image.getId());
+ soneImages.remove(image.getSone().getId(), image);
} finally {
lock.writeLock().unlock();
}
@@ -607,23 +603,6 @@ public class MemoryDatabase extends AbstractService implements Database {
}
}
- /**
- * Gets all posts that are directed the given Sone, creating a new collection
- * if there is none yet.
- *
- * @param recipientId
- * The ID of the Sone to get the posts for
- * @return All posts
- */
- private Collection getPostsTo(String recipientId) {
- lock.readLock().lock();
- try {
- return recipientPosts.get(recipientId);
- } finally {
- lock.readLock().unlock();
- }
- }
-
/** Loads the known posts. */
private void loadKnownPosts() {
lock.writeLock().lock();