Projekt

Obecné

Profil

Stáhnout (9.03 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, configuration.getParametersInConfiguration());
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.getOperator() != null && !parameterInConfiguration.getOperator().getName().equals("zadny") &&
120
                    parameterInConfiguration.getOperatorValue() != null && !parameterInConfiguration.getOperatorValue().equals("")) {
121
                String[] values = parameterInConfiguration.getOperatorValue().split(";");
122
                if (!isWhereDefined) {
123
                    finalSQLQuery.append(" WHERE ");
124
                    isWhereDefined = true;
125
                } else {
126
                    finalSQLQuery.append(" AND ");
127
                }
128

    
129
                finalSQLQuery.append(parameterInConfiguration.getParameter().getNameOfSelect());
130
                finalSQLQuery.append(" ");
131
                finalSQLQuery.append(parameterInConfiguration.getOperator().getName());
132
                finalSQLQuery.append(" ");
133
                switch (parameterInConfiguration.getOperator().getName()) {
134
                    case "BETWEEN":
135
                    case "NOT BETWEEN":
136
                        finalSQLQuery.append(betweenNotBetween(values, parameterInConfiguration.getParameter().getParameterType().getName()));
137
                        break;
138
                    case "IN":
139
                    case "NOT IN":
140
                        finalSQLQuery.append(inNotIn(values, parameterInConfiguration.getParameter().getParameterType().getName()));
141
                        break;
142
                    case "LIKE":
143
                    case "NOT LIKE":
144
                        finalSQLQuery.append(likeNotLike(values, parameterInConfiguration.getParameter().getParameterType().getName()));
145
                        break;
146
                    default:
147
                        finalSQLQuery.append(otherOperators(values, parameterInConfiguration.getParameter().getParameterType().getName()));
148
                        break;
149
                }
150
            }
151
        }
152

    
153
        return finalSQLQuery.toString();
154
    }
155

    
156
    private String likeNotLike(String[] values, String type) {
157
        StringBuilder SQLQueryPart = new StringBuilder();
158
        addQuotes(type, SQLQueryPart);
159
        SQLQueryPart.append(values[0]);
160
        addQuotes(type, SQLQueryPart);
161

    
162
        return SQLQueryPart.toString();
163
    }
164

    
165
    private String inNotIn(String[] values, String type) {
166
        StringBuilder SQLQueryPart = new StringBuilder();
167
        SQLQueryPart.append("(");
168
        for (int i = 0; i < values.length; i++) {
169
            addQuotes(type, SQLQueryPart);
170
            SQLQueryPart.append(values[i]);
171
            addQuotes(type, SQLQueryPart);
172
            if (i < values.length - 1) {
173
                SQLQueryPart.append(",");
174
            }
175
        }
176
        SQLQueryPart.append(")");
177

    
178
        return SQLQueryPart.toString();
179
    }
180

    
181
    private String betweenNotBetween(String[] values, String type) {
182
        StringBuilder SQLQueryPart = new StringBuilder();
183

    
184
        addQuotes(type, SQLQueryPart);
185
        SQLQueryPart.append(values[0]);
186
        addQuotes(type, SQLQueryPart);
187

    
188
        SQLQueryPart.append(" AND ");
189

    
190
        addQuotes(type, SQLQueryPart);
191
        SQLQueryPart.append(values[1]);
192
        addQuotes(type, SQLQueryPart);
193

    
194
        return SQLQueryPart.toString();
195
    }
196

    
197
    private String otherOperators(String[] values, String type) {
198
        StringBuilder SQLQueryPart = new StringBuilder();
199

    
200
        addQuotes(type, SQLQueryPart);
201
        SQLQueryPart.append(values[0]);
202
        addQuotes(type, SQLQueryPart);
203

    
204
        return SQLQueryPart.toString();
205
    }
206

    
207
    private void addQuotes(String type, StringBuilder SQLQueryPart) {
208
        if (type.equals("Text") || type.equals("Datum")) {
209
            SQLQueryPart.append("'");
210
        }
211
    }
212
}
(14-14/16)