package com.sissi.persistent.impl; import java.util.Collection; import java.util.List; import com.mongodb.BasicDBObjectBuilder; import com.mongodb.DBObject; import com.sissi.config.Dictionary; import com.sissi.config.MongoConfig; import com.sissi.context.JID; import com.sissi.persistent.PersistentElement; import com.sissi.persistent.Recover; import com.sissi.persistent.RecoverDirection; import com.sissi.persistent.RecoverQuery; import com.sissi.protocol.Element; import com.sissi.protocol.message.Message; import com.sissi.protocol.message.MessageType; /** * 索引策略: {"to":1,"class":1,"type":1,"timestamp":1} * * @author kim 2014年3月6日 */ public class MongoRecover implements Recover { /** * {"timestamp":-1} */ private final DBObject sort = BasicDBObjectBuilder.start(Dictionary.FIELD_TIMESTAMP, -1).get(); private final MongoConfig config; private final DefaultParams def; private final DefaultParams threshold; private final List<PersistentElement> elements; /** * @param config * @param def 默认值 * @param threshold 临界值 * @param elements */ public MongoRecover(MongoConfig config, DefaultParams def, DefaultParams threshold, List<PersistentElement> elements) { super(); this.def = def; this.config = config; this.elements = elements; this.threshold = threshold; } @Override public Collection<Element> pull(JID jid, RecoverQuery query) { return new Elements(this.config.collection().find(this.build(jid, query)).sort(this.sort).limit(query.limit(this.threshold.limit(), this.def.limit())), this.elements); } /** * {"to":jid.bare,"class":Xxx,"type":"groupchat","timestamp":{"$gte/$lte":Xxx}} * * @param jid * @param query * @return */ private DBObject build(JID jid, RecoverQuery query) { return BasicDBObjectBuilder.start().add(Dictionary.FIELD_TO, jid.asStringWithBare()).add(Dictionary.FIELD_CLASS, Message.class.getSimpleName()).add(Dictionary.FIELD_TYPE, MessageType.GROUPCHAT.toString()).add(Dictionary.FIELD_TIMESTAMP, BasicDBObjectBuilder.start(query.direction(RecoverDirection.DOWN) ? "$gte" : "$lte", query.since(this.threshold.since(), this.def.since())).get()).get(); } }