Project

General

Profile

Download (15.8 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.EnumSet;
13
import java.util.HashMap;
14
import java.util.HashSet;
15
import java.util.List;
16
import java.util.Map;
17
import java.util.Set;
18
import java.util.UUID;
19

    
20
import eu.etaxonomy.cdm.common.URI;
21
import eu.etaxonomy.cdm.model.common.CdmClass;
22
import eu.etaxonomy.cdm.model.description.Character;
23
import eu.etaxonomy.cdm.model.description.MeasurementUnit;
24
import eu.etaxonomy.cdm.model.description.State;
25
import eu.etaxonomy.cdm.model.description.StatisticalMeasure;
26
import eu.etaxonomy.cdm.model.media.Media;
27
import eu.etaxonomy.cdm.model.term.DefinedTerm;
28
import eu.etaxonomy.cdm.model.term.Representation;
29
import eu.etaxonomy.cdm.model.term.TermNode;
30
import eu.etaxonomy.cdm.model.term.TermTree;
31
import eu.etaxonomy.cdm.model.term.TermType;
32
import eu.etaxonomy.cdm.model.term.TermVocabulary;
33
/**
34
 * @author k.luther
35
 * @since Oct 6, 2020
36
 */
37
public class CharacterDto extends FeatureDto {
38

    
39
    private static final long serialVersionUID = 1743178749047550590L;
40

    
41
    private TermNodeDto structure;
42
    private TermDto structureModifier;
43
    private TermNodeDto property;
44
    private TermDto propertyModifier;
45
    private TermNodeDto ratioTo;
46

    
47
    public CharacterDto(UUID uuid, Set<Representation> representations, UUID partOfUuid, UUID kindOfUuid,
48
            UUID vocabularyUuid, Integer orderIndex, String idInVocabulary,
49
            boolean isAvailableForTaxon, boolean isAvailableForTaxonName, boolean isAvailableForOccurrence,
50
            String titleCache, TermNodeDto structure, TermDto structureModifier, TermNodeDto property,
51
            TermDto propertyModifier, TermNodeDto ratioTo, boolean isSupportCategoricalData, boolean isSupportsQuantitativeData, Set<TermVocabularyDto> supportedCategoricalEnumerations, Set<TermVocabularyDto> recommendedModifierEnumeration,  Set<TermDto> recommendedMeasurementUnits,  Set<TermDto> recommendedStatisticalMeasures) {
52
        super(uuid, representations, partOfUuid, kindOfUuid, vocabularyUuid, orderIndex, idInVocabulary,
53
                isAvailableForTaxon, isAvailableForTaxonName, isAvailableForOccurrence, titleCache, isSupportCategoricalData, isSupportsQuantitativeData, supportedCategoricalEnumerations, recommendedModifierEnumeration, recommendedMeasurementUnits, recommendedStatisticalMeasures);
54
        this.structure = structure;
55
        this.structureModifier = structureModifier;
56
        this.property = property;
57
        this.propertyModifier = propertyModifier;
58
        this.setRatioTo(ratioTo);
59
        this.setTermType(TermType.Character);
60
    }
61

    
62
    public static CharacterDto fromCharacter(Character character) {
63
       TermVocabulary voc = character.getVocabulary();
64

    
65
       Set<TermVocabularyDto> recommendedModifierDtos = new HashSet<>();
66
       for (TermVocabulary<DefinedTerm> modVoc: character.getRecommendedModifierEnumeration()){
67
           recommendedModifierDtos.add(TermVocabularyDto.fromVocabulary(modVoc));
68
       }
69

    
70
       Set<TermDto> recommendedStatisticalMeasuresDtos = new HashSet<>();
71
       for (StatisticalMeasure term: character.getRecommendedStatisticalMeasures()){
72
           recommendedStatisticalMeasuresDtos.add(TermDto.fromTerm(term));
73
       }
74

    
75
       Set<TermVocabularyDto> supportedCategoricalDtos = new HashSet<>();
76
       for (TermVocabulary<State> catVoc: character.getSupportedCategoricalEnumerations()){
77
           supportedCategoricalDtos.add(TermVocabularyDto.fromVocabulary(catVoc));
78
       }
79

    
80
       Set<TermDto> recommendedMeasurementUnitsDtos = new HashSet<>();
81
       for (MeasurementUnit term: character.getRecommendedMeasurementUnits()){
82
           recommendedMeasurementUnitsDtos.add(TermDto.fromTerm(term));
83
       }
84
       CharacterDto dto = new CharacterDto(character.getUuid(), character.getRepresentations(), character.getPartOf() != null? character.getPartOf().getUuid(): null, character.getKindOf() != null? character.getKindOf().getUuid(): null,
85
               voc != null? voc.getUuid(): null, null, character.getIdInVocabulary(), character.isAvailableForTaxon(), character.isAvailableForTaxonName(), character.isAvailableForOccurrence(), character.getTitleCache(),
86
                       character.getStructure() !=null? TermNodeDto.fromNode(character.getStructure(), null): null, character.getStructureModifier() != null? TermDto.fromTerm(character.getStructureModifier()): null,
87
                                       character.getProperty() != null? TermNodeDto.fromNode(character.getProperty(), null): null, character.getPropertyModifier() != null? TermDto.fromTerm(character.getPropertyModifier()): null, character.getRatioToStructure() != null? TermNodeDto.fromNode(character.getRatioToStructure(), null): null,
88
                                               character.isSupportsCategoricalData(), character.isSupportsQuantitativeData(),supportedCategoricalDtos, recommendedModifierDtos, recommendedMeasurementUnitsDtos, recommendedStatisticalMeasuresDtos);
89

    
90
       return dto;
91
    }
92

    
93
    public TermNodeDto getStructure() {
94
        return structure;
95
    }
96
    public void setStructure(TermNodeDto structure) {
97
        this.structure = structure;
98
    }
99

    
100
    public TermNodeDto getRatioTo() {
101
        return ratioTo;
102
    }
103

    
104
    public void setRatioTo(TermNodeDto ratioTo) {
105
        this.ratioTo = ratioTo;
106
    }
107

    
108
    public TermDto getStructureModifier() {
109
        return structureModifier;
110
    }
111
    public void setStructureModifier(TermDto structureModifier) {
112
        this.structureModifier = structureModifier;
113
    }
114

    
115
    public TermNodeDto getProperty() {
116
        return property;
117
    }
118
    public void setProperty(TermNodeDto property) {
119
        this.property = property;
120
    }
121

    
122
    public TermDto getPropertyModifier() {
123
        return propertyModifier;
124
    }
125
    public void setPropertyModifier(TermDto propertyModifier) {
126
        this.propertyModifier = propertyModifier;
127
    }
128

    
129

    
130
    public static String getTermDtoSelect(){
131
        String[] result = createSqlParts("Character");
132

    
133
        return result[0]+result[1]+result[2];
134
    }
135

    
136
    private static String[] createSqlParts(String fromTable) {
137
                String sqlSelectString = ""
138
                + "select a.uuid, "
139
                + "r, "
140
                + "p.uuid, "
141
                + "k.uuid, "
142
                + "v.uuid, "
143
//                + "a.orderIndex, "
144
                + "a.idInVocabulary, "
145
//                + "voc_rep,  "
146
                + "a.termType,  "
147
                + "a.uri,  "
148
                + "m,  "
149
                + "a.availableFor, "
150
                + "a.titleCache, "
151
                + "a.supportedDataTypes, "
152
                + "recommendedModifierEnumeration, "
153
                + "recommendedStatisticalMeasures, "
154
                + "supportedCategoricalEnumerations, "
155
                + "recommendedMeasurementUnits, "
156
                + "a.property, "
157
////                + "a.propertyModifier ";
158
                + "a.structure, "
159
//                + "a.structureModifier";
160
                + "ratioToStructure ";
161

    
162
        String sqlFromString =   " from "+fromTable+" as a ";
163

    
164
        String sqlJoinString =  "LEFT JOIN a.partOf as p "
165
                + "LEFT JOIN a.kindOf as k "
166
                + "LEFT JOIN a.media as m "
167
                + "LEFT JOIN a.representations AS r "
168
                + "LEFT JOIN a.vocabulary as v "
169
                + "LEFT JOIN v.representations as voc_rep "
170
                + "LEFT JOIN a.recommendedModifierEnumeration as recommendedModifierEnumeration "
171
                + "LEFT JOIN a.recommendedStatisticalMeasures as recommendedStatisticalMeasures "
172
                + "LEFT JOIN a.supportedCategoricalEnumerations as supportedCategoricalEnumerations "
173
                + "LEFT JOIN a.recommendedMeasurementUnits as recommendedMeasurementUnits "
174
                + "LEFT JOIN a.ratioToStructure as ratioToStructure"
175
                ;
176

    
177
        String[] result = new String[3];
178
        result[0] = sqlSelectString;
179
        result[1] = sqlFromString;
180
        result[2] = sqlJoinString;
181
        return result;
182
    }
183

    
184
    public static List<TermDto> termDtoListFrom(List<Object[]> results) {
185
        List<TermDto> dtos = new ArrayList<>(); // list to ensure order
186
        // map to handle multiple representations/media/vocRepresentation because of LEFT JOIN
187
        Map<UUID, TermDto> dtoMap = new HashMap<>(results.size());
188
        for (Object[] elements : results) {
189
            UUID uuid = (UUID)elements[0];
190
            if(dtoMap.containsKey(uuid)){
191
                // multiple results for one term -> multiple (voc) representation/media
192
                if(elements[1]!=null){
193
                    dtoMap.get(uuid).addRepresentation((Representation)elements[1]);
194
                }
195
//                if(elements[6]!=null){
196
//                    dtoMap.get(uuid).addVocRepresentation((Representation)elements[6]);
197
//                }
198
                if(elements[8]!=null){
199
                    dtoMap.get(uuid).addMedia(((Media) elements[8]).getUuid());
200
                }
201
            } else {
202
                // term representation
203
                Set<Representation> representations = new HashSet<>();
204
                if(elements[1] instanceof Representation) {
205
                    representations = new HashSet<Representation>(1);
206
                    representations.add((Representation)elements[1]);
207
                }
208
                // term media
209
                Set<UUID> mediaUuids = new HashSet<>();
210
                if(elements[8] instanceof Media) {
211
                    mediaUuids.add(((Media) elements[8]).getUuid());
212
                }
213
                // voc representation
214
//                Set<Representation> vocRepresentations = new HashSet<>();
215
//                if(elements[6] instanceof Representation) {
216
//                    vocRepresentations = new HashSet<Representation>(7);
217
//                    vocRepresentations.add((Representation)elements[6]);
218
//                }
219
                boolean isAvailableForTaxon = false;
220
                boolean isAvailableForTaxonName = false;
221
                boolean isAvailableForOccurrence = false;
222

    
223
                EnumSet<CdmClass> availableForString = (EnumSet<CdmClass>)elements[9];
224

    
225
                if (availableForString.contains(CdmClass.TAXON)){
226
                    isAvailableForTaxon = true;
227
                }
228
                if (availableForString.contains(CdmClass.TAXON_NAME)){
229
                    isAvailableForTaxonName = true;
230
                }
231
                if (availableForString.contains(CdmClass.OCCURRENCE)){
232
                    isAvailableForOccurrence = true;
233
                }
234
                boolean isSupportsCategoricalData = false;
235
                boolean isSupportsQuantitativeData = false;
236

    
237
                EnumSet<CdmClass> supportsString = (EnumSet<CdmClass>)elements[11];
238

    
239
                if (supportsString.contains(CdmClass.CATEGORICAL_DATA)){
240
                    isSupportsCategoricalData = true;
241
                }
242
                if (supportsString.contains(CdmClass.QUANTITATIVE_DATA)){
243
                    isSupportsQuantitativeData = true;
244
                }
245

    
246
                Object o = elements[12];
247
                Set<TermVocabularyDto> recommendedModifierDtos = new HashSet<>();
248
                if (o instanceof TermVocabulary){
249
                    recommendedModifierDtos.add(TermVocabularyDto.fromVocabulary((TermVocabulary)o));
250
                }else if (o instanceof Set){
251
                    Set<TermVocabulary<DefinedTerm>> recommendedModifierEnumeration = (Set<TermVocabulary<DefinedTerm>>) o;
252
                    if (recommendedModifierEnumeration != null){
253
                        for (TermVocabulary<DefinedTerm> voc: recommendedModifierEnumeration){
254
                            recommendedModifierDtos.add(TermVocabularyDto.fromVocabulary(voc));
255
                        }
256
                    }
257
                }
258

    
259

    
260

    
261
                o = elements[13];
262
                Set<TermDto> recommendedStatisticalMeasuresDtos = new HashSet<>();
263
                if (o instanceof StatisticalMeasure){
264
                    recommendedStatisticalMeasuresDtos.add(TermDto.fromTerm((StatisticalMeasure)o));
265
                }else if (o instanceof Set){
266
                    Set<StatisticalMeasure> recommendedStatisticalMeasures = (Set<StatisticalMeasure>) o;
267
                    if (recommendedStatisticalMeasures != null) {
268
                        for (StatisticalMeasure term: recommendedStatisticalMeasures){
269
                            recommendedStatisticalMeasuresDtos.add(TermDto.fromTerm(term));
270
                        }
271
                    }
272
                }
273
                o =  elements[14];
274
                Set<TermVocabularyDto> supportedCategoricalDtos = new HashSet<>();
275
                if (o instanceof TermVocabulary){
276
                    supportedCategoricalDtos.add(TermVocabularyDto.fromVocabulary((TermVocabulary)o));
277
                }else if (o instanceof Set){
278
                    Set<TermVocabulary> supportedCategoricalEnumerations = (Set<TermVocabulary>)o;
279
                    for (TermVocabulary<State> voc: supportedCategoricalEnumerations){
280
                        supportedCategoricalDtos.add(TermVocabularyDto.fromVocabulary(voc));
281
                    }
282
                }
283

    
284

    
285
                o = elements[15];
286
                Set<TermDto> recommendedMeasurementUnitsDtos = new HashSet<>();
287
                if (o instanceof MeasurementUnit){
288
                    recommendedMeasurementUnitsDtos.add(TermDto.fromTerm((MeasurementUnit)o));
289
                }else if (o instanceof Set){
290
                    Set<MeasurementUnit> recommendedMeasurementUnits = (Set<MeasurementUnit>) elements[15];
291
                    for (MeasurementUnit term: recommendedMeasurementUnits){
292
                        recommendedMeasurementUnitsDtos.add(TermDto.fromTerm(term));
293
                    }
294
                }
295

    
296
                o = elements[16];
297
                TermNodeDto prop = null;
298
                if (o instanceof TermNode){
299
                    prop = TermNodeDto.fromNode((TermNode) o, TermTreeDto.fromTree((TermTree) ((TermNode)o).getGraph()));
300
                }
301

    
302
                o = elements[17];
303
                TermNodeDto structure = null;
304
                if (o instanceof TermNode){
305
                    structure = TermNodeDto.fromNode((TermNode) o, TermTreeDto.fromTree((TermTree) ((TermNode)o).getGraph()));
306
                }
307

    
308
                o = elements[9];
309
                TermNodeDto ratioTo = null;
310
                if (o instanceof TermNode){
311
                    ratioTo = TermNodeDto.fromNode((TermNode) o, TermTreeDto.fromTree((TermTree) ((TermNode)o).getGraph()));
312
                }
313

    
314

    
315
                TermDto termDto = new CharacterDto(
316
                        uuid,
317
                        representations,
318
                        (UUID)elements[2],
319
                        (UUID)elements[3],
320
                        (UUID)elements[4],
321
                        null,
322
                        (String)elements[5],
323
//                        vocRepresentations,
324
                        isAvailableForTaxon,
325
                        isAvailableForTaxonName,
326
                        isAvailableForOccurrence,
327
                        (String)elements[10],structure, null, prop, null, ratioTo, isSupportsCategoricalData,
328
//                        structure, structureModifier, prop, null, isSupportsCategoricalData,
329
                        isSupportsQuantitativeData,
330
                        supportedCategoricalDtos,
331
                        recommendedModifierDtos,
332
                        recommendedMeasurementUnitsDtos,
333
                        recommendedStatisticalMeasuresDtos)
334
                        ;
335
                termDto.setUri((URI)elements[7]);
336
                termDto.setMedia(mediaUuids);
337

    
338

    
339
                dtoMap.put(uuid, termDto);
340
                dtos.add(termDto);
341
            }
342
        }
343
        return dtos;
344
    }
345

    
346

    
347

    
348
}
349

    
(2-2/30)