Projekt

Obecné

Profil

Stáhnout (9.93 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.Configuration;
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
     *
35
     * @param configuration - configuration from which table will be created.
36
     * @return List of contingencyTableRow.
37
     */
38
    @Override
39
    public List<ContingencyTableRow> getContingencyTableRow(Configuration configuration) {
40
        long startTime = System.nanoTime();
41

    
42
        Map<String, TableColumn> tableColumns = this.databaseInterface.executeQueryAndReturnTableColumns(
43
                generateFullSQLQuery(configuration.getAssembly().getSQLQuery(), configuration.getParametersInConfiguration())
44
        );
45

    
46
        long stopTime = System.nanoTime();
47
        System.out.println("Select:" + TimeUnit.MILLISECONDS.convert((stopTime - startTime), TimeUnit.NANOSECONDS));
48
        List<NameUserName> rowNames = new ArrayList<>();
49
        List<NameUserName> columnNames = new ArrayList<>();
50
        List<ValueFunction> valueFunctions = new ArrayList<>();
51

    
52
        // Create a copy of list.
53
        List<ParameterInConfiguration> copiedParametersInConfiguration = new ArrayList<>(configuration.getParametersInConfiguration());
54

    
55
        // sort parameters in configuration to have them in order set by user
56
        Collections.sort(copiedParametersInConfiguration);
57

    
58
        initializeContingencyTableDataLists(rowNames, columnNames, valueFunctions, copiedParametersInConfiguration);
59

    
60
        Converter converter = new Converter(tableColumns, rowNames, columnNames, valueFunctions, true);
61
        return converter.convertTableColumnsToContingencyTableRows();
62
    }
63

    
64
    /**
65
     * Validate given SQL query.
66
     * @param sqlQuery - Validated SQL query.
67
     * @return true if SQL query is ok, false if not.
68
     */
69
    @Override
70
    public boolean validateSQLQuery(String sqlQuery) {
71
        return this.databaseInterface.validateSQLQuery(sqlQuery);
72
    }
73

    
74
    /**
75
     * Get list of table column names from SQL query.
76
     * @param sqlQuery - SQL query.
77
     * @return List of table column names.
78
     */
79
    public List<String> getNameOfColumnsFromQuery(String sqlQuery) {
80
        return this.databaseInterface.getNameOfColumnsFromQuery(sqlQuery);
81
    }
82

    
83
    private void initializeContingencyTableDataLists(List<NameUserName> rowNames, List<NameUserName> columnNames,
84
                                                     List<ValueFunction> valueFunctions, List<ParameterInConfiguration> parametersInConfiguration) {
85
        for (ParameterInConfiguration parameterInConfiguration : parametersInConfiguration) {
86
            if (parameterInConfiguration.getLocation() != null && parameterInConfiguration.getLocation().getName().equals("Řádek")) {
87
                rowNames.add(new NameUserName(parameterInConfiguration.getParameter().getNameOfSelect().toUpperCase(),
88
                        parameterInConfiguration.getColumnName()));
89
            } else if (parameterInConfiguration.getLocation() != null && parameterInConfiguration.getLocation().getName().equals("Sloupec")) {
90
                columnNames.add(new NameUserName(parameterInConfiguration.getParameter().getNameOfSelect().toUpperCase(),
91
                        parameterInConfiguration.getColumnName()));
92
            } else if (parameterInConfiguration.getLocation() != null && parameterInConfiguration.getLocation().getName().equals("Hodnota")) {
93
                for (Function function : parameterInConfiguration.getFunctions()) {
94
                    valueFunctions.add(new ValueFunction(parameterInConfiguration.getParameter().getNameOfSelect().toUpperCase(),
95
                            parameterInConfiguration.getParameter().getName(), function.getName().toUpperCase(),
96
                            parameterInConfiguration.getParameter().getParameterType().getName()));
97
                }
98
                if (valueFunctions.size() == 0) {
99
                    valueFunctions.add(new ValueFunction(parameterInConfiguration.getParameter().getNameOfSelect().toUpperCase(),
100
                            parameterInConfiguration.getParameter().getName(), "",
101
                            parameterInConfiguration.getParameter().getParameterType().getName()));
102
                }
103
            }
104
        }
105

    
106
        if (valueFunctions.size() == 0) {
107
            valueFunctions.add(new ValueFunction("", "nic", "NIC", ""));
108
        }
109
    }
110

    
111
    private String generateFullSQLQuery(String basicSQLQuery, List<ParameterInConfiguration> parametersInConfiguration) {
112
        StringBuilder finalSQLQuery = new StringBuilder("SELECT * FROM (");
113
        finalSQLQuery.append(basicSQLQuery);
114
        finalSQLQuery.append(")");
115

    
116
        boolean isWhereDefined = false;
117

    
118
        for (ParameterInConfiguration parameterInConfiguration : parametersInConfiguration) {
119
            if (parameterInConfiguration.getParameter().getParameterType().getName().equals("Výčet") && false) {
120
                isWhereDefined = processListing(parameterInConfiguration, finalSQLQuery, isWhereDefined);
121
            }
122
            else if (parameterInConfiguration.getOperator() != null && !parameterInConfiguration.getOperator().getName().equals("zadny") &&
123
                    parameterInConfiguration.getOperatorValue() != null && !parameterInConfiguration.getOperatorValue().equals("")) {
124
                isWhereDefined = processFilter(parameterInConfiguration, finalSQLQuery, isWhereDefined);
125
            }
126
        }
127

    
128
        return finalSQLQuery.toString();
129
    }
130

    
131
    private boolean processListing(ParameterInConfiguration parameterInConfiguration, StringBuilder finalSQLQuery, boolean isWhereDefined) {
132
        if (!isWhereDefined) {
133
            finalSQLQuery.append(" WHERE ");
134
        } else {
135
            finalSQLQuery.append(" AND ");
136
        }
137

    
138
        finalSQLQuery.append(parameterInConfiguration.getParameter().getNameOfSelect());
139
        finalSQLQuery.append(" IN ");
140
        inNotIn(null, "Text");
141

    
142
        return true;
143
    }
144

    
145
    private boolean processFilter(ParameterInConfiguration parameterInConfiguration, StringBuilder finalSQLQuery, boolean isWhereDefined) {
146
        String[] values = parameterInConfiguration.getOperatorValue().split(";");
147
        if (!isWhereDefined) {
148
            finalSQLQuery.append(" WHERE ");
149
        } else {
150
            finalSQLQuery.append(" AND ");
151
        }
152

    
153
        finalSQLQuery.append(parameterInConfiguration.getParameter().getNameOfSelect());
154
        finalSQLQuery.append(" ");
155
        finalSQLQuery.append(parameterInConfiguration.getOperator().getName());
156
        if (parameterInConfiguration.getOperator().getName().equals("IS NULL") ||
157
                parameterInConfiguration.getOperator().getName().equals("IS NOT NULL")) {
158
            return true;
159
        }
160
        finalSQLQuery.append(" ");
161
        switch (parameterInConfiguration.getOperator().getName()) {
162
            case "BETWEEN":
163
            case "NOT BETWEEN":
164
                finalSQLQuery.append(betweenNotBetween(values, parameterInConfiguration.getParameter().getParameterType().getName()));
165
                break;
166
            case "IN":
167
            case "NOT IN":
168
                finalSQLQuery.append(inNotIn(values, parameterInConfiguration.getParameter().getParameterType().getName()));
169
                break;
170
            case "LIKE":
171
            case "NOT LIKE":
172
                finalSQLQuery.append(likeNotLike(values, parameterInConfiguration.getParameter().getParameterType().getName()));
173
                break;
174
            default:
175
                finalSQLQuery.append(otherOperators(values, parameterInConfiguration.getParameter().getParameterType().getName()));
176
                break;
177
        }
178

    
179
        return true;
180
    }
181

    
182
    private String likeNotLike(String[] values, String type) {
183
        StringBuilder SQLQueryPart = new StringBuilder();
184
        addQuotes(type, SQLQueryPart);
185
        SQLQueryPart.append(values[0]);
186
        addQuotes(type, SQLQueryPart);
187

    
188
        return SQLQueryPart.toString();
189
    }
190

    
191
    private String inNotIn(String[] values, String type) {
192
        StringBuilder SQLQueryPart = new StringBuilder();
193
        SQLQueryPart.append("(");
194
        for (int i = 0; i < values.length; i++) {
195
            addQuotes(type, SQLQueryPart);
196
            SQLQueryPart.append(values[i]);
197
            addQuotes(type, SQLQueryPart);
198
            if (i < values.length - 1) {
199
                SQLQueryPart.append(",");
200
            }
201
        }
202
        SQLQueryPart.append(")");
203

    
204
        return SQLQueryPart.toString();
205
    }
206

    
207
    private String betweenNotBetween(String[] values, String type) {
208
        StringBuilder SQLQueryPart = new StringBuilder();
209

    
210
        addQuotes(type, SQLQueryPart);
211
        SQLQueryPart.append(values[0]);
212
        addQuotes(type, SQLQueryPart);
213

    
214
        SQLQueryPart.append(" AND ");
215

    
216
        addQuotes(type, SQLQueryPart);
217
        SQLQueryPart.append(values[1]);
218
        addQuotes(type, SQLQueryPart);
219

    
220
        return SQLQueryPart.toString();
221
    }
222

    
223
    private String otherOperators(String[] values, String type) {
224
        StringBuilder SQLQueryPart = new StringBuilder();
225

    
226
        addQuotes(type, SQLQueryPart);
227
        SQLQueryPart.append(values[0]);
228
        addQuotes(type, SQLQueryPart);
229

    
230
        return SQLQueryPart.toString();
231
    }
232

    
233
    private void addQuotes(String type, StringBuilder SQLQueryPart) {
234
        if (type.equals("Text") || type.equals("Datum")) {
235
            SQLQueryPart.append("'");
236
        }
237
    }
238
}
(14-14/16)