package org.atlasapi.persistence.event; import org.atlasapi.media.entity.Event; import org.atlasapi.media.entity.Topic; import com.metabroadcast.common.persistence.mongo.DatabasedMongo; import com.metabroadcast.common.persistence.mongo.MongoQueryBuilder; import com.metabroadcast.common.persistence.mongo.MongoSortBuilder; import com.google.common.base.Optional; import com.google.common.collect.Iterables; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import org.joda.time.DateTime; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import static com.metabroadcast.common.persistence.mongo.MongoBuilders.where; import static org.atlasapi.persistence.event.EventTranslator.END_TIME_KEY; import static org.atlasapi.persistence.event.EventTranslator.EVENT_GROUPS_KEY; import static org.atlasapi.persistence.event.EventTranslator.START_TIME_KEY; import static org.atlasapi.persistence.media.entity.IdentifiedTranslator.CANONICAL_URL; import static org.atlasapi.persistence.media.entity.IdentifiedTranslator.ID; public class MongoEventStore implements EventStore { private final DBCollection collection; private final EventTranslator translator = new EventTranslator(); public MongoEventStore(DatabasedMongo db) { this.collection = checkNotNull(db).collection("events"); } @Override public Event createOrUpdate(Event event) { checkArgument(event.getId() != null); collection.save(translator.toDBObject(event)); return event; } @Override public Optional<Event> fetch(Long id) { Event event = translator.fromDBObject(collection.findOne(where().idEquals(id).build())); return Optional.fromNullable(event); } @Override public Optional<Event> fetch(String uri) { Event event = translator.fromDBObject(collection.findOne(where().fieldEquals(CANONICAL_URL, uri).build())); return Optional.fromNullable(event); } @Override public Iterable<Event> fetch(Optional<Topic> eventGroup, Optional<DateTime> from) { MongoQueryBuilder query = where(); if (eventGroup.isPresent()) { query = query.fieldEquals(EVENT_GROUPS_KEY + "." + ID, eventGroup.get().getId()); } if (from.isPresent()) { query = query.fieldAfter(END_TIME_KEY, from.get()); } return Iterables.transform( getOrderedCursor(query.build()), translator.translateDBObject() ); } /** * orders cursor results by start date, ascending * @param query * @return */ private DBCursor getOrderedCursor(DBObject query) { return collection.find(query).sort(new MongoSortBuilder().ascending(START_TIME_KEY).build()); } }