/** * */ package com.meidusa.amoeba.mongodb.handler.merge; import java.util.ArrayList; import java.util.List; import org.bson.BSONObject; import com.meidusa.amoeba.mongodb.packet.RequestMongodbPacket; import com.meidusa.amoeba.mongodb.packet.ResponseMongodbPacket; /** * * @author Struct * */ public class GetCollectionFunctionMerge implements FunctionMerge{ public static Number addNumber(BSONObject source, BSONObject info,String name){ Number sourceNumber = (Number)source.get(name); Number infoNumber = (Number)info.get(name); if(sourceNumber != null && infoNumber != null){ sourceNumber = MergeMath.add(sourceNumber,infoNumber); }else{ if(sourceNumber == null){ sourceNumber = infoNumber; } } source.put(name, sourceNumber); return sourceNumber; } @Override public ResponseMongodbPacket mergeResponse(RequestMongodbPacket requestPacket, List<ResponseMongodbPacket> multiResponsePacket) { ResponseMongodbPacket result = new ResponseMongodbPacket(); BSONObject cmdResult = null; BSONObject source = null; for(ResponseMongodbPacket response :multiResponsePacket){ if(response.numberReturned > 0){ BSONObject responseResult = response.documents.get(0); if(cmdResult == null){ cmdResult = responseResult; } BSONObject collection = (BSONObject)responseResult.get("retval"); if(source == null){ source = collection; }else{ Number count = addNumber(source, collection, "count"); Number size = addNumber(source, collection, "size"); addNumber(source, collection, "storageSize"); addNumber(source, collection, "totalIndexSize"); source.put("paddingFactor",MergeMath.div(addNumber(source, collection, "paddingFactor"), 2)); source.put("avgObjSize",MergeMath.div(size,count)); } } } cmdResult.put("retval", source); result.documents = new ArrayList<BSONObject>(); if(cmdResult != null){ result.documents.add(cmdResult); } result.responseTo = requestPacket.requestID; result.numberReturned = (result.documents == null?0:result.documents.size()); return result; } }