package foundation.data.entity; import java.sql.PreparedStatement; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import foundation.data.meta.field.Field; import foundation.data.meta.field.FieldsRuntime; import foundation.json.IJSONProvider; import foundation.json.IJSONWriter; import foundation.persist.ISavable; public class EntitySet implements Iterable, IJSONProvider, ISavable { protected String dataName; protected FieldsRuntime fieldMetas; protected List entityList; protected int maxSize; protected Indexes indexes; public EntitySet(FieldsRuntime fieldMetas) { this(fieldMetas, -1); } public EntitySet(FieldsRuntime fieldMetas, int maxSize) { this.fieldMetas = fieldMetas; if (maxSize > 0) { this.maxSize = maxSize; entityList = new ArrayList(maxSize); } else { entityList = new ArrayList(15); } indexes = new Indexes(this); } public static EntitySet appendAll(EntitySet target, EntitySet source) { if (target == null || source == null) { return source; } for (Entity entity : source) { target.append(entity); } return target; } public EntitySetChange getChange(EntitySet original) throws Exception { EntitySetChange result = new EntitySetChange(); //1. 如果 original 为空,返回当前 entitySet 所有数据 if (original == null) { for (Entity entity: this) { Entity item = new Entity(fieldMetas); item.copyFrom(entity); EntityChange entityChange = new EntityChange(item, ChangeType.Inserted); result.loadOne(entityChange); } return result; } //2. 如果 original 不为空,对比 entity for (Entity entity: this) { String id = entity.getId(); Entity originalEntity = original.getEntity("id", id); EntityChange entityChange = entity.getChange(originalEntity); result.loadOne(entityChange); } //3. 如果 original存在,this不存在,就是Delete for (Entity originalEntity: original) { String id = originalEntity.getId(); Entity entity = getEntity("id", id); if (entity != null) { continue; } Entity item = new Entity(fieldMetas); item.copyFrom(originalEntity); EntityChange entityChange = new EntityChange(item, ChangeType.Deleted); result.loadOne(entityChange); } return result; } public Entity newEntity() { Entity entity = new Entity(fieldMetas); return entity; } public Entity append() { Entity entity = new Entity(fieldMetas); entityList.add(entity); return entity; } public Entity append(Entity entity) { entityList.add(entity); indexes.setDirty(); return entity; } public Entity getEntity(int idx) { Entity entity = entityList.get(idx); if (entity == null || entity.isDeleted()) { return null; } return entity; } public Entity getEntity(String id) throws Exception { if (id == null) { return null; } Entity entity = indexes.getEntity("id", id); if (entity == null || entity.isDeleted()) { return null; } return entity; } public Entity getEntity(String field, Object value) throws Exception { Entity entity = indexes.getEntity(field, value); if (entity == null || entity.isDeleted()) { return null; } return entity; } public boolean lookup(String field, Object value) throws Exception { Entity entity = indexes.getEntity(field, value); return entity != null; } public boolean contains(String field, Object value) throws Exception { return indexes.contains(field, value); } public Object getMax(String fieldName) { return indexes.getMax(fieldName); } public void delete(String id) throws Exception { if (id == null) { return; } Entity entity = indexes.getEntity("id", id); if (entity == null) { return; } entity.setDeleted(); } @Override public void saveData(PreparedStatement stmt, Object... agrs) throws Exception { int max = fieldMetas.size(); Object value; Field field; for (Entity entity: this) { for (int i = 0; i < max; i++) { value = entity.getFieldTypeValue(i); if (value == null) { field = fieldMetas.get(i); stmt.setNull(i + 1, field.getSQLType()); continue; } stmt.setObject(i + 1, value); } stmt.addBatch(); } stmt.executeBatch(); } public void clear() { entityList.clear(); } public boolean isEmpty() { return entityList.isEmpty(); } public boolean isFull() { if (maxSize < 0) { return false; } return entityList.size() >= maxSize; } public int getFieldCount() { return fieldMetas.getFieldCount(); } public FieldsRuntime getEntityMeta() { return fieldMetas; } public List getEntityList() { return entityList; } @Override public Iterator iterator() { return entityList.iterator(); } public int size() { return entityList.size(); } public String[] getLowerNames() { return fieldMetas.getLowerNames(); } @Override public void writeJSON(IJSONWriter writer) { writer.beginArray(); writeJSONBody(writer); writer.endArray(); } public void writeJSONBody(IJSONWriter writer) { for (Entity entity : this) { entity.writeJSON(writer); } } }