package org.atlasapi.persistence.ids;
import java.math.BigInteger;
import com.metabroadcast.common.ids.IdGenerator;
import com.metabroadcast.common.ids.SubstitutionTableNumberCodec;
import com.metabroadcast.common.persistence.mongo.DatabasedMongo;
import com.metabroadcast.common.persistence.mongo.MongoConstants;
import com.metabroadcast.common.persistence.mongo.MongoQueryBuilder;
import com.metabroadcast.common.persistence.translator.TranslatorUtils;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.WriteConcern;
import static com.metabroadcast.common.persistence.mongo.MongoBuilders.update;
public class MongoSequentialIdGenerator implements IdGenerator {
private static final String VALUE_KEY = "nextId";
private final DBCollection collection;
private final String idGroup;
private final SubstitutionTableNumberCodec codec;
private final long initialId;
public MongoSequentialIdGenerator(DatabasedMongo mongo, String idGroup) {
this.collection = mongo.collection("id");
this.idGroup = idGroup;
this.codec = new SubstitutionTableNumberCodec();
this.initialId = (long) Math.pow(codec.getAlphabet().size(), 3); //minimum id length 3 chars.
ensureFieldExists();
}
private void ensureFieldExists() {
DBObject find = collection.findOne(new MongoQueryBuilder().idEquals(idGroup).build());
if (find == null) {
BasicDBObject basicDBObject = new BasicDBObject(MongoConstants.ID, idGroup);
basicDBObject.put(VALUE_KEY, initialId);
collection.insert(basicDBObject, WriteConcern.SAFE);
}
}
@Override
public String generate() {
return codec.encode(BigInteger.valueOf(generateRaw()));
}
public long generateRaw() {
return TranslatorUtils.toLong(
collection.findAndModify(
new MongoQueryBuilder().idEquals(idGroup).build(),
update().incField(VALUE_KEY, 1).build()
),
VALUE_KEY
);
}
}