Projekt

Obecné

Profil

Stáhnout (13.8 KB) Statistiky
| Větev: | Revize:
1
package vldc.aswi.service;
2

    
3
import lombok.extern.slf4j.Slf4j;
4
import org.springframework.beans.factory.annotation.Autowired;
5
import org.springframework.stereotype.Service;
6
import vldc.aswi.database.DatabaseInterface;
7
import vldc.aswi.domain.Assembly;
8
import vldc.aswi.domain.Function;
9
import vldc.aswi.domain.parameter.ParameterInConfiguration;
10
import vldc.aswi.model.table.NameUserName;
11
import vldc.aswi.model.table.TableColumn;
12
import vldc.aswi.model.table.ValueFunction;
13
import vldc.aswi.model.table.contingencyTable.ContingencyTableRow;
14
import vldc.aswi.utils.Converter;
15

    
16
import java.util.*;
17
import java.util.concurrent.TimeUnit;
18

    
19
/**
20
 * Manager for SqlQuery.
21
 */
22
@Service
23
@Slf4j
24
public class SqlQueryManagerImpl implements SqlQueryManager {
25

    
26
    /**
27
     * Autowired databaseInterface component.
28
     */
29
    @Autowired
30
    private DatabaseInterface databaseInterface;
31

    
32
    /**
33
     * Get list of  contingencyTableRow.
34
     * @param assembly Assembly from which configuration was created.
35
     * @param parametersInConfiguration Parameters in configuration with their locations and operators.
36
     * @param isNotRemoveEmpty Sets if empty rows and columns should not be removed.
37
     * @param tableName Name of the table.
38
     * @return List of contingencyTableRow or null, if error in SQL query occurred.
39
     */
40
    @Override
41
    public List<ContingencyTableRow> getContingencyTableRow(Assembly assembly,
42
                                                            List<ParameterInConfiguration> parametersInConfiguration,
43
                                                            boolean isNotRemoveEmpty, String tableName) {
44
        long startTime = System.nanoTime();
45

    
46
        Map<String, TableColumn> tableColumns = this.databaseInterface.executeQueryAndReturnTableColumns(
47
                generateFullSQLQuery(assembly.getSQLQuery(), parametersInConfiguration)
48
        );
49

    
50
        if (tableColumns == null) {
51
            return null;
52
        }
53

    
54
        if (tableColumns.values().iterator().next().getValues().size() == 0) {
55
            return new ArrayList<>();
56
        }
57

    
58
        long stopTime = System.nanoTime();
59
        System.out.println("Select:" + TimeUnit.MILLISECONDS.convert((stopTime - startTime), TimeUnit.NANOSECONDS));
60
        List<NameUserName> rowNames = new ArrayList<>();
61
        List<NameUserName> columnNames = new ArrayList<>();
62
        List<ValueFunction> valueFunctions = new ArrayList<>();
63

    
64
        // Create a copy of list.
65
        List<ParameterInConfiguration> copiedParametersInConfiguration = new ArrayList<>(parametersInConfiguration);
66

    
67
        // sort parameters in configuration to have them in order set by user
68
        Collections.sort(copiedParametersInConfiguration);
69

    
70
        initializeContingencyTableDataLists(rowNames, columnNames, valueFunctions, copiedParametersInConfiguration);
71

    
72
        Converter converter = new Converter(tableColumns, rowNames, columnNames, valueFunctions, isNotRemoveEmpty, tableName);
73
        return converter.convertTableColumnsToContingencyTableRows();
74
    }
75

    
76
    /**
77
     * Validate given SQL query.
78
     * @param sqlQuery - Validated SQL query.
79
     * @return true if SQL query is ok, false if not.
80
     */
81
    @Override
82
    public boolean validateSQLQuery(String sqlQuery) {
83
        return this.databaseInterface.validateSQLQuery(sqlQuery);
84
    }
85

    
86
    /**
87
     * Get list of table column names from SQL query.
88
     * @param sqlQuery - SQL query.
89
     * @return List of table column names.
90
     */
91
    public List<String> getNameOfColumnsFromQuery(String sqlQuery) {
92
        return this.databaseInterface.getNameOfColumnsFromQuery(sqlQuery);
93
    }
94

    
95
    /**
96
     * Initializes list with values.
97
     * @param rowNames List of selected rows.
98
     * @param columnNames List of selected columns.
99
     * @param valueFunctions List of selected values and functions.
100
     * @param parametersInConfiguration List of parameters in configuration.
101
     */
102
    private void initializeContingencyTableDataLists(List<NameUserName> rowNames, List<NameUserName> columnNames,
103
                                                     List<ValueFunction> valueFunctions, List<ParameterInConfiguration> parametersInConfiguration) {
104
        for (ParameterInConfiguration parameterInConfiguration : parametersInConfiguration) {
105
            if (parameterInConfiguration.getLocation().getName() != null && parameterInConfiguration.getLocation().getName().equals("Řádek")) {
106
                if (parameterInConfiguration.getColumnName() != null && !parameterInConfiguration.getColumnName().equals("")) {
107
                    rowNames.add(new NameUserName(parameterInConfiguration.getParameter().getNameOfSelect().toUpperCase(),
108
                            parameterInConfiguration.getColumnName()));
109
                }
110
                else {
111
                    rowNames.add(new NameUserName(parameterInConfiguration.getParameter().getNameOfSelect().toUpperCase(),
112
                            parameterInConfiguration.getParameter().getName()));
113
                }
114
            } else if (parameterInConfiguration.getLocation().getName() != null && parameterInConfiguration.getLocation().getName().equals("Sloupec")) {
115
                if (parameterInConfiguration.getColumnName() != null && !parameterInConfiguration.getColumnName().equals("")) {
116
                    columnNames.add(new NameUserName(parameterInConfiguration.getParameter().getNameOfSelect().toUpperCase(),
117
                            parameterInConfiguration.getColumnName()));
118
                }
119
                else {
120
                    columnNames.add(new NameUserName(parameterInConfiguration.getParameter().getNameOfSelect().toUpperCase(),
121
                            parameterInConfiguration.getParameter().getName()));
122
                }
123
            } else if (parameterInConfiguration.getLocation().getName() != null && parameterInConfiguration.getLocation().getName().equals("Hodnota")) {
124
                for (Function function : parameterInConfiguration.getFunctions()) {
125
                    valueFunctions.add(new ValueFunction(parameterInConfiguration.getParameter().getNameOfSelect().toUpperCase(),
126
                            parameterInConfiguration.getParameter().getName(), function.getName().toUpperCase(),
127
                            parameterInConfiguration.getParameter().getParameterType().getName()));
128
                }
129
                if (valueFunctions.size() == 0) {
130
                    valueFunctions.add(new ValueFunction(parameterInConfiguration.getParameter().getNameOfSelect().toUpperCase(),
131
                            parameterInConfiguration.getParameter().getName(), "",
132
                            parameterInConfiguration.getParameter().getParameterType().getName()));
133
                }
134
            }
135
        }
136

    
137
        if (valueFunctions.size() == 0) {
138
            valueFunctions.add(new ValueFunction("", "nic", "NIC", ""));
139
        }
140
    }
141

    
142
    /**
143
     * Generates full SQL query with all the filters
144
     * @param basicSQLQuery SQL query saved in assembly
145
     * @param parametersInConfiguration Parameters in configuration.
146
     * @return SQL query with filters.
147
     */
148
    private String generateFullSQLQuery(String basicSQLQuery, List<ParameterInConfiguration> parametersInConfiguration) {
149
        StringBuilder finalSQLQuery = new StringBuilder("SELECT * FROM (");
150
        finalSQLQuery.append(basicSQLQuery);
151
        finalSQLQuery.append(")");
152

    
153
        boolean isWhereDefined = false;
154

    
155
        for (ParameterInConfiguration parameterInConfiguration : parametersInConfiguration) {
156
            if (parameterInConfiguration.getParameter().getParameterType().getName().equals("Výčet") && false) {
157
                isWhereDefined = processListing(parameterInConfiguration, finalSQLQuery, isWhereDefined);
158
            }
159
            else if (parameterInConfiguration.getOperator() != null && !parameterInConfiguration.getOperator().getName().equals("zadny") &&
160
                    parameterInConfiguration.getOperatorValue() != null && !parameterInConfiguration.getOperatorValue().equals("")) {
161
                isWhereDefined = processFilter(parameterInConfiguration, finalSQLQuery, isWhereDefined);
162
            }
163
        }
164

    
165
        return finalSQLQuery.toString();
166
    }
167

    
168
    /**
169
     * Processes listing (enum) type.
170
     * @param parameterInConfiguration Listing type parameter iin configuration.
171
     * @param finalSQLQuery Resulting SQL query.
172
     * @param isWhereDefined Variable storing information if WHERE clause was defined in the resulting SQL query.
173
     * @return Information that WHERE clause was defined.
174
     */
175
    private boolean processListing(ParameterInConfiguration parameterInConfiguration, StringBuilder finalSQLQuery, boolean isWhereDefined) {
176
        if (!isWhereDefined) {
177
            finalSQLQuery.append(" WHERE ");
178
        } else {
179
            finalSQLQuery.append(" AND ");
180
        }
181

    
182
        finalSQLQuery.append(parameterInConfiguration.getParameter().getNameOfSelect());
183
        finalSQLQuery.append(" IN ");
184
        inNotIn(null, "Text");
185

    
186
        return true;
187
    }
188

    
189
    /**
190
     * Process filter of parameter in configuration.
191
     * @param parameterInConfiguration Parameter in configuration.
192
     * @param finalSQLQuery Resulting SQL query.
193
     * @param isWhereDefined Variable storing information if WHERE clause was defined in the resulting SQL query.
194
     * @return Information that WHERE clause was defined
195
     */
196
    private boolean processFilter(ParameterInConfiguration parameterInConfiguration, StringBuilder finalSQLQuery, boolean isWhereDefined) {
197
        String[] values = parameterInConfiguration.getOperatorValue().split(";");
198
        if (!isWhereDefined) {
199
            finalSQLQuery.append(" WHERE ");
200
        } else {
201
            finalSQLQuery.append(" AND ");
202
        }
203

    
204
        finalSQLQuery.append(parameterInConfiguration.getParameter().getNameOfSelect());
205
        finalSQLQuery.append(" ");
206
        finalSQLQuery.append(parameterInConfiguration.getOperator().getName());
207
        if (parameterInConfiguration.getOperator().getName().equals("IS NULL") ||
208
                parameterInConfiguration.getOperator().getName().equals("IS NOT NULL")) {
209
            return true;
210
        }
211
        finalSQLQuery.append(" ");
212
        switch (parameterInConfiguration.getOperator().getName()) {
213
            case "BETWEEN":
214
            case "NOT BETWEEN":
215
                finalSQLQuery.append(betweenNotBetween(values, parameterInConfiguration.getParameter().getParameterType().getName()));
216
                break;
217
            case "IN":
218
            case "NOT IN":
219
                finalSQLQuery.append(inNotIn(values, parameterInConfiguration.getParameter().getParameterType().getName()));
220
                break;
221
            case "LIKE":
222
            case "NOT LIKE":
223
                finalSQLQuery.append(likeNotLike(values, parameterInConfiguration.getParameter().getParameterType().getName()));
224
                break;
225
            default:
226
                finalSQLQuery.append(otherOperators(values, parameterInConfiguration.getParameter().getParameterType().getName()));
227
                break;
228
        }
229

    
230
        return true;
231
    }
232

    
233
    /**
234
     * Validate LIKE and NOT LIKE operator.
235
     * @param values Values set by user.
236
     * @param type Type of the parameter.
237
     * @return String to be added to SQL query.
238
     */
239
    private String likeNotLike(String[] values, String type) {
240
        StringBuilder SQLQueryPart = new StringBuilder();
241
        addQuotes(type, SQLQueryPart);
242
        SQLQueryPart.append(values[0]);
243
        addQuotes(type, SQLQueryPart);
244

    
245
        return SQLQueryPart.toString();
246
    }
247

    
248
    /**
249
     * Validate IN and NOT IN operator.
250
     * @param values Values set by user.
251
     * @param type Type of the parameter.
252
     * @return String to be added to SQL query.
253
     */
254
    private String inNotIn(String[] values, String type) {
255
        StringBuilder SQLQueryPart = new StringBuilder();
256
        SQLQueryPart.append("(");
257
        for (int i = 0; i < values.length; i++) {
258
            if (type.equals("Datum")) {
259
                SQLQueryPart.append("date ");
260
            }
261

    
262
            addQuotes(type, SQLQueryPart);
263
            SQLQueryPart.append(values[i]);
264
            addQuotes(type, SQLQueryPart);
265
            if (i < values.length - 1) {
266
                SQLQueryPart.append(",");
267
            }
268
        }
269
        SQLQueryPart.append(")");
270

    
271
        return SQLQueryPart.toString();
272
    }
273

    
274
    /**
275
     * Validate BETWEEN and NOT BETWEEN operator.
276
     * @param values Values set by user.
277
     * @param type Type of the parameter.
278
     * @return String to be added to SQL query.
279
     */
280
    private String betweenNotBetween(String[] values, String type) {
281
        StringBuilder SQLQueryPart = new StringBuilder();
282

    
283
        if (type.equals("Datum")) {
284
            SQLQueryPart.append("date ");
285
        }
286

    
287
        addQuotes(type, SQLQueryPart);
288
        SQLQueryPart.append(values[0]);
289
        addQuotes(type, SQLQueryPart);
290

    
291
        SQLQueryPart.append(" AND ");
292

    
293
        if (type.equals("Datum")) {
294
            SQLQueryPart.append("date ");
295
        }
296

    
297
        addQuotes(type, SQLQueryPart);
298
        SQLQueryPart.append(values[1]);
299
        addQuotes(type, SQLQueryPart);
300

    
301
        return SQLQueryPart.toString();
302
    }
303

    
304
    /**
305
     * Validate other operators.
306
     * @param values Values set by user.
307
     * @param type Type of the parameter.
308
     * @return String to be added to SQL query.
309
     */
310
    private String otherOperators(String[] values, String type) {
311
        StringBuilder SQLQueryPart = new StringBuilder();
312

    
313
        if (type.equals("Datum")) {
314
            SQLQueryPart.append("date ");
315
        }
316

    
317
        addQuotes(type, SQLQueryPart);
318
        SQLQueryPart.append(values[0]);
319
        addQuotes(type, SQLQueryPart);
320

    
321
        return SQLQueryPart.toString();
322
    }
323

    
324
    /**
325
     * Adds quote to the value.
326
     * @param type Type Type of the parameter.
327
     * @param SQLQueryPart Appends quote to the final SQL query.
328
     */
329
    private void addQuotes(String type, StringBuilder SQLQueryPart) {
330
        if (type.equals("Text") || type.equals("Datum")) {
331
            SQLQueryPart.append("'");
332
        }
333
    }
334
}
(16-16/18)