Projekt

Obecné

Profil

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

    
3
import vldc.aswi.model.table.NameUserName;
4
import vldc.aswi.model.table.Node;
5
import vldc.aswi.model.table.TableColumn;
6
import vldc.aswi.model.table.ValueFunction;
7
import vldc.aswi.model.table.contingencyTable.ContingencyTableRow;
8
import vldc.aswi.model.table.contingencyTable.ContingencyTableRowCell;
9

    
10
import java.util.ArrayList;
11
import java.util.List;
12
import java.util.Map;
13

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

    
19
    private List<Node> rowNodes;
20
    private List<Node> columnNodes;
21

    
22
    /**
23
     * Convert Map of TableColumns into list of ContingencyTableRow.
24
     * @param tableColumns - Map of TableColumn.
25
     * @return List of ContingencyTableRow.
26
     */
27
    public List<ContingencyTableRow> convertTableColumnsToContingencyTableRows(Map<String, TableColumn> tableColumns,
28
                                                                                      List<NameUserName> rowNames,
29
                                                                                      List<NameUserName> columnNames,
30
                                                                                      List<ValueFunction> valueFunctions) {
31
        /*
32
        List<ContingencyTableRow> contingencyTableRows = new ArrayList<>();
33

    
34
        // Create header row with column names.
35
        ContingencyTableRow contingencyTableRowHeader = new ContingencyTableRow(true, 0);
36
        for (String columnName : tableColumns.keySet()) {
37
            contingencyTableRowHeader.addTableRowCell(new ContingencyTableRowCell(columnName, 0));
38
        }
39
        contingencyTableRows.add(contingencyTableRowHeader);
40

    
41
        boolean listExpanded = false;
42

    
43
        // Create contingency table row.
44
        for (TableColumn tableColumn : tableColumns.values()) {
45
            List<String> values = tableColumn.getValues();
46

    
47
            // If list is not created, then create it.
48
            if (!listExpanded) {
49
                for (int j = 0; j < values.size(); j++) {
50
                    ContingencyTableRow contingencyTableRow = new ContingencyTableRow(false, 0);
51
                    contingencyTableRows.add(contingencyTableRow);
52
                }
53
                listExpanded = true;
54
            }
55

    
56
            // Iterate through all values and assign one value per one row.
57
            for (int j = 0; j < values.size(); j++) {
58
                ContingencyTableRowCell contingencyTableRowCell = new ContingencyTableRowCell(values.get(j), 0);
59
                contingencyTableRows.get(j + 1).addTableRowCell(contingencyTableRowCell);
60
            }
61
        }
62

    
63
          */
64
        List<ContingencyTableRow> contingencyTableRows = new ArrayList<>();
65

    
66
        List<ContingencyTableRow> headerRows = createHeaderOnlyRows(tableColumns, columnNames);
67
        List<ContingencyTableRow> dataRows = createDataRows(tableColumns, columnNames, rowNames, valueFunctions);
68

    
69
        contingencyTableRows.addAll(headerRows);
70
        contingencyTableRows.addAll(dataRows);
71

    
72
        return contingencyTableRows;
73
    }
74

    
75
    private List<ContingencyTableRow> createHeaderOnlyRows(Map<String, TableColumn> tableColumns, List<NameUserName> columnNames) {
76
        List<List<String>> values = new ArrayList<>();
77
        columnNodes = new ArrayList<>();
78
        List<ContingencyTableRow> headerRows = new ArrayList<>();
79
        for(NameUserName nameUserName : columnNames) {
80
            TableColumn column = tableColumns.get(nameUserName.getName());
81
            values.add(getOriginalValuesFromList(column.getValues()));
82
            headerRows.add(new ContingencyTableRow(true, 0));
83
        }
84

    
85
        Node node = new Node();
86
        generateColumns(0, values, columnNodes, node);
87

    
88
        for (int i = 0; i < values.size(); i++) {
89
            int colSpan = 1;
90
            for (int j = values.size() - 1; j > i; j--) {
91
                if (values.size() - 1 == j) {
92
                    colSpan = values.get(j).size();
93
                }
94
                else {
95
                    colSpan = (colSpan + 1) * values.get(j).size();
96
                }
97
            }
98
            int loopCount = 1;
99
            for (int k = 0; k < i; k++) {
100
                loopCount = loopCount * values.get(k).size();
101
            }
102
            headerRows.get(i).addTableRowCell(new ContingencyTableRowCell("", 1));
103
            for (int k = 0; k < loopCount; k++) {
104
                for (String value : values.get(i)) {
105
                    headerRows.get(i).addTableRowCell(new ContingencyTableRowCell(value, colSpan));
106
                    if (i != values.size() - 1) {
107
                        headerRows.get(i).addTableRowCell(new ContingencyTableRowCell(value + " Celkem", 1));
108
                    }
109
                }
110

    
111
                for (int l = 0; l < i; l++) {
112
                    headerRows.get(i).addTableRowCell(new ContingencyTableRowCell("", 1));
113
                }
114
            }
115
            if (i == 0) {
116
                headerRows.get(i).addTableRowCell(new ContingencyTableRowCell("Celkový počet", 1));
117
            }
118
        }
119

    
120
        return headerRows;
121
    }
122

    
123
    private List<String> getOriginalValuesFromList(List<String> list) {
124
        List<String> origList = new ArrayList<>();
125

    
126
        for (String string : list) {
127
            if (origList.stream().noneMatch(s -> s.equals(string))) {
128
                origList.add(string);
129
            }
130
        }
131

    
132
        return origList;
133
    }
134

    
135
    private List<ContingencyTableRow> createDataRows(Map<String, TableColumn> tableColumns, List<NameUserName> columnNames,
136
                                                     List<NameUserName> rowNames, List<ValueFunction> valueFunctions) {
137
        List<ContingencyTableRow> dataRows = new ArrayList<>();
138
        rowNodes = new ArrayList<>();
139
        List<List<String>> values = new ArrayList<>();
140
        for(NameUserName nameUserName : rowNames) {
141
            TableColumn column = tableColumns.get(nameUserName.getName());
142
            values.add(getOriginalValuesFromList(column.getValues()));
143
        }
144

    
145
        Node node = new Node();
146
        generateRows(dataRows, 0, values, rowNodes, node);
147

    
148
        for (int i = 0; i < dataRows.size(); i++) {
149
            fillRowWithCountData(dataRows.get(i), tableColumns, rowNodes.get(i), rowNames, columnNames, valueFunctions);
150
        }
151

    
152
        return dataRows;
153
    }
154

    
155
    private void generateRows(List<ContingencyTableRow> rows, int index, List<List<String>> values, List<Node> rowNodes,
156
                              Node prevNode) {
157
        if (index < values.size()) {
158
            List<String> list = values.get(index);
159
            for (String s : list) {
160
                StringBuilder levelString = new StringBuilder();
161
                for (int i = 0; i < index; i++) {
162
                    levelString.append("\t");
163
                }
164
                levelString.append(s);
165
                ContingencyTableRow row = new ContingencyTableRow(false, index);
166
                row.addTableRowCell(new ContingencyTableRowCell(levelString.toString(), 1));
167
                rows.add(row);
168
                Node node = new Node(prevNode);
169
                node.getValues().add(s);
170
                rowNodes.add(node);
171
                int newIndex = index + 1;
172
                generateRows(rows, newIndex, values, rowNodes, node);
173
            }
174
        }
175
    }
176

    
177
    private void generateColumns(int index, List<List<String>> values, List<Node> columnNodes, Node prevNode) {
178
        if (index < values.size()) {
179
            List<String> list = values.get(index);
180
            for (String s : list) {
181
                Node node = new Node(prevNode);
182
                node.getValues().add(s);
183
                int newIndex = index + 1;
184
                generateColumns(newIndex, values, columnNodes, node);
185
                columnNodes.add(node);
186
            }
187
        }
188
    }
189

    
190
    private void fillRowWithCountData(ContingencyTableRow row, Map<String, TableColumn> tableColumns, Node node,
191
                                      List<NameUserName> rowNames, List<NameUserName> columnNames, List<ValueFunction> valueFunctions) {
192
        //sloupec v kont. tabulce
193
        for (Node columnNode : columnNodes) {
194
            int count = 0;
195
            // radek v orig. tabulce
196
            for (int i = 0; i < tableColumns.get(rowNames.get(0).getName()).getValues().size(); i++) {
197
                boolean isUsable = true;
198
                //zvoleny sloupec z radku
199
                for (int j = 0; j < node.getValues().size(); j++) {
200
                    if (!tableColumns.get(rowNames.get(j).getName()).getValues().get(i).equals(node.getValues().get(j))) {
201
                        isUsable = false;
202
                        break;
203
                    }
204
                }
205
                // zvoleny sloupec ze sloupcu
206
                for (int j = 0; j < columnNode.getValues().size(); j++) {
207
                    if (!tableColumns.get(columnNames.get(j).getName()).getValues().get(i).equals(columnNode.getValues().get(j))) {
208
                        isUsable = false;
209
                        break;
210
                    }
211
                }
212
                // zvoleny sloupec z hodnot
213
                for (ValueFunction valueFunction : valueFunctions) {
214
                    if (tableColumns.get(valueFunction.getValue()).getValues().get(i) == null) {
215
                        isUsable = false;
216
                        break;
217
                    }
218
                }
219

    
220
                if (isUsable) {
221
                    count++;
222
                }
223
            }
224

    
225
            row.addTableRowCell(new ContingencyTableRowCell(Integer.toString(count), 0));
226
        }
227
    }
228
}
(2-2/5)