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<Entity>, IJSONProvider, ISavable {
|
|
protected String dataName;
|
protected FieldsRuntime fieldMetas;
|
protected List<Entity> 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<Entity>(maxSize);
|
}
|
else {
|
entityList = new ArrayList<Entity>(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<Entity> getEntityList() {
|
return entityList;
|
}
|
|
@Override
|
public Iterator<Entity> 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);
|
}
|
}
|
}
|