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 indexMap; private boolean dirty; public Indexes(EntitySet entitySet) { indexMap = new HashMap(); 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; } }