package foundation.data.object; import java.util.Date; import foundation.data.entity.Entity; import foundation.data.meta.field.FieldsRuntime; import foundation.util.ContentBuilder; import foundation.util.Util; public class DataJoin { public static String TableJoinConnector = "__"; public static String EmptySelectFields = "empty"; private static Date emptyUpdateTime = new Date(0); private String id; private String dataName; private String field; private String joinDataName; private String joinAsName; private String joinField; private String joinSelelctFields; private String joinSQL; private boolean active; private Date updateTime; private FieldsRuntime joinFieldsMeta; public DataJoin() { } public void load(Entity entity) { id = entity.getString("id"); dataName = entity.getString("dataname"); field = entity.getString("field_name"); joinDataName = entity.getString("join_dataname"); joinAsName = entity.getString("join_as_name", joinDataName); joinField = entity.getString("join_field_name", "id"); joinSelelctFields = entity.getString("join_select_fields"); joinSQL = entity.getString("join_sql"); active = entity.getBoolean("is_active", true); updateTime = entity.getDate("last_update_time", emptyUpdateTime); } public void build() { if (!Util.isEmpty(joinSQL)) { return; } joinSQL = createJoinSQL(); } public void getJoinFields(ContentBuilder result) throws Exception { //1. 如果配置了 join select fields if (!Util.isEmpty(joinSelelctFields)) { //1.1 如果配置为Empty,就不选择任何字段 if (EmptySelectFields.equalsIgnoreCase(joinSelelctFields)) { return; } //1.2 如果配置了字段,根据配置选择字段 joinSelelctFields = joinSelelctFields.replace(";", ",").replace(",", ",").replace(";", ","); String[] segments = joinSelelctFields.split(","); int max = segments.length; for (int i = 0; i < max; i++) { String joinField = segments[i]; joinField = joinField.trim(); result.append(joinDataName + "." + joinField + " as " + joinAsName + TableJoinConnector + joinField); } return; } //2. 自动生成全量 fields DataObject joinObject = DataObject.getInstance(joinDataName); if (joinObject == null) { throw new Exception("data object " + joinDataName + " not exits, join skip"); } joinFieldsMeta = joinObject.getTableFieldMetas(); String[] joinFields = joinFieldsMeta.getFieldNames(); int max = joinFields.length; for (int i = 0; i < max; i++) { String joinField = joinFields[i]; result.append(joinDataName + "." + joinField + " as " + joinAsName + TableJoinConnector + joinField); } } private String createJoinSQL() { StringBuilder builder = new StringBuilder(); //1. 添加 left join 关键字 builder.append(" left join ").append(joinDataName); //2. 添加左面字段 if (field.indexOf(".") <= 0) { //如果字段没有指定表名,添加表明 DataObject dataObject = DataObject.getInstance(dataName); builder.append(" on ").append(dataObject.getTableOrViewName()).append(".").append(field); } else { //如果字段中指定表名称直接使用 builder.append(" on ").append(field); } //3. 添加右面字段 if (joinField.indexOf(".") <= 0) { //如果字段没有指定表名,添加表明 DataObject joinDataObject = DataObject.getInstance(joinDataName); builder.append(" = ").append(joinDataObject.getTableOrViewName()).append(".").append(joinField); } else { //如果字段中指定表名称直接使用 builder.append(" = ").append(joinField); } return builder.toString(); } public String getDataName() { return dataName; } public String getJoinDataName() { return joinDataName; } public String getJoinAsName() { return joinAsName; } public String getJoinSQL() { return joinSQL; } public String getId() { return id; } public boolean isActive() { return active; } public FieldsRuntime getJoinFieldsMeta() { return joinFieldsMeta; } public Date getUpdateTime() { return updateTime; } }