package org.atlasapi.persistence.output; import static com.metabroadcast.common.persistence.mongo.MongoBuilders.select; import static com.metabroadcast.common.persistence.mongo.MongoBuilders.where; import javax.annotation.Nullable; import org.atlasapi.media.entity.Container; import org.atlasapi.persistence.content.ContentCategory; import com.google.common.base.Function; import com.google.common.base.Joiner; import com.google.common.collect.Iterables; import com.metabroadcast.common.persistence.mongo.DatabasedMongo; import com.metabroadcast.common.persistence.mongo.MongoBuilders; import com.metabroadcast.common.persistence.mongo.MongoConstants; import com.metabroadcast.common.time.Clock; import com.metabroadcast.common.time.SystemClock; import com.mongodb.DBCollection; import com.mongodb.DBObject; public class MongoRecentlyBroadcastChildrenResolver implements RecentlyBroadcastChildrenResolver { private static final Function<DBObject, String> DBO_ID = new Function<DBObject, String>() { @Override public String apply(@Nullable DBObject input) { return (String) input.get(MongoConstants.ID); } }; private static final String transmissionEndTimeKey = Joiner.on(".").join("versions", "broadcasts", "transmissionEndTime"); private static final String containerKey = "container"; private final DBObject select = select().field(MongoConstants.ID).build(); private final DBObject sort = MongoBuilders.sort().descending(transmissionEndTimeKey).build(); private final DBCollection collection; private final Clock clock; public MongoRecentlyBroadcastChildrenResolver(DatabasedMongo mongo) { this(mongo, new SystemClock()); } public MongoRecentlyBroadcastChildrenResolver(DatabasedMongo mongo, Clock clock) { this.collection = mongo.collection(ContentCategory.CHILD_ITEM.tableName()); this.clock = clock; } @Override public Iterable<String> recentlyBroadcastChildrenFor(Container container, int limit) { return Iterables.transform(recentlyBroadcast(container, limit), DBO_ID); } private Iterable<DBObject> recentlyBroadcast(Container container, int limit) { DBObject where = where() .fieldEquals(containerKey, container.getCanonicalUri()) .fieldBeforeOrAt(transmissionEndTimeKey, clock.now()) .build(); return collection.find(where, select).sort(sort).limit(limit); } }