sclass ConceptFieldIndex implements IConceptIndex {
Class cc;
S field;
new HashMap objectToValue;
new MultiMap valueToObject;
*() {}
*(Concepts concepts, Class *cc, S *field) {
concepts.addConceptIndex(this);
for (A c : list(concepts, cc))
update(c);
concepts.addFieldIndex(cc, field, this);
}
public synchronized void update(Concept c) {
Val newValue = cast cget(c, field);
Val oldValue = objectToValue.get(c);
if (newValue == null || newValue != oldValue) {
valueToObject.remove(oldValue, (A) c);
valueToObject.put(newValue, (A) c);
objectToValue.put((A) c, newValue);
}
}
public synchronized void remove(Concept c) {
Val value = cast cget(c, field);
objectToValue.remove(c);
valueToObject.remove(value, (A) c);
}
synchronized A get(Val value) {
ret first(valueToObject.get(value));
}
synchronized L getAll(Val value) {
ret valueToObject.get(value);
}
}