P15GEN2\59518
2024-05-29 d4210c7c4b04abde20037ea8aa0f54ef8a2649aa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
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;
    }
 
}