hefeixia
2021-02-18 5b8c95c760840f09910730943b21391e47187315
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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;
    }
}