package frame.object.data;
|
|
import java.util.HashMap;
|
import java.util.Map;
|
|
import frame.object.meta.EntityMeta;
|
import frame.object.meta.Field;
|
import frame.variant.ValueType;
|
|
public class Indexes {
|
|
private EntitySet entitySet;
|
private Map<String, IIndex> indexMap;
|
private boolean dirty;
|
|
public Indexes(EntitySet entitySet) {
|
indexMap = new HashMap<String, IIndex>();
|
this.entitySet = entitySet;
|
}
|
|
public Entity getEntity(String fieldName, Object value) throws DataException {
|
if (fieldName == null) {
|
return null;
|
}
|
|
fieldName = fieldName.toLowerCase();
|
IIndex index = indexMap.get(fieldName);
|
|
if (dirty || index == null) {
|
index = createIndex(fieldName);
|
indexMap.put(fieldName, index);
|
}
|
|
Entity entity = index.get(value);
|
return entity;
|
}
|
|
private IIndex createIndex(String fieldName) throws DataException {
|
EntityMeta meta = entitySet.getEntityMeta();
|
Field field = meta.getField(fieldName);
|
|
if (field == null) {
|
throw new DataException("FieldNotExists", "field not exists: " + fieldName);
|
}
|
|
ValueType type = field.getValueType();
|
|
if (ValueType.String != type && ValueType.Long != type && ValueType.Int != type) {
|
throw new DataException("FieldCannotCreateIndex", "filed can not create index: " + fieldName);
|
}
|
|
Index index = new Index(meta.getTableName(), fieldName);
|
index.load(entitySet);
|
|
return index;
|
}
|
|
public void setDirty() {
|
dirty = true;
|
}
|
}
|