package com.sissi.ucenter.search.impl; import java.util.List; import com.mongodb.BasicDBObjectBuilder; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.sissi.config.MongoConfig; import com.sissi.context.JIDBuilder; import com.sissi.field.FieldMapping; import com.sissi.field.Fields; import com.sissi.ucenter.impl.MongoFieldsContext; import com.sissi.ucenter.search.SearchContext; /** * 索引策略: 动态,由FieldMapping所能解析的Field.name决定. 默认索引策略: {"NICK":1} * * @author kim 2014年6月6日 */ abstract class MongoSearchContext extends MongoFieldsContext implements SearchContext { private final short limit; private final DBObject filter; private final MongoConfig config; protected final JIDBuilder jidBuilder; public MongoSearchContext(MongoConfig config, JIDBuilder jidBuilder, short limit, List<String> filters, FieldMapping mapping) { super(mapping); this.limit = limit; this.config = config; this.jidBuilder = jidBuilder; this.filter = this.filter(filters); } private DBObject filter(List<String> filters) { BasicDBObjectBuilder builder = BasicDBObjectBuilder.start(); for (String filter : filters) { builder.add(filter, 0); } return builder.get(); } @Override public <T extends Fields> T search(Fields source, Fields target, Class<T> clazz) { try (DBCursor cursor = this.config.collection().find(super.entities(source, BasicDBObjectBuilder.start()), this.filter).limit(this.limit)) { while (cursor.hasNext()) { this.build(cursor.next(), target); } } return clazz.cast(target); } abstract protected Fields build(DBObject each, Fields target); }