package org.atlasapi.persistence.media.entity; import java.util.Set; import org.atlasapi.media.entity.EntityType; import org.atlasapi.media.entity.Publisher; import org.atlasapi.media.entity.SimilarContentRef; import com.google.common.base.Function; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Ordering; import com.metabroadcast.common.persistence.translator.TranslatorUtils; import com.mongodb.BasicDBList; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; public class SimilarContentRefTranslator { private static final String URI_KEY = "uri"; private static final String ID_KEY = "id"; private static final String ENTITY_TYPE_KEY = "type"; private static final String PUBLISHERS_WITH_AVAILABLE_CONTENT_KEY = "publishersWithAvailableContent"; private static final String PUBLISHERS_WITH_UPCOMING_CONTENT_KEY = "publishersWithUpcomingContent"; public Set<SimilarContentRef> fromDBObjects(Iterable<DBObject> dbos) { return ImmutableSet.copyOf(Iterables.transform(dbos, TO_SIMILAR_CONTENT_REF)); } public BasicDBList toDBList(Iterable<SimilarContentRef> childRefs) { BasicDBList list = new BasicDBList(); list.addAll(ImmutableList.copyOf(Iterables.transform(childRefs, TO_DBO))); return list; } private static Function<SimilarContentRef, DBObject> TO_DBO = new Function<SimilarContentRef, DBObject>() { @Override public DBObject apply(SimilarContentRef similar) { DBObject dbo = new BasicDBObject(); TranslatorUtils.from(dbo, URI_KEY, similar.getUri()); TranslatorUtils.from(dbo, ID_KEY, similar.getId()); TranslatorUtils.from(dbo, ENTITY_TYPE_KEY, similar.getEntityType().toString()); TranslatorUtils.fromList(dbo, Ordering.natural().sortedCopy( Iterables.transform(similar.getPublishersWithAvailableContent(), Publisher.TO_KEY)), PUBLISHERS_WITH_AVAILABLE_CONTENT_KEY); TranslatorUtils.fromList(dbo, Ordering.natural().sortedCopy( Iterables.transform(similar.getPublishersWithUpcomingContent(), Publisher.TO_KEY)), PUBLISHERS_WITH_UPCOMING_CONTENT_KEY); return dbo; } }; private static Function<DBObject, SimilarContentRef> TO_SIMILAR_CONTENT_REF = new Function<DBObject, SimilarContentRef>() { @Override public SimilarContentRef apply(DBObject dbo) { String uri = TranslatorUtils.toString(dbo, URI_KEY); EntityType type = EntityType.from((String) dbo.get(ENTITY_TYPE_KEY)); Long id = (Long) dbo.get(ID_KEY); int score = 0; return SimilarContentRef.builder() .withId(id) .withEntityType(type) .withScore(score) .withUri(uri) .withPublishersWithAvailableContent(publishersFrom(dbo, PUBLISHERS_WITH_AVAILABLE_CONTENT_KEY)) .withPublishersWithUpcomingContent(publishersFrom(dbo, PUBLISHERS_WITH_UPCOMING_CONTENT_KEY)) .build(); } }; private static Set<Publisher> publishersFrom(DBObject dbo, String key) { return ImmutableSet.copyOf(Iterables.transform(TranslatorUtils.toList(dbo, key), Publisher.FROM_KEY)); } // todo: order the publishers on write }