package org.atlasapi.persistence.lookup; import com.google.common.base.Functions; import com.google.common.base.Optional; import com.google.common.base.Predicates; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import com.metabroadcast.common.query.Selection; import org.atlasapi.media.entity.Alias; import org.atlasapi.media.entity.Publisher; import org.atlasapi.persistence.content.listing.ContentListingProgress; import org.atlasapi.persistence.lookup.entry.LookupEntry; import org.atlasapi.persistence.lookup.entry.LookupEntryStore; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.StreamSupport; public class InMemoryLookupEntryStore implements LookupEntryStore { private Map<String,LookupEntry> uriStore; private Map<Long,LookupEntry> idStore; private Multimap<String,LookupEntry> identifierStore; private Multimap<String, LookupEntry> aliasValueStore; private Multimap<Alias, LookupEntry> aliasStore; public InMemoryLookupEntryStore() { uriStore = Maps.newConcurrentMap(); idStore = Maps.newConcurrentMap(); identifierStore = ArrayListMultimap.create(); aliasValueStore = ArrayListMultimap.create(); aliasStore = ArrayListMultimap.create(); } @Override public void store(LookupEntry entry) { uriStore.put(entry.uri(), entry); if (entry.id() != null) { idStore.put(entry.id(), entry); } for (String aliasUri : entry.aliasUrls()) { identifierStore.put(aliasUri, entry); } for (Alias alias : entry.aliases()) { aliasValueStore.put(alias.getValue(), entry); aliasStore.put(alias, entry); } } @Override public Iterable<LookupEntry> entriesForCanonicalUris(Iterable<String> uris) { return Iterables.filter(Iterables.transform(uris, Functions.forMap(uriStore, null)), Predicates.notNull()); } @Override public Iterable<LookupEntry> entriesForIds(Iterable<Long> ids) { return Iterables.filter(Iterables.transform(ids, Functions.forMap(idStore, null)), Predicates.notNull()); } @Override public Iterable<LookupEntry> entriesForIdentifiers(Iterable<String> identifiers, boolean useAliases) { return Iterables.concat(Iterables.filter(Iterables.transform(identifiers, Functions.forMap(identifierStore.asMap(),null)),Predicates.notNull())); } @Override public Iterable<LookupEntry> entriesForAliases(final Optional<String> namespace, Iterable<String> values) { if (namespace.isPresent()) { // create Aliases Iterable<Alias> aliases = StreamSupport.stream(values.spliterator(), false) .map(value -> new Alias(namespace.get(), value)) .collect(Collectors.toList()); return Iterables.concat(Iterables.filter(Iterables.transform(aliases, Functions.forMap(aliasStore.asMap(), null)), Predicates.notNull())); } else { return Iterables.concat(Iterables.filter(Iterables.transform(values, Functions.forMap(aliasValueStore.asMap(), null)), Predicates.notNull())); } } @Override public Map<String, Long> idsForCanonicalUris(Iterable<String> uris) { throw new UnsupportedOperationException(); } @Override public Iterable<LookupEntry> entriesForPublishers(Iterable<Publisher> publishers, Selection selection) { throw new UnsupportedOperationException(); } @Override public Iterable<LookupEntry> allEntriesForPublishers(Iterable<Publisher> publishers, ContentListingProgress progress) { throw new UnsupportedOperationException(); } }