package org.zstack.search; import com.google.gson.Gson; import org.zstack.header.search.InventoryDoc; import org.zstack.utils.gson.GsonUtil; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class ESBulkBuilder { private class Bulk { private String _index; private String _type; private String _id; } private class Index { private Bulk index; } private class Delete { private Bulk delete; } private static Gson gson; static { GsonUtil gutil = new GsonUtil(); gson = gutil.create(); } private Map<Object, String> bulks = new HashMap<Object, String>(20); private Set<String> toIndexName = new HashSet<String>(5); private Set<String> toDeleteName = new HashSet<String>(5); private boolean empty = true; private Bulk createBulk(String indexName, String typeName, String id) { Bulk b = new Bulk(); b._index = indexName; b._type = typeName; b._id = id; return b; } public ESBulkBuilder addIndexBulk(String indexName, String typeName, InventoryDoc doc) { Bulk b = createBulk(indexName, typeName, doc.getIndexId()); Index i = new Index(); i.index = b; bulks.put(i, doc.getDoc()); toIndexName.add(typeName); empty = false; return this; } public ESBulkBuilder addDeleteBulk(String indexName, String typeName, String id) { Bulk b = createBulk(indexName, typeName, id); Delete d = new Delete(); d.delete = b; bulks.put(d, ""); toDeleteName.add(typeName); empty = false; return this; } public String build() { StringBuilder sb = new StringBuilder(); for (Map.Entry<Object, String> e : bulks.entrySet()) { Object metaData = e.getKey(); sb.append(gson.toJson(metaData)); sb.append("\n"); if (!"".equals(e.getValue())) { sb.append(e.getValue()); sb.append("\n"); } } return sb.toString(); } @Override public String toString() { return build(); } public String getAffectedInventoryNames() { StringBuilder sb = new StringBuilder(); sb.append("inventory to index: ").append(toIndexName.toString()).append(", ").append("inventory to delete: ").append(toDeleteName.toString()); return sb.toString(); } public boolean isEmpty() { return empty; } }