package foundation.data.object; import java.util.Date; import java.util.Iterator; import foundation.data.meta.field.FieldsRuntime; import foundation.util.ContentBuilder; import foundation.util.MapList; import foundation.util.Util; public class DataJoins implements Iterable { private MapList items; private String commaSeparator; private String joinSelectFields; private String joinSQL; private String[] joinTables; private boolean builded; private Date lastUpdateTime; public DataJoins() { items = new MapList(); builded = false; lastUpdateTime = new Date(0); joinTables = null; } public void loadOne(DataJoin dataJoin) { //1. items.add(dataJoin.getJoinDataName(), dataJoin); //2. Date time = dataJoin.getUpdateTime(); lastUpdateTime = lastUpdateTime.after(time) ? lastUpdateTime : time; } public void build() throws Exception { if (builded) { return; } //1. for (DataJoin dataJoin: items) { dataJoin.build(); } //2. build join select fields ContentBuilder joinFieldsBuilder = new ContentBuilder(", "); for (DataJoin dataJoin: items) { dataJoin.getJoinFields(joinFieldsBuilder); } joinSelectFields = joinFieldsBuilder.toString(); //3. build join SQL ContentBuilder joinSQLBuilder = new ContentBuilder(Util.String_Return); for (DataJoin dataJoin: items) { joinSQLBuilder.append(dataJoin.getJoinSQL()); } joinSQL = joinSQLBuilder.toString(); //4. build commaSeparator commaSeparator = !Util.isEmpty(joinSelectFields) ? ", " : ""; //5. int max = items.size(); joinTables = new String[max]; for (int i = 0; i < max; i++) { DataJoin dataJoin = items.get(i); joinTables[i] = dataJoin.getJoinDataName(); } //6. builded = true; } public FieldsRuntime getJoinFieldsMeta(String tableName) { DataJoin dataJoin = items.get(tableName); if (dataJoin == null) { return null; } return dataJoin.getJoinFieldsMeta(); } @Override public Iterator iterator() { return items.iterator(); } public String getCommaSeparator() { return commaSeparator; } public String getJoinSelectFields() { return joinSelectFields; } public String getJoinSQL() { return joinSQL; } public boolean isEmpty() { return items.isEmpty(); } public String[] getJoinTables() { return joinTables; } public Date getLastUpdateTime() { return lastUpdateTime; } public int size() { return items.size(); } }