Projekt

Obecné

Profil

« Předchozí | Další » 

Revize f30ebb74

Přidáno uživatelem Michal Linha před téměř 4 roky(ů)

re #8113 re #7885 all functions implemented, contingency table generation improved; re #8154 value filtering added; no comments

Zobrazit rozdíly:

src/main/java/vldc/aswi/service/SqlQueryManagerImpl.java
4 4
import org.springframework.beans.factory.annotation.Autowired;
5 5
import org.springframework.stereotype.Service;
6 6
import vldc.aswi.database.DatabaseInterface;
7
import vldc.aswi.domain.Assembly;
8 7
import vldc.aswi.domain.Configuration;
9 8
import vldc.aswi.domain.Function;
10 9
import vldc.aswi.domain.parameter.ParameterInConfiguration;
......
14 13
import vldc.aswi.model.table.contingencyTable.ContingencyTableRow;
15 14
import vldc.aswi.utils.Converter;
16 15

  
17
import javax.sql.DataSource;
18 16
import java.util.*;
19 17
import java.util.concurrent.TimeUnit;
20 18

  
......
23 21
 */
24 22
@Service
25 23
@Slf4j
26
public class SqlQueryManagerImpl implements SqlQueryManager{
24
public class SqlQueryManagerImpl implements SqlQueryManager {
27 25

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

  
32 32
    /**
33 33
     * Get list of  contingencyTableRow.
34
     * @param sqlQuery
35
     * @param parameterInConfigurations
34
     *
35
     * @param configuration - configuration from which table will be created.
36 36
     * @return List of contingencyTableRow.
37 37
     */
38 38
    @Override
39
    public List<ContingencyTableRow> getContingencyTableRow(String sqlQuery, List<ParameterInConfiguration> parameterInConfigurations) {
39
    public List<ContingencyTableRow> getContingencyTableRow(Configuration configuration) {
40 40
        long startTime = System.nanoTime();
41
        Map<String, TableColumn> tableColumns = this.databaseInterface.executeQueryAndReturnTableColumns(sqlQuery);
41

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

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

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

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

  
54
        // TODO: 28.05.2020 map would be better
55
        for(ParameterInConfiguration parameterInConfiguration : copiedParametersInConfiguration) {
56
            if (parameterInConfiguration.getLocation() != null && parameterInConfiguration.getLocation().getName().equals("Řádek")) {
57
                rowNames.add(new NameUserName(parameterInConfiguration.getParameter().getNameOfSelect().toUpperCase(),
58
                        parameterInConfiguration.getColumnName()));
59
            }
60
            else if (parameterInConfiguration.getLocation() != null && parameterInConfiguration.getLocation().getName().equals("Sloupec")) {
61
                columnNames.add(new NameUserName(parameterInConfiguration.getParameter().getNameOfSelect().toUpperCase(),
62
                        parameterInConfiguration.getColumnName()));
63
            }
64
            else if(parameterInConfiguration.getLocation() != null && parameterInConfiguration.getLocation().getName().equals("Hodnota")) {
65
                for (Function function : parameterInConfiguration.getFunctions()) {
66
                    valueFunctions.add(new ValueFunction(parameterInConfiguration.getParameter().getNameOfSelect().toUpperCase(),
67
                            function.getName().toUpperCase()));
68
                }
69
            }
70
        }
58
        initializeContingencyTableDataLists(rowNames, columnNames, valueFunctions, configuration.getParametersInConfiguration());
71 59

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

  
76 64
    /**
......
91 79
    public List<String> getNameOfColumnsFromQuery(String sqlQuery) {
92 80
        return this.databaseInterface.getNameOfColumnsFromQuery(sqlQuery);
93 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
            }
99
        }
100
    }
101

  
102
    private String generateFullSQLQuery(String basicSQLQuery, List<ParameterInConfiguration> parametersInConfiguration) {
103
        StringBuilder finalSQLQuery = new StringBuilder("SELECT * FROM (");
104
        finalSQLQuery.append(basicSQLQuery);
105
        finalSQLQuery.append(")");
106

  
107
        boolean isWhereDefined = false;
108

  
109
        for (ParameterInConfiguration parameterInConfiguration : parametersInConfiguration) {
110
            if (parameterInConfiguration.getOperator() != null && !parameterInConfiguration.getOperator().getName().equals("zadny") &&
111
                    parameterInConfiguration.getOperatorValue() != null && !parameterInConfiguration.getOperatorValue().equals("")) {
112
                String[] values = parameterInConfiguration.getOperatorValue().split(";");
113
                if (!isWhereDefined) {
114
                    finalSQLQuery.append(" WHERE ");
115
                    isWhereDefined = true;
116
                } else {
117
                    finalSQLQuery.append(" AND ");
118
                }
119

  
120
                finalSQLQuery.append(parameterInConfiguration.getParameter().getNameOfSelect());
121
                finalSQLQuery.append(" ");
122
                finalSQLQuery.append(parameterInConfiguration.getOperator().getName());
123
                finalSQLQuery.append(" ");
124
                switch (parameterInConfiguration.getOperator().getName()) {
125
                    case "BETWEEN":
126
                    case "NOT BETWEEN":
127
                        finalSQLQuery.append(betweenNotBetween(values, parameterInConfiguration.getParameter().getParameterType().getName()));
128
                        break;
129
                    case "IN":
130
                    case "NOT IN":
131
                        finalSQLQuery.append(inNotIn(values, parameterInConfiguration.getParameter().getParameterType().getName()));
132
                        break;
133
                    case "LIKE":
134
                    case "NOT LIKE":
135
                        finalSQLQuery.append(likeNotLike(values, parameterInConfiguration.getParameter().getParameterType().getName()));
136
                        break;
137
                    default:
138
                        finalSQLQuery.append(otherOperators(values, parameterInConfiguration.getParameter().getParameterType().getName()));
139
                        break;
140
                }
141

  
142
            }
143
        }
144

  
145
        return finalSQLQuery.toString();
146
    }
147

  
148
    private String likeNotLike(String[] values, String type) {
149
        StringBuilder SQLQueryPart = new StringBuilder();
150
        addQuotes(type, SQLQueryPart);
151
        SQLQueryPart.append(values[0]);
152
        addQuotes(type, SQLQueryPart);
153

  
154
        return SQLQueryPart.toString();
155
    }
156

  
157
    private String inNotIn(String[] values, String type) {
158
        StringBuilder SQLQueryPart = new StringBuilder();
159
        SQLQueryPart.append("(");
160
        for (int i = 0; i < values.length; i++) {
161
            addQuotes(type, SQLQueryPart);
162
            SQLQueryPart.append(values[i]);
163
            addQuotes(type, SQLQueryPart);
164
            if (i < values.length - 1) {
165
                SQLQueryPart.append(",");
166
            }
167
        }
168
        SQLQueryPart.append(")");
169

  
170
        return SQLQueryPart.toString();
171
    }
172

  
173
    private String betweenNotBetween(String[] values, String type) {
174
        StringBuilder SQLQueryPart = new StringBuilder();
175

  
176
        addQuotes(type, SQLQueryPart);
177
        SQLQueryPart.append(values[0]);
178
        addQuotes(type, SQLQueryPart);
179

  
180
        SQLQueryPart.append(" AND ");
181

  
182
        addQuotes(type, SQLQueryPart);
183
        SQLQueryPart.append(values[1]);
184
        addQuotes(type, SQLQueryPart);
185

  
186
        return SQLQueryPart.toString();
187
    }
188

  
189
    private String otherOperators(String[] values, String type) {
190
        StringBuilder SQLQueryPart = new StringBuilder();
191

  
192
        addQuotes(type, SQLQueryPart);
193
        SQLQueryPart.append(values[0]);
194
        addQuotes(type, SQLQueryPart);
195

  
196
        return SQLQueryPart.toString();
197
    }
198

  
199
    private void addQuotes(String type, StringBuilder SQLQueryPart) {
200
        if (type.equals("Text") || type.equals("Datum")) {
201
            SQLQueryPart.append("'");
202
        }
203
    }
94 204
}

Také k dispozici: Unified diff