Projekt

Obecné

Profil

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

    
3
import vldc.aswi.model.table.*;
4
import vldc.aswi.model.table.contingencyTable.ContingencyTableRow;
5
import vldc.aswi.model.table.contingencyTable.ContingencyTableRowCell;
6

    
7
import java.text.DecimalFormat;
8
import java.util.ArrayList;
9
import java.util.List;
10
import java.util.Map;
11
import java.util.concurrent.TimeUnit;
12

    
13
/**
14
 * Class for converting classes.
15
 */
16
public class Converter {
17

    
18
    private final Map<String, TableColumn> tableColumns;
19
    private final List<NameUserName> rowNames;
20
    private final List<NameUserName> columnNames;
21
    private final List<ValueFunction> valueFunctions;
22

    
23
    private List<Node> columnNodes;
24
    private final DecimalFormat decimalFormat = new DecimalFormat("0.###");
25

    
26
    public Converter(Map<String, TableColumn> tableColumns, List<NameUserName> rowNames, List<NameUserName> columnNames,
27
                     List<ValueFunction> valueFunctions) {
28
        this.tableColumns = tableColumns;
29
        this.rowNames = rowNames;
30
        this.columnNames = columnNames;
31
        this.valueFunctions = valueFunctions;
32
    }
33

    
34
    /**
35
     * Convert Map of TableColumns into list of ContingencyTableRow.
36
     * @return List of ContingencyTableRow.
37
     */
38
    public List<ContingencyTableRow> convertTableColumnsToContingencyTableRows() {
39
        long startTime = System.nanoTime();
40

    
41
        columnNodes = new ArrayList<>();
42
        List<List<String>> values = new ArrayList<>();
43
        for(NameUserName nameUserName : columnNames) {
44
            TableColumn column = tableColumns.get(nameUserName.getName());
45
            values.add(getOriginalValuesFromList(column.getValues()));
46
        }
47

    
48
        Node startNode = new Node();
49
        generateColumns(0, values, columnNodes, startNode);
50

    
51
        List<ContingencyTableRow> contingencyTableRows = new ArrayList<>();
52

    
53
        long startTime2 = System.nanoTime();
54
        List<ContingencyTableRow> dataRows = createDataRows();
55
        long stopTime2 = System.nanoTime();
56
        System.out.println("Rows:" + TimeUnit.MILLISECONDS.convert((stopTime2 - startTime2), TimeUnit.NANOSECONDS));
57

    
58
        long startTime3 = System.nanoTime();
59
        for (ContingencyTableRow dataRow : dataRows) {
60
            for (int i = 0; i < columnNodes.size(); i++) {
61
                if (!columnNodes.get(i).isUsable()) {
62
                    dataRow.getCells().remove(i + 1);
63
                }
64
            }
65
        }
66

    
67
        columnNodes.removeIf(node -> !node.isUsable());
68
        long stopTime3 = System.nanoTime();
69
        System.out.println("Columns remove:" + TimeUnit.MILLISECONDS.convert((stopTime3 - startTime3), TimeUnit.NANOSECONDS));
70

    
71
        long startTime4 = System.nanoTime();
72
        List<ContingencyTableRow> headerRows = createHeaderOnlyRows();
73
        long stopTime4 = System.nanoTime();
74
        System.out.println("Headers:" + TimeUnit.MILLISECONDS.convert((stopTime4 - startTime4), TimeUnit.NANOSECONDS));
75

    
76
        contingencyTableRows.addAll(headerRows);
77
        contingencyTableRows.addAll(dataRows);
78

    
79
        long stopTime = System.nanoTime();
80
        System.out.println("Converter:" + TimeUnit.SECONDS.convert((stopTime - startTime), TimeUnit.NANOSECONDS) + "s");
81

    
82
        return contingencyTableRows;
83
    }
84

    
85
    /**
86
     * Generates header rows.
87
     * @return list of contingency table rows
88
     */
89
    private List<ContingencyTableRow> createHeaderOnlyRows() {
90
        //columnNodes = new ArrayList<>();
91
        List<ContingencyTableRow> headerRows = new ArrayList<>();
92

    
93
//        List<String> valueOptions = new ArrayList<>();
94
//
95
//        for (ValueFunction valueFunction : valueFunctions) {
96
//            if (!valueFunctions.get(0).getType().equals("Seznam")) {
97
//                valueOptions.add(valueFunction.getFunction() + " z " + valueFunction.getName());
98
//            }
99
//            else if (valueFunctions.get(0).getType().equals("Seznam") && columnNames.size() > 0) {
100
//                valueOptions.add("NIC z nic");
101
//            }
102
//        }
103

    
104
        //values.add(valueOptions);
105
        headerRows.add(new ContingencyTableRow(true, 0));
106

    
107
        for (int i = 0; i < columnNames.size(); i++) {
108
            //NameUserName ignored = columnNames.get(i);
109
            //TableColumn column = tableColumns.get(nameUserName.getName());
110
            headerRows.add(new ContingencyTableRow(true, 0));
111
        }
112

    
113
        if (valueFunctions.get(0).getType().equals("Seznam")) {
114
            headerRows.get(0).addTableRowCell(new ContingencyTableRowCell("Seznam", 1));
115
            return headerRows;
116
        }
117

    
118
        for (int i = 0; i < headerRows.size(); i++) {
119
            ContingencyTableRow headerRow = headerRows.get(i);
120

    
121
            if (i == 0) {
122
                headerRow.addTableRowCell(new ContingencyTableRowCell("Tabulka", 1));
123
            }
124
            else {
125
                headerRow.addTableRowCell(new ContingencyTableRowCell("", 1));
126
            }
127
        }
128

    
129

    
130
        List<String> prevValues = new ArrayList<>();
131
        int prevSize = 0;
132
        for (ValueFunction valueFunction : valueFunctions) {
133
            headerRows.get(0).addTableRowCell(new ContingencyTableRowCell(valueFunction.getFunction() + " z " + valueFunction.getName(), 0));
134
            for (Node columnNode : columnNodes) {
135
                for (int i = 0; i < columnNode.getValues().size(); i++) {
136
                    String value = columnNode.getValues().get(i);
137
                    if (!prevValues.contains(value)) {
138
                        prevValues.add(value);
139
                        headerRows.get(i + 1).addTableRowCell(new ContingencyTableRowCell(value, 1));
140
                        headerRows.get(0).getCells().get(headerRows.get(0).getCells().size() - 1).setColSpan(headerRows.get(0).getCells().get(headerRows.get(0).getCells().size() - 1).getColSpan() + 1);
141
                    } else if (columnNode.getValues().size() >= prevSize) {
142
                        headerRows.get(i + 1).getCells().get(headerRows.get(i + 1).getCells().size() - 1).setColSpan(headerRows.get(i + 1).getCells().get(headerRows.get(i + 1).getCells().size() - 1).getColSpan() + 1);
143
                    }
144
                }
145

    
146
                if (columnNode.getValues().size() < prevSize) {
147
                    for (int s = prevSize; s < headerRows.size(); s++) {
148
                        headerRows.get(s).addTableRowCell(new ContingencyTableRowCell("", 1));
149
                    }
150
                    for (int s = 1; s < columnNode.getValues().size(); s++) {
151
                        headerRows.get(s).getCells().get(headerRows.get(s).getCells().size() - 1).setColSpan(headerRows.get(s).getCells().get(headerRows.get(s).getCells().size() - 1).getColSpan() + 1);
152
                    }
153
                    headerRows.get(columnNode.getValues().size()).addTableRowCell(new ContingencyTableRowCell(columnNode.getValues().get(columnNode.getValues().size() - 1) + " Celkem", 1));
154
                }
155

    
156
                prevSize = columnNode.getValues().size();
157
                prevValues.remove(prevValues.size() - 1);
158
            }
159
        }
160

    
161
        for (ValueFunction valueFunction : valueFunctions) {
162
            for (int i = 1; i < headerRows.size(); i++) {
163
                headerRows.get(i).addTableRowCell(new ContingencyTableRowCell("", 1));
164
            }
165
            headerRows.get(0).addTableRowCell(new ContingencyTableRowCell("Celkový " + valueFunction.getFunction() +
166
                    " z " + valueFunction.getName(), 1));
167
        }
168

    
169

    
170

    
171
        long startTime = System.nanoTime();
172
        long stopTime = System.nanoTime();
173
        System.out.println("Colums list:" + TimeUnit.MILLISECONDS.convert((stopTime - startTime), TimeUnit.NANOSECONDS));
174

    
175
        return headerRows;
176
    }
177

    
178
    /**
179
     * Gets original values of a given list.
180
     * @param list list from which original values should be taken
181
     * @return list of original values
182
     */
183
    private List<String> getOriginalValuesFromList(List<String> list) {
184
        List<String> origList = new ArrayList<>();
185

    
186
        for (String string : list) {
187
            if (origList.stream().noneMatch(s -> s.equals(string))) {
188
                origList.add(string);
189
            }
190
        }
191

    
192
        return origList;
193
    }
194

    
195
    /**
196
     * Creates data rows.
197
     * @return list of contingency table rows
198
     */
199
    private List<ContingencyTableRow> createDataRows() {
200
        List<ContingencyTableRow> dataRows = new ArrayList<>();
201
        List<Node> rowNodes = new ArrayList<>();
202
        List<List<String>> values = new ArrayList<>();
203
        for(NameUserName nameUserName : rowNames) {
204
            TableColumn column = tableColumns.get(nameUserName.getName());
205
            values.add(getOriginalValuesFromList(column.getValues()));
206
        }
207

    
208
        long startTime = System.nanoTime();
209
        Node node = new Node();
210
        generateRows(dataRows, 0, values, rowNodes, node);
211
        long stopTime = System.nanoTime();
212
        System.out.println("Rows List:" + TimeUnit.MILLISECONDS.convert((stopTime - startTime), TimeUnit.NANOSECONDS));
213

    
214
        List<ContingencyTableRow> rowsToBeRemoved = new ArrayList<>();
215
        for (int i = 0; i < dataRows.size(); i++) {
216
            if (!fillRowWithData(dataRows.get(i), rowNodes.get(i))) {
217
                rowsToBeRemoved.add(dataRows.get(i));
218
            }
219
        }
220

    
221
        dataRows.removeAll(rowsToBeRemoved);
222

    
223
        if (!valueFunctions.get(0).getType().equals("Seznam") ||
224
                (valueFunctions.get(0).getType().equals("Seznam") && columnNames.size() > 0)) {
225
            dataRows.add(createFinalRow());
226
        }
227

    
228
        return dataRows;
229
    }
230

    
231
    /**
232
     * Recursively generates all possible row combinations, sorted as in contingency table.
233
     * @param rows list of sorted contingency table rows
234
     * @param index index in the values list
235
     * @param values list of lists of values of each query row
236
     * @param rowNodes list of row nodes
237
     * @param prevNode parent node of the nodes
238
     */
239
    private void generateRows(List<ContingencyTableRow> rows, int index, List<List<String>> values, List<Node> rowNodes,
240
                              Node prevNode) {
241
        if (index < values.size()) {
242
            List<String> list = values.get(index);
243
            for (String s : list) {
244
                StringBuilder levelString = new StringBuilder();
245
                for (int i = 0; i < index; i++) {
246
                    levelString.append("      ");
247
                }
248
                levelString.append(s);
249
                ContingencyTableRow row = new ContingencyTableRow(false, index);
250
                row.addTableRowCell(new ContingencyTableRowCell(levelString.toString(), 1));
251
                rows.add(row);
252
                Node node = new Node(prevNode);
253
                node.getValues().add(s);
254
                rowNodes.add(node);
255
                int newIndex = index + 1;
256
                generateRows(rows, newIndex, values, rowNodes, node);
257
            }
258
        }
259
    }
260

    
261
    /**
262
     * Recursively generates all possible column combinations, sorted as in contingency table.
263
     * @param index index in the values list
264
     * @param values list of lists of values of each query row
265
     * @param columnNodes list of column nodes
266
     * @param prevNode parent node of the nodes
267
     */
268
    private void generateColumns(int index, List<List<String>> values, List<Node> columnNodes, Node prevNode) {
269
        if (index < values.size()) {
270
            List<String> list = values.get(index);
271
            for (String s : list) {
272
                Node node = new Node(prevNode);
273
                node.getValues().add(s);
274
                if (checkIfColumnIsUsable(node.getValues())) {
275
                    int newIndex = index + 1;
276
                    generateColumns(newIndex, values, columnNodes, node);
277
                    columnNodes.add(node);
278
                }
279
            }
280
        }
281
    }
282

    
283
    /**
284
     * Fills each data row with data.
285
     * @param row row to ne filled with data
286
     * @param node node of the row
287
     */
288
    private boolean fillRowWithData(ContingencyTableRow row, Node node) {
289
        if (valueFunctions.size() == 0) {
290
            return true;
291
        }
292

    
293
        boolean isSingleValueRow = false;
294

    
295
        if (node.getValues().size() <= 1) {
296
            isSingleValueRow = true;
297
        }
298

    
299
        boolean isRowUsable = false;
300
        if (columnNodes.size() == 0) {
301
            columnNodes.add(new Node());
302
        }
303

    
304
        List<Integer> usableIDs = getUsableIDs(node);
305

    
306
        if (valueFunctions.get(0).getType().equals("Seznam") && !usableIDs.isEmpty()) {
307
            return true;
308
        }
309

    
310
        DoubleWrapper[] totals = new DoubleWrapper[valueFunctions.size()];
311
        initializeWrapperField(totals);
312

    
313
        DoubleWrapper[] totalsAvgSum = new DoubleWrapper[valueFunctions.size()];
314
        initializeWrapperField(totalsAvgSum);
315

    
316
        boolean[] isFilledValueCells = new boolean[valueFunctions.size()];
317
        int columnIndex = 0;
318
        //hodnota
319
        for (int v = 0; v < valueFunctions.size(); v++) {
320
            BooleanWrapper isFirstMinMaxTotal = new BooleanWrapper(true);
321
            ValueFunction valueFunction = valueFunctions.get(v);
322
            //sloupec v kont. tabulce
323
            for (Node columnNode : columnNodes) {
324
                DoubleWrapper result = new DoubleWrapper(0);
325
                DoubleWrapper resultAvgSum = new DoubleWrapper(0);
326
                BooleanWrapper isFirstMinMax = new BooleanWrapper(true);
327
                boolean isFilledCell = false;
328
                // radek v orig. tabulce
329
                for (Integer usableID : usableIDs) {
330
                    boolean isUsable = true;
331
                    int j;
332
                    // zvoleny sloupec ze sloupcu, ziska hodnoty z pouzitelne radky danych sloupcu originalni tabulky a
333
                    // pokud se vsechny rovnaji hodnotam, ktere jsou ulozeny v hodnotach uzlu na pozici vybraneho
334
                    // sloupce, je kommbinace pouzitelna k vypoctum
335
                    for (j = 0; j < columnNode.getValues().size(); j++) {
336
                        if (!tableColumns.get(columnNames.get(j).getName()).getValues().get(usableID).equals(columnNode.getValues().get(j))) {
337
                            isUsable = false;
338
                            break;
339
                        }
340
                    }
341

    
342
                    // zvoleny sloupec z hodnot
343
                    if (tableColumns.get(valueFunction.getNameOfSelect()).getValues().get(usableID) == null) {
344
                        isUsable = false;
345
                    }
346

    
347
                    if (isUsable) { // pokud lze hodnotu pouzit, prunik vsech hodnot sedi (ma nejakou hodnotu)
348
                        columnNode.setUsable(true);
349
                        isRowUsable = true;
350
                        isFilledCell = true;
351
                        computeValues(valueFunction, result, resultAvgSum, columnNode, isFirstMinMax,
352
                                usableID, false, isSingleValueRow);
353
                        if (j <= 1) {
354
                            isFilledValueCells[v] = true;
355
                            computeValues(valueFunction, totals[v], totalsAvgSum[v], null, isFirstMinMaxTotal,
356
                                    usableID, true, isSingleValueRow);
357
                        }
358
                    }
359
                }
360
                if (!isFilledCell) {
361
                    row.addTableRowCell(new ContingencyTableRowCell("", 0));
362
                }
363
                else {
364
                    row.addTableRowCell(generateFilledCell(valueFunction.getFunction(), result.getValue(), result.getValue(), result.getValue(),
365
                            result.getValue(), resultAvgSum.getValue(), result.getValue()));
366
                }
367
                columnIndex++;
368
            }
369
        }
370
        for (int i = 0; i < valueFunctions.size(); i++) {
371
            if (valueFunctions.get(i).getType().equals("Seznam")) {
372
                break;
373
            }
374
            if (!isFilledValueCells[i]) {
375
                row.addTableRowCell(new ContingencyTableRowCell("", 0));
376
            }
377
            else {
378
                row.addTableRowCell(generateFilledCell(valueFunctions.get(i).getFunction(), totals[i].getValue(), totals[i].getValue(),
379
                        totals[i].getValue(), totals[i].getValue(), totalsAvgSum[i].getValue(), totals[i].getValue()));
380
            }
381
        }
382

    
383
        return isRowUsable;
384
    }
385

    
386
    /**
387
     * Gets a list of IDs of the query rows that fit the contingency table row settings.
388
     * @param node node of the row
389
     * @return list of usable IDs
390
     */
391
    private List<Integer> getUsableIDs(Node node) {
392
        List<Integer> ids = new ArrayList<>();
393

    
394
        for (int i = 0; i < tableColumns.get(rowNames.get(0).getName()).getValues().size(); i++) {
395
            boolean isUsable = true;
396
            for (int j = 0; j < node.getValues().size(); j++) {
397
                if (!tableColumns.get(rowNames.get(j).getName()).getValues().get(i).equals(node.getValues().get(j))) {
398
                    isUsable = false;
399
                    break;
400
                }
401
            }
402
            if (isUsable) {
403
                ids.add(i);
404
            }
405
        }
406

    
407
        return ids;
408
    }
409

    
410
    private boolean checkIfColumnIsUsable(List<String> columnNodeValues) {
411
        for (int i = 0; i < tableColumns.get(columnNames.get(0).getName()).getValues().size(); i++) {
412
            boolean isUsable = true;
413
            for (int j = 0; j < columnNodeValues.size(); j++) {
414
                if (!tableColumns.get(columnNames.get(j).getName()).getValues().get(i).equals(columnNodeValues.get(j))) {
415
                    isUsable = false;
416
                    break;
417
                }
418
            }
419

    
420
            if (isUsable) {
421
                return true;
422
            }
423
        }
424

    
425
        return false;
426
    }
427

    
428
    private void computeValues(ValueFunction valueFunction, DoubleWrapper result, DoubleWrapper resultAvgSum, Node columnNode,
429
                               BooleanWrapper isFirstMinMax, int usableID, boolean isValueTotal, boolean isSingleValueRow) {
430
        switch (valueFunction.getFunction()) {
431
            case "COUNT":
432
                count(valueFunction, result, columnNode, isValueTotal, isSingleValueRow);
433
                break;
434
            case "SUM":
435
                sum(valueFunction, result, columnNode, usableID, isValueTotal, isSingleValueRow);
436
                break;
437
            case "MIN":
438
                min(valueFunction, result, columnNode, isFirstMinMax, usableID, isValueTotal, isSingleValueRow);
439
                break;
440
            case "MAX":
441
                max(valueFunction, result, columnNode, isFirstMinMax, usableID, isValueTotal, isSingleValueRow);
442
                break;
443
            case "AVG":
444
                average(valueFunction, result, resultAvgSum, columnNode, usableID, isValueTotal, isSingleValueRow);
445
                break;
446
        }
447
    }
448

    
449
    private ContingencyTableRowCell generateFilledCell(String function, double totalResult, double totalResultSum,
450
                                                       double totalMin, double totalMax, double totalResultAvgSum,
451
                                                       double totalResultAvg) {
452
        ContingencyTableRowCell cell = null;
453
        switch (function) {
454
            case "COUNT":
455
                cell = new ContingencyTableRowCell(decimalFormat.format(totalResult), 1);
456
                break;
457
            case "SUM":
458
                cell = new ContingencyTableRowCell(decimalFormat.format(totalResultSum), 1);
459
                break;
460
            case "MIN":
461
                cell = new ContingencyTableRowCell(decimalFormat.format(totalMin), 1);
462
                break;
463
            case "MAX":
464
                cell = new ContingencyTableRowCell(decimalFormat.format(totalMax), 1);
465
                break;
466
            case "AVG":
467
                if (totalResultAvg == 0) {
468
                    cell = new ContingencyTableRowCell("!!Dělení nulou!!", 0);
469
                } else {
470
                    cell = new ContingencyTableRowCell(decimalFormat.format(totalResultAvgSum / totalResultAvg), 0);
471
                }
472
                break;
473
        }
474

    
475
        return cell;
476
    }
477

    
478
    private void initializeWrapperField(DoubleWrapper[] field) {
479
        for (int i = 0; i < field.length; i++) {
480
            field[i] = new DoubleWrapper(0);
481
        }
482
    }
483

    
484
    private void count(ValueFunction valueFunction, DoubleWrapper result, Node columnNode, boolean isValueTotal,
485
                       boolean isSingleValueRow) {
486
        result.setValue(result.getValue() + 1);
487
        if (columnNode != null && isSingleValueRow) {
488
            columnNode.setTotalResult(columnNode.getTotalResult() + 1);
489
        }
490
        if (isValueTotal && isSingleValueRow) {
491
            valueFunction.setTotalResult(valueFunction.getTotalResult() + 1);
492
        }
493
    }
494

    
495
    private void sum(ValueFunction valueFunction, DoubleWrapper result, Node columnNode, int usableID, boolean isValueTotal,
496
                     boolean isSingleValueRow) {
497
        if (valueFunction.getType().equals("Číslo")) {
498
            result.setValue(result.getValue() + Double.parseDouble(tableColumns.get(valueFunction.getNameOfSelect()).getValues().get(usableID)));
499
            if (columnNode != null && isSingleValueRow) {
500
                columnNode.setTotalResultSum(columnNode.getTotalResultSum() + Double.parseDouble(tableColumns.get(valueFunction.getNameOfSelect()).getValues().get(usableID)));
501
            }
502
            if (isValueTotal && isSingleValueRow) {
503
                valueFunction.setTotalResultSum(valueFunction.getTotalResultSum() + Double.parseDouble(tableColumns.get(valueFunction.getNameOfSelect()).getValues().get(usableID)));
504
            }
505
        }
506
    }
507

    
508
    private void min(ValueFunction valueFunction, DoubleWrapper result, Node columnNode, BooleanWrapper isFirstMinMax,
509
                     int usableID, boolean isValueTotal, boolean isSingleValueRow) {
510
        if (valueFunction.getType().equals("Číslo")) {
511
            if (isFirstMinMax.isValue()) {
512
                isFirstMinMax.setValue(false);
513
                result.setValue(Double.parseDouble(tableColumns.get(valueFunction.getNameOfSelect()).getValues().get(usableID)));
514
            }
515
            else {
516
                result.setValue(Math.min(result.getValue(), Integer.parseInt(tableColumns.get(valueFunction.getNameOfSelect()).getValues().get(usableID))));
517
            }
518
            if (columnNode != null && isSingleValueRow) {
519
                if (columnNode.isFirstMin()) {
520
                    columnNode.setFirstMin(false);
521
                    columnNode.setTotalMin(Double.parseDouble(tableColumns.get(valueFunction.getNameOfSelect()).getValues().get(usableID)));
522
                } else {
523
                    columnNode.setTotalMin(Math.min(columnNode.getTotalMin(), Integer.parseInt(tableColumns.get(valueFunction.getNameOfSelect()).getValues().get(usableID))));
524
                }
525
            }
526
            if (isValueTotal && isSingleValueRow) {
527
                if (valueFunction.isFirstMin()) {
528
                    valueFunction.setFirstMin(false);
529
                    valueFunction.setTotalMin(Double.parseDouble(tableColumns.get(valueFunction.getNameOfSelect()).getValues().get(usableID)));
530
                } else {
531
                    valueFunction.setTotalMin(Math.min(valueFunction.getTotalMin(), Integer.parseInt(tableColumns.get(valueFunction.getNameOfSelect()).getValues().get(usableID))));
532
                }
533
            }
534
        }
535
    }
536

    
537
    private void max(ValueFunction valueFunction, DoubleWrapper result, Node columnNode, BooleanWrapper isFirstMinMax,
538
                     int usableID, boolean isValueTotal, boolean isSingleValueRow) {
539
        if (valueFunction.getType().equals("Číslo")) {
540
            if (isFirstMinMax.isValue()) {
541
                isFirstMinMax.setValue(false);
542
                result.setValue(Double.parseDouble(tableColumns.get(valueFunction.getNameOfSelect()).getValues().get(usableID)));
543
            }
544
            else {
545
                result.setValue(Math.max(result.getValue(), Integer.parseInt(tableColumns.get(valueFunction.getNameOfSelect()).getValues().get(usableID))));
546
            }
547
            if (columnNode != null && isSingleValueRow) {
548
                if (columnNode.isFirstMax()) {
549
                    columnNode.setFirstMax(false);
550
                    columnNode.setTotalMax(Double.parseDouble(tableColumns.get(valueFunction.getNameOfSelect()).getValues().get(usableID)));
551
                } else {
552
                    columnNode.setTotalMax(Math.max(columnNode.getTotalMax(), Integer.parseInt(tableColumns.get(valueFunction.getNameOfSelect()).getValues().get(usableID))));
553
                }
554
            }
555
            if (isValueTotal && isSingleValueRow) {
556
                if (valueFunction.isFirstMax()) {
557
                    valueFunction.setFirstMax(false);
558
                    valueFunction.setTotalMax(Double.parseDouble(tableColumns.get(valueFunction.getNameOfSelect()).getValues().get(usableID)));
559
                } else {
560
                    valueFunction.setTotalMax(Math.max(valueFunction.getTotalMax(), Integer.parseInt(tableColumns.get(valueFunction.getNameOfSelect()).getValues().get(usableID))));
561
                }
562
            }
563
        }
564
    }
565

    
566
    private void average(ValueFunction valueFunction, DoubleWrapper result, DoubleWrapper resultAvgSum, Node columnNode,
567
                         int usableID, boolean isValueTotal, boolean isSingleValueRow) {
568
        if (valueFunction.getType().equals("Číslo")) {
569
            result.setValue(result.getValue() + 1);
570
            resultAvgSum.setValue(resultAvgSum.getValue() + Double.parseDouble(tableColumns.get(valueFunction.getNameOfSelect()).getValues().get(usableID)));
571
            if (columnNode != null && isSingleValueRow) {
572
                columnNode.setTotalResultAvg(columnNode.getTotalResultAvg() + 1);
573
                columnNode.setTotalResultAvgSum(columnNode.getTotalResultAvgSum() + Double.parseDouble(tableColumns.get(valueFunction.getNameOfSelect()).getValues().get(usableID)));
574
            }
575
            if (isValueTotal && isSingleValueRow) {
576
                valueFunction.setTotalResultAvg(valueFunction.getTotalResultAvg() + 1);
577
                valueFunction.setTotalResultAvgSum(valueFunction.getTotalResultAvgSum() + Double.parseDouble(tableColumns.get(valueFunction.getNameOfSelect()).getValues().get(usableID)));
578
            }
579
        }
580
    }
581

    
582
    private ContingencyTableRow createFinalRow() {
583
        ContingencyTableRow finalRow = new ContingencyTableRow(false, 0);
584
        finalRow.addTableRowCell(new ContingencyTableRowCell("Celkem", 1));
585

    
586
        List<ContingencyTableRowCell> valueCells = new ArrayList<>();
587
        for (ValueFunction valueFunction : valueFunctions) {
588
            for (Node columnNode : columnNodes) {
589
                    finalRow.addTableRowCell(generateFilledCell(valueFunction.getFunction(), columnNode.getTotalResult(), columnNode.getTotalResultSum(),
590
                            columnNode.getTotalMin(), columnNode.getTotalMax(), columnNode.getTotalResultAvgSum(),
591
                            columnNode.getTotalResultAvg()));
592
            }
593
            valueCells.add(generateFilledCell(valueFunction.getFunction(), valueFunction.getTotalResult(), valueFunction.getTotalResultSum(),
594
                    valueFunction.getTotalMin(), valueFunction.getTotalMax(), valueFunction.getTotalResultAvgSum(),
595
                    valueFunction.getTotalResultAvg()));
596
        }
597

    
598
        finalRow.addTableRowCells(valueCells);
599

    
600
        return finalRow;
601
    }
602
}
(2-2/5)