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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
package foundation.data.object;
 
import foundation.dao.Filter;
import foundation.persist.NamedSQL;
import foundation.persist.source.NamedDataSource;
import foundation.util.Util;
import foundation.variant.provider.IVariantsProvider;
 
public class SQLGuide {
 
    private DataObject dataObject;
    private NamedDataSource dataSource;
    private String batchName;
    private String oneName;
    private NamedSQL batchSQL;
    private NamedSQL oneSQL;
    private NamedSQL tableCountSQL;
    private NamedSQL expendCountSQL;
    private String commaSeparator;
    private String joinSelectFields;
    private String joinSQL;
    private boolean standard_batch;
    private boolean standard_one;
    private boolean standard_count;
    
    
    public SQLGuide(DataObject dataObject) throws Exception {
        this.dataObject = dataObject;
        this.dataSource = dataObject.getDataSource();
        tableCountSQL = NamedSQL.getInstance(dataSource.getDBaseType(), NamedSQL.Code_GetCount);
    }
    
    public void build() {
        DataJoins dataJoins = dataObject.getDataJoins();
        
        if (dataJoins == null) { 
            return;
        }
        
        commaSeparator = dataJoins.getCommaSeparator();
        joinSelectFields = dataJoins.getJoinSelectFields();
        joinSQL = dataJoins.getJoinSQL();
    }
    
    public NamedSQL getBrowseBatchSQL() throws Exception {
        NamedSQL result = batchSQL.createInstance();
        
        //1. 如果不是自定义SQL和JoinSQL,就选取ViewName或TableName
        if (standard_batch) {
            result.setTableName(dataObject.getTableOrViewName());
            return result;
        }
        
        //2. 如果是自定义SQL和JoinSQL,选取TableName
        result.setTableName(dataObject.getTableOrViewName());
        result.setParam("commaSeparator", commaSeparator);
        result.setParam("joinSelectFields", joinSelectFields);
        result.setParam("joinSQL", joinSQL);
        
        //3. 返回
        return result;
    }
 
    public NamedSQL getBrowseOneSQL() throws Exception {
        NamedSQL result = oneSQL.createInstance();
        
        //1. 如果不是自定义SQL和JoinSQL,就选取ViewName或TableName
        if (standard_one) {
            result.setTableName(dataObject.getTableOrViewName());
            return result;
        }
        
        //2. 如果是自定义SQL和JoinSQL,选取TableName
        result.setTableName(dataObject.getTableName());
        result.setParam("commaSeparator", commaSeparator);
        result.setParam("joinSelectFields", joinSelectFields);
        result.setParam("joinSQL", joinSQL);
 
        //3. 返回
        return result;
    }
 
    public NamedSQL getCountSQL(IVariantsProvider[] providers) throws Exception {
        NamedSQL namedSQL;
        Filter filter = findFilter(providers);
        //1. 没有过滤条件
        if (filter == null) {
            namedSQL = tableCountSQL.createInstance();
            namedSQL.setTableName(dataObject.getTableOrViewName());
            return namedSQL;
        }
 
        //2. 过滤条件没有超出主表范围
        if (!filter.containsSlaveTables(dataObject.getJoinTables())) {
            namedSQL = tableCountSQL.createInstance();
            namedSQL.setTableName(dataObject.getTableOrViewName());
        }
        //3. 
        else {
            namedSQL = expendCountSQL.createInstance();
            
            namedSQL.setTableName(dataObject.getTableName());
            namedSQL.setParam("commaSeparator", commaSeparator);
            namedSQL.setParam("joinSelectFields", joinSelectFields);
            namedSQL.setParam("joinSQL", joinSQL);
            
            namedSQL.setOrderBy("");
            namedSQL.setPage(null);    
        }
        
        return namedSQL;
    }
 
    public void setBatchSQL(String sqlName) throws Exception {
        this.batchName = sqlName;
        
        //1. 先检查 自定义SQL 是否可用
        if (!Util.isEmpty(sqlName)) {
            batchSQL = NamedSQL.getInstance(dataSource.getDBaseType(), sqlName);
            standard_batch = false;
            return;
        }
        
        //2. 检查 Join SQL 是否可用
        DataJoins dataJoins = dataObject.getDataJoins();
        
        if (dataJoins != null && !dataJoins.isEmpty()) {
            batchSQL = NamedSQL.getInstance(dataSource.getDBaseType(), NamedSQL.Code_GetJoinEntity);
            standard_batch = false;
            return;
        }
        
        //3. 默认 SQL
        batchSQL = NamedSQL.getInstance(dataSource.getDBaseType(), NamedSQL.Code_GetEntity);
        standard_batch = true;
    }
 
    public void setOneSQL(String sqlName) throws Exception {
        this.oneName = sqlName;
        
        //1. 先检查 自定义SQL 是否可用
        if (!Util.isEmpty(sqlName)) {
            oneSQL = NamedSQL.getInstance(dataSource.getDBaseType(), sqlName);
            standard_one = false;
            return;
        }
        
        //2. 检查 Join SQL 是否可用
        DataJoins dataJoins = dataObject.getDataJoins();
        
        if (dataJoins != null && !dataJoins.isEmpty()) {
            oneSQL = NamedSQL.getInstance(dataSource.getDBaseType(), NamedSQL.Code_GetJoinEntity);
            standard_one = false;
            return;
        }
        
        //3. 默认 SQL
        oneSQL = NamedSQL.getInstance(dataSource.getDBaseType(), NamedSQL.Code_GetEntity);
        standard_one = true;
    }
 
    public void setCountSQL(String sqlName) throws Exception {
        //1. 先检查 自定义SQL 是否可用
        if (!Util.isEmpty(sqlName)) {
            expendCountSQL = NamedSQL.getInstance(dataSource.getDBaseType(), sqlName);
            standard_count = false;
            return;
        }
        
        //2. 检查 Join Count SQL 是否可用
        DataJoins dataJoins = dataObject.getDataJoins();
        
        if (dataJoins != null && !dataJoins.isEmpty()) {
            expendCountSQL = NamedSQL.getInstance(dataSource.getDBaseType(), NamedSQL.Code_GetJoinCount);
            standard_count = false;
            return;
        }
        
        //3. 如果不是Join,但是有特殊的BatchSQL,用特殊的SQL做为Count SQL
        if (!standard_batch) {
            String sqlText = " select count(1) from ( " + batchSQL.toString() + " ) a ";
            expendCountSQL = new NamedSQL("expendCountSQL", sqlText);
            standard_count = false;
            return;
        }
 
        
        //4. 默认情况
        expendCountSQL = tableCountSQL;
        standard_count = true;
    }
 
    private Filter findFilter(IVariantsProvider[] providers) {
        if (providers == null) {
            return null;
        }
        
        for (int i = 0; i < providers.length; i++) {
            IVariantsProvider provider = providers[i];
            
            if (provider == null) {
                continue;
            }
            
            if (Filter.ProviderName.equals(provider.getProviderName())) {
                return (Filter) provider;
            }
        }
        
        return null;
    }
 
    public boolean isStandard_batch() {
        return standard_batch;
    }
 
    public boolean isStandard_one() {
        return standard_one;
    }
 
    public boolean isStandard_count() {
        return standard_count;
    }
 
    public boolean isBatchAndOneSame() {
        boolean result = Util.equals(batchName, oneName);
        return result;
    }
}