package com.github.seanlinwang.tkv;
import java.util.HashMap;
import java.util.Map;
/**
* 类似LocalImpl中的IndexItem.
* LocalImpl中的IndexItem没有key,因为key->IndexItem的映射记录在keyValueIndex Map中.
* LocalImpl中的IndexItem的tagPosMap记录了tagName->position映射.
* 而这里的Meta的tags记录tagName->Tag的映射,Tag对象由pre,post,name,pos这几个属性构成.
*
* 为什么这里的Meta有key?,因为用于HDFS实现的索引无法在内存中实现,只好存储成文件的形式.
* 而LocalImpl中用keyValueIndex来记录key->IndexItem的映射,IndexItem就无需key.
*
* 这里Meta用Bean的形式构造,保存成文件的时候,因为有key属性,key也会写到文件中.
*/
public class Meta {
//key要写在元数据(索引)中,这是最关键的.因为要get(key)时给的条件就是key
//没有存keyLength,不像Local的实现是计算key.length存放在keyLength字段里
//HDFS的实现是给定固定长度的keyLength(默认64个字节)
private String key;
//value在dataStore中的offset,这样get(key)时获取出这个值,然后到dataStore的offset位置开始读取
//要读取多少个字节才能取出放入时候的value呢,下一个字段length就是了
//Meta中没有存储value,因为这个工作是dataStore要做的.
private long offset;
//value的长度.把length也记录在索引中.在get(key)时一并把offset,length都取出来,就可以正确地取出value.
private int length;
//记录都有对应的标签.和key一样,没有存储tagsLength,也是固定的字节数,默认是128个字节.
private Map<String, Tag> tags;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public long getOffset() {
return offset;
}
public void setOffset(long offset) {
this.offset = offset;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public Map<String, Tag> getTags() {
return tags;
}
public void addTag(String tagName) {
if (tags == null) {
tags = new HashMap<String, Tag>();
}
Tag t = new Tag();
t.setName(tagName);
tags.put(tagName, t);
}
public void addTag(Tag tag) {
if (tags == null) {
tags = new HashMap<String, Tag>();
}
tags.put(tag.getName(), tag);
}
public boolean containsTag(String tagName) {
if (tags == null) {
return false;
}
return this.tags.containsKey(tagName);
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Meta [key=");
builder.append(key);
builder.append(", offset=");
builder.append(offset);
builder.append(", length=");
builder.append(length);
builder.append(", tags=");
builder.append(tags);
builder.append("]");
return builder.toString();
}
}