/**
* Open a map with the given builder. The map is automatically create if it
* does not yet exist. If a map with this name is already open, this map is
* returned.
*
* @param <K> the key type
* @param <V> the value type
* @param name the name of the map
* @param builder the map builder
* @return the map
*/
public <M extends MVMap<K, V>, K, V> M openMap(String name, MVMap.MapBuilder<M, K, V> builder) {
//检查store是否已关闭,如果已关闭则抛出异常
checkOpen();
//meta是在创建store的时间新建的,一个默认的mvconcurrentmap,map的root是一个空的page,version为-1,所以这里首次获取x为null,get方法会从root page进行2分搜索,查出key对应的值。调用page的2分查找方法,因为当前root为空page,所以返回-1,导致get方法返回null
String x = meta.get("name." + name);
int id;
long root;
HashMap<String, String> c;
M map;
if (x != null) {
id = Integer.parseInt(x);
@SuppressWarnings("unchecked")
M old = (M) maps.get(id);
if (old != null) {
return old;
}
map = builder.create();
String config = meta.get("map." + x);
c = DataUtils.parseMap(config);
c.put("id", x);
map.init(this, c);
String r = meta.get("root." + id);
root = r == null ? 0 : Long.parseLong(r);
} else {
//因为返回null,创建一个空的hashmap
c = New.hashMap();
id = ++lastMapId;
c.put("id", Integer.toString(id));
c.put("createVersion", Long.toString(currentVersion));
//如果第一次,id为1,createVersion为0,只有metamap的id为0
map = builder.create();
map.init(this, c);
//metamap里加入这个map的信息,行如key:map.1,value:name:test,因为map的createVersion为0和type为null,不进行拼接,按照page格式写入
meta.put("map." + id, map.asString(name));
//加入形如key:name.test,value:1
meta.put("name." + name, Integer.toString(id));
markMetaChanged();
root = 0;
}
//设置一个空的root page
map.setRootPos(root, -1);
maps.put(id, map);
return map;
}