/**
*
*/
package com.meidusa.amoeba.mongodb.handler.merge;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.bson.BSONObject;
import org.bson.BasicDBList;
import org.bson.types.BasicBSONList;
import com.meidusa.amoeba.mongodb.packet.RequestMongodbPacket;
import com.meidusa.amoeba.mongodb.packet.ResponseMongodbPacket;
import com.meidusa.amoeba.util.StringUtil;
/**
*
* @author Struct
*
*/
public class ListDBFunctionMerge implements FunctionMerge{
public static void merge(BSONObject source, BSONObject info){
if(StringUtil.equals((String)source.get("name"), (String)info.get("name"))){
double sizeOndisk1 = Double.valueOf((Double)source.get("sizeOnDisk"));
double sizeOndisk2 = Double.valueOf((Double)info.get("sizeOnDisk"));
source.put("sizeOnDisk", (sizeOndisk1 + sizeOndisk2));
source.put("empty", ((Boolean)source.get("empty") || (Boolean)info.get("empty")));
}
}
@Override
public ResponseMongodbPacket mergeResponse(RequestMongodbPacket requestPacket,
List<ResponseMongodbPacket> multiResponsePacket) {
ResponseMongodbPacket result = new ResponseMongodbPacket();
BSONObject cmdResult = null;
Map<String,BSONObject> dbMap = new HashMap<String,BSONObject>();
for(ResponseMongodbPacket response :multiResponsePacket){
if(response.numberReturned > 0){
BSONObject nextResult = response.documents.get(0);
BasicBSONList databases = (BasicBSONList)nextResult.get("databases");
for(Object object: databases){
BSONObject info = (BSONObject)object;
String name = (String)info.get("name");
BSONObject source = dbMap.get(name);
if(source == null){
dbMap.put(name, info);
}else{
merge(source,info);
}
}
if(cmdResult == null){
cmdResult = nextResult;
}else{
double totalSize = (Double)cmdResult.get("totalSize");
double totalSize1 = totalSize + (Double)nextResult.get("totalSize");
cmdResult.put("totalSize", totalSize1);
}
}
}
result.documents = new ArrayList<BSONObject>();
if(cmdResult != null){
BasicDBList listDB = new BasicDBList();
for(BSONObject bson : dbMap.values()){
listDB.add(bson);
}
cmdResult.put("databases", listDB);
result.documents.add(cmdResult);
}
result.responseTo = requestPacket.requestID;
result.numberReturned = (result.documents == null?0:result.documents.size());
return result;
}
}