Project

General

Profile

Download (7.2 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2020 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.cdm.persistence.dto;
10

    
11
import java.util.ArrayList;
12
import java.util.HashMap;
13
import java.util.HashSet;
14
import java.util.List;
15
import java.util.Map;
16
import java.util.Set;
17
import java.util.UUID;
18

    
19
import eu.etaxonomy.cdm.common.URI;
20
import eu.etaxonomy.cdm.model.description.Character;
21
import eu.etaxonomy.cdm.model.term.Representation;
22
import eu.etaxonomy.cdm.model.term.TermNode;
23
import eu.etaxonomy.cdm.model.term.TermTree;
24
import eu.etaxonomy.cdm.model.term.TermType;
25

    
26
/**
27
 * @author k.luther
28
 * @since 07.01.2020
29
 */
30
public class TermTreeDto extends TermCollectionDto {
31
    private static final long serialVersionUID = -7223363599985320531L;
32

    
33
    private TermNodeDto root;
34
    private Map<UUID, Set<FeatureStateDto>> inapplicableMap = new HashMap<>(); //a map <uuid of the parent feature, uuid of child feature, state> shows for a parent feature which features are inapplicable for specific state
35
    private Map<UUID, Set<FeatureStateDto>> onlyApplicableMap = new HashMap<>();
36

    
37

    
38
    public static TermTreeDto fromTree(TermTree tree){
39
        TermTreeDto dto = new TermTreeDto(tree.getUuid(), tree.getRepresentations(), tree.getTermType(), tree.getRoot(), tree.getTitleCache(), tree.isAllowDuplicates(), tree.isOrderRelevant(), tree.isFlat() );
40
        return dto;
41
    }
42

    
43
    public TermTreeDto(UUID uuid, Set<Representation> representations, TermType termType, String titleCache, boolean isAllowDuplicates, boolean isOrderRelevant, boolean isFlat) {
44
        super(uuid, representations, termType, titleCache, isAllowDuplicates, isOrderRelevant, isFlat);
45
    }
46

    
47
    public TermTreeDto(UUID uuid, Set<Representation> representations, TermType termType, TermNode root, String titleCache, boolean isAllowDuplicates, boolean isOrderRelevant, boolean isFlat) {
48
        super(uuid, representations, termType, titleCache, isAllowDuplicates, isOrderRelevant, isFlat);
49
        this.root = new TermNodeDto(null, 0, this, root.getUuid(), root.treeIndex(), root.getPath());
50
    }
51

    
52
    public TermNodeDto getRoot() {
53
       return root;
54
    }
55

    
56
    public void setRoot(TermNodeDto root) {
57
        this.root = root;
58
    }
59

    
60
    public boolean removeChild(TermNodeDto nodeDto){
61
        return this.root.removeChild(nodeDto, true);
62
    }
63

    
64
    public static String getTermTreeDtoSelect(){
65
        String[] result = createSqlParts();
66

    
67
        return result[0]+result[1]+result[2];
68
    }
69

    
70
    public static String getTermTreeDtoSelectForDescriptiveDataSet(){
71
        String[] result = createSqlPartsForDescriptiveDataSet();
72

    
73
        return result[0]+result[1]+result[2];
74
    }
75

    
76
    private static String[] createSqlParts() {
77
        String sqlSelectString = ""
78
                + "select a.uuid, "
79
                + "r, "
80
                + "a.termType,  "
81
                + "a.uri,  "
82
                + "root,  "
83
                + "a.titleCache, "
84
                + "a.allowDuplicates, "
85
                + "a.orderRelevant, "
86
                + "a.isFlat ";
87
        String sqlFromString =   "from TermTree as a ";
88

    
89
        String sqlJoinString =  "LEFT JOIN a.root as root "
90
               + "LEFT JOIN a.representations AS r "
91
                ;
92

    
93
        String[] result = new String[3];
94
        result[0] = sqlSelectString;
95
        result[1] = sqlFromString;
96
        result[2] = sqlJoinString;
97
        return result;
98
    }
99

    
100

    
101
    private static String[] createSqlPartsForDescriptiveDataSet() {
102
        String sqlSelectString = ""
103
                + "select a.uuid, "
104
                + "r, "
105
                + "a.termType,  "
106
                + "a.uri,  "
107
                + "root,  "
108
                + "a.titleCache, "
109
                + "a.allowDuplicates, "
110
                + "a.orderRelevant, "
111
                + "a.isFlat ";
112
        String sqlFromString =   "from DescriptiveDataSet as d ";
113

    
114
        String sqlJoinString =  "JOIN d.descriptiveSystem as a "
115
               + "LEFT JOIN a.root as root "
116
               + "LEFT JOIN a.representations AS r "
117
                ;
118

    
119
        String[] result = new String[3];
120
        result[0] = sqlSelectString;
121
        result[1] = sqlFromString;
122
        result[2] = sqlJoinString;
123
        return result;
124
    }
125

    
126

    
127
    public static List<TermTreeDto> termTreeDtoListFrom(List<Object[]> results) {
128
        List<TermTreeDto> dtos = new ArrayList<>(); // list to ensure order
129
        // map to handle multiple representations/media/vocRepresentation because of LEFT JOIN
130
        Map<UUID, TermTreeDto> dtoMap = new HashMap<>(results.size());
131
        for (Object[] elements : results) {
132
            UUID uuid = (UUID)elements[0];
133
            if(dtoMap.containsKey(uuid)){
134
                // multiple results for one term -> multiple (voc) representation/media
135
                if(elements[1]!=null){
136
                    dtoMap.get(uuid).addRepresentation((Representation)elements[1]);
137
                }
138
            } else {
139
                // term representation
140
                Set<Representation> representations = new HashSet<>();
141
                if(elements[1] instanceof Representation) {
142
                    representations = new HashSet<>(1);
143
                    representations.add((Representation)elements[1]);
144
                }
145

    
146
                TermTreeDto termTreeDto = new TermTreeDto(
147
                        uuid,
148
                        representations,
149
                        (TermType)elements[2],
150
                        (String)elements[5],
151
                        (boolean)elements[6],
152
                        (boolean)elements[7],
153
                        (boolean)elements[8]);
154
                termTreeDto.setUri((URI)elements[3]);
155
                if (termTreeDto.getTermType().equals(TermType.Character)){
156
                    termTreeDto.setRoot(CharacterNodeDto.fromTermNode((TermNode<Character>) elements[4], termTreeDto));
157
                }else {
158
                    termTreeDto.setRoot(TermNodeDto.fromNode((TermNode)elements[4], termTreeDto));
159
                }
160

    
161
                dtoMap.put(uuid, termTreeDto);
162
                dtos.add(termTreeDto);
163
            }
164
        }
165
        return dtos;
166
    }
167

    
168
    public boolean containsSubtrees(){
169
        boolean result = false;
170
        for (TermNodeDto child: root.getChildren()){
171
            if (child.getChildren() != null && !child.getChildren().isEmpty()){
172
                result = true;
173
                break;
174
            }
175
        }
176
        return result;
177
    }
178

    
179
    /**
180
     * @return the inapplicableMap
181
     */
182
    public Map<UUID, Set<FeatureStateDto>> getInapplicableMap() {
183
        return inapplicableMap;
184
    }
185

    
186
    /**
187
     * @param inapplicableMap the inapplicableMap to set
188
     */
189
    public void setInapplicableMap(Map<UUID, Set<FeatureStateDto>> inapplicableMap) {
190
        this.inapplicableMap = inapplicableMap;
191
    }
192

    
193
    /**
194
     * @return the onlyApplicable
195
     */
196
    public Map<UUID, Set<FeatureStateDto>> getOnlyApplicable() {
197
        return onlyApplicableMap;
198
    }
199

    
200
    /**
201
     * @param onlyApplicable the onlyApplicable to set
202
     */
203
    public void setOnlyApplicable(Map<UUID, Set<FeatureStateDto>> onlyApplicable) {
204
        this.onlyApplicableMap = onlyApplicable;
205
    }
206
}
(29-29/30)