package org.atlasapi.persistence.media.entity;
import java.util.Comparator;
import org.atlasapi.media.entity.AudienceStatistics;
import org.atlasapi.media.entity.Demographic;
import com.google.common.base.Function;
import com.google.common.collect.ComparisonChain;
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.BasicDBObject;
import com.mongodb.DBObject;
public class AudienceStatisticsTranslator {
private static final String TOTAL_VIEWERS_KEY = "totalViewers";
private static final String VIEWING_SHARE_KEY = "viewingShare";
private static final String DEMOGRAPHICS_KEY = "demographics";
private static final Ordering<Demographic> DEMOGRAPHICS_ORDERING =
Ordering.from(new Comparator<Demographic>() {
@Override
public int compare(Demographic o1, Demographic o2) {
return ComparisonChain.start()
.compare(o1.getType(), o2.getType())
.result();
}
});
private final DemographicTranslator demographicsTranslator;
public AudienceStatisticsTranslator() {
this.demographicsTranslator = new DemographicTranslator();
}
public DBObject toDBObject(DBObject dbObject, AudienceStatistics model) {
TranslatorUtils.from(dbObject, TOTAL_VIEWERS_KEY, model.getTotalViewers());
TranslatorUtils.from(dbObject, VIEWING_SHARE_KEY, model.getViewingShare());
encodeDemographics(dbObject, model);
return dbObject;
}
public AudienceStatistics fromDBObject(DBObject dbObject) {
return new AudienceStatistics(
TranslatorUtils.toLong(dbObject, TOTAL_VIEWERS_KEY),
TranslatorUtils.toFloat(dbObject, VIEWING_SHARE_KEY),
decodeDemographics(dbObject));
}
@SuppressWarnings("unchecked")
private Iterable<Demographic> decodeDemographics(DBObject dbObject) {
if (!dbObject.containsField(DEMOGRAPHICS_KEY)) {
return ImmutableSet.of();
}
return Iterables.transform((Iterable<DBObject>) dbObject.get(DEMOGRAPHICS_KEY),
new Function<DBObject, Demographic>() {
@Override
public Demographic apply(DBObject input) {
return demographicsTranslator.fromDBObject(input);
}
}
);
}
private void encodeDemographics(DBObject dbObject, AudienceStatistics model) {
if (model.getDemographics().isEmpty()) {
return;
}
TranslatorUtils.fromIterable(dbObject,
DEMOGRAPHICS_KEY,
DEMOGRAPHICS_ORDERING.sortedCopy(model.getDemographics()),
new Function<Demographic, DBObject>() {
@Override
public DBObject apply(Demographic demographic) {
return demographicsTranslator.toDBObject(new BasicDBObject(), demographic);
}
});
}
}