package org.atlasapi.media.segment;
import static com.metabroadcast.common.persistence.mongo.MongoBuilders.where;
import static com.metabroadcast.common.persistence.mongo.MongoConstants.ID;
import static com.metabroadcast.common.persistence.mongo.MongoConstants.IN;
import static org.atlasapi.media.segment.SegmentTranslator.PUBLISHER_KEY;
import static org.atlasapi.media.segment.SegmentTranslator.SOURCE_ID_KEY;
import java.util.Map;
import com.metabroadcast.common.persistence.mongo.MongoConstants;
import org.atlasapi.media.entity.Publisher;
import com.google.common.base.Function;
import com.google.common.base.Functions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import com.metabroadcast.common.base.Maybe;
import com.metabroadcast.common.ids.NumberToShortStringCodec;
import com.metabroadcast.common.persistence.mongo.DatabasedMongo;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
public class MongoSegmentResolver implements SegmentResolver {
private DBCollection segments;
private SegmentTranslator translator;
private final NumberToShortStringCodec idCodec;
public MongoSegmentResolver(DatabasedMongo mongo, NumberToShortStringCodec idCodec) {
this.segments = mongo.collection("segments");
this.idCodec = idCodec;
this.translator = new SegmentTranslator(idCodec);
}
@Override
public Map<SegmentRef, Maybe<Segment>> resolveById(Iterable<SegmentRef> identifiers) {
Map<SegmentRef, Segment> resolved = Maps.uniqueIndex(Iterables.transform(segmentsForIdentifiers(identifiers), new Function<DBObject, Segment>() {
@Override
public Segment apply(DBObject input) {
return translator.fromDBObject(input, null);
}
}), Segment.TO_REF);
ImmutableMap.Builder<SegmentRef, Maybe<Segment>> result = ImmutableMap.builder();
for (SegmentRef segmentRef : identifiers) {
result.put(segmentRef, Maybe.fromPossibleNullValue(resolved.get(segmentRef)));
}
return result.build();
}
private DBCursor segmentsForIdentifiers(Iterable<SegmentRef> identifiers) {
return segments.find(new BasicDBObject(ID, new BasicDBObject(IN,decode(identifiers))));
}
private BasicDBList decode(Iterable<SegmentRef> identifiers) {
BasicDBList list = new BasicDBList();
list.addAll(ImmutableList.copyOf(Iterables.transform(identifiers,SegmentRef.TO_ID)));
return list;
}
@Override
public Maybe<Segment> resolveForSource(Publisher source, String id) {
DBObject dbo = segments.findOne(where().fieldEquals(PUBLISHER_KEY, source.key()).fieldEquals(MongoConstants.ID, id).build());
if (dbo == null) {
return Maybe.nothing();
}
return Maybe.just(translator.fromDBObject(dbo, null));
}
}