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;
|
}
|
|
}
|