Project

General

Profile

Download (20 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.hibernate.HibernateProxyHelper;
22
import eu.etaxonomy.cdm.model.common.CdmClass;
23
import eu.etaxonomy.cdm.model.description.Feature;
24
import eu.etaxonomy.cdm.model.description.MeasurementUnit;
25
import eu.etaxonomy.cdm.model.description.State;
26
import eu.etaxonomy.cdm.model.description.StatisticalMeasure;
27
import eu.etaxonomy.cdm.model.media.Media;
28
import eu.etaxonomy.cdm.model.term.DefinedTerm;
29
import eu.etaxonomy.cdm.model.term.Representation;
30
import eu.etaxonomy.cdm.model.term.TermType;
31
import eu.etaxonomy.cdm.model.term.TermVocabulary;
32

    
33
/**
34
 * @author k.luther
35
 * @since Jun 11, 2020
36
 */
37
public class FeatureDto extends TermDto {
38

    
39
    private static final long serialVersionUID = 5123011385890020838L;
40

    
41
    boolean isAvailableForTaxon = true;
42
    boolean isAvailableForTaxonName = true;
43
    boolean isAvailableForOccurrence = true;
44
    boolean isSupportsCategoricalData = false;
45
    boolean isSupportsQuantitativeData = false;
46

    
47
    Set<TermDto> recommendedMeasurementUnits = new HashSet<>();
48
    Set<TermDto> recommendedStatisticalMeasures = new HashSet<>();
49
    Set<TermVocabularyDto> supportedCategoricalEnumerations = new HashSet<>();
50
    Set<TermVocabularyDto> recommendedModifierEnumeration = new HashSet<>();
51

    
52
    public FeatureDto(UUID uuid, Set<Representation> representations, UUID partOfUuid, UUID kindOfUuid,
53
            UUID vocabularyUuid, Integer orderIndex, String idInVocabulary, //Set<Representation> vocRepresentations,
54
            boolean isAvailableForTaxon, boolean isAvailableForTaxonName, boolean isAvailableForOccurrence, String titleCache, boolean isSupportsCategoricalData, boolean isSupportsQuantitativeData,
55
            Set<TermVocabularyDto> supportedCategoricalEnumerations, Set<TermVocabularyDto> recommendedModifierEnumeration,  Set<TermDto> recommendedMeasurementUnits,  Set<TermDto> recommendedStatisticalMeasures){
56
        super(uuid, representations, TermType.Feature, partOfUuid, kindOfUuid,
57
                vocabularyUuid, orderIndex, idInVocabulary, titleCache);
58
        this.isAvailableForOccurrence = isAvailableForOccurrence;
59
        this.isAvailableForTaxon = isAvailableForTaxon;
60
        this.isAvailableForTaxonName = isAvailableForTaxonName;
61

    
62
        this.isSupportsCategoricalData = isSupportsCategoricalData;
63
        this.isSupportsQuantitativeData = isSupportsQuantitativeData;
64

    
65
        this.recommendedMeasurementUnits = recommendedMeasurementUnits;
66
        this.recommendedStatisticalMeasures = recommendedStatisticalMeasures;
67
        this.supportedCategoricalEnumerations = supportedCategoricalEnumerations;
68
        this.recommendedModifierEnumeration = recommendedModifierEnumeration;
69
    }
70

    
71

    
72

    
73
    static public FeatureDto fromFeature(Feature term) {
74
        UUID partOfUuid = term.getPartOf() != null? term.getPartOf().getUuid(): null;
75
        UUID kindOfUuid = term.getKindOf() != null? term.getKindOf().getUuid(): null;
76
        TermVocabulary<?> vocabulary = HibernateProxyHelper.deproxy(term.getVocabulary());
77
        UUID vocUuid =  vocabulary != null? vocabulary.getUuid(): null;
78
        Set<TermVocabularyDto> supportedCategoricalEnumerations = new HashSet<>();
79
        for (TermVocabulary<State> stateVoc:term.getSupportedCategoricalEnumerations()){
80
            supportedCategoricalEnumerations.add(TermVocabularyDto.fromVocabulary(stateVoc));
81
        }
82

    
83
        Set<TermVocabularyDto> recommendedModifiers = new HashSet<>();
84
        for (TermVocabulary<DefinedTerm> modifier:term.getRecommendedModifierEnumeration()){
85
            recommendedModifiers.add(TermVocabularyDto.fromVocabulary(modifier));
86
        }
87

    
88
        Set<TermDto> recommendedMeasurementUnits= new HashSet<>();
89
        for (MeasurementUnit measurementUnit:term.getRecommendedMeasurementUnits()){
90
            recommendedMeasurementUnits.add(TermDto.fromTerm(measurementUnit));
91
        }
92

    
93
        Set<TermDto> recommendedStatisticalMeasures = new HashSet<>();
94
        for (StatisticalMeasure statMeasure:term.getRecommendedStatisticalMeasures()){
95
            recommendedStatisticalMeasures.add(TermDto.fromTerm(statMeasure));
96
        }
97

    
98
        FeatureDto result =  new FeatureDto(term.getUuid(), term.getRepresentations(), partOfUuid, kindOfUuid, vocUuid, null, term.getIdInVocabulary(), term.isAvailableForTaxon(), term.isAvailableForTaxonName(), term.isAvailableForOccurrence(),
99
                term.getTitleCache(),term.isSupportsCategoricalData(), term.isSupportsQuantitativeData(), supportedCategoricalEnumerations, recommendedModifiers, recommendedMeasurementUnits, recommendedStatisticalMeasures);
100
        result.isAvailableForOccurrence = term.isAvailableForOccurrence();
101
        result.isAvailableForTaxon = term.isAvailableForTaxon();
102
        result.isAvailableForTaxonName = term.isAvailableForTaxonName();
103
        result.isSupportsCategoricalData = term.isSupportsCategoricalData();
104
        result.isSupportsQuantitativeData = term.isSupportsQuantitativeData();
105
        if (term.getRecommendedMeasurementUnits() != null && !term.getRecommendedMeasurementUnits().isEmpty()){
106
            result.recommendedMeasurementUnits = new HashSet<>();
107
        }
108
        for (MeasurementUnit unit: term.getRecommendedMeasurementUnits()){
109
            result.recommendedMeasurementUnits.add(TermDto.fromTerm(unit));
110
        }
111

    
112
        if (term.getRecommendedStatisticalMeasures() != null && !term.getRecommendedStatisticalMeasures().isEmpty()){
113
            result.recommendedStatisticalMeasures = new HashSet<>();
114
        }
115
        for (StatisticalMeasure unit: term.getRecommendedStatisticalMeasures()){
116
            result.recommendedStatisticalMeasures.add(TermDto.fromTerm(unit));
117
        }
118

    
119
        if (term.getSupportedCategoricalEnumerations() != null && !term.getSupportedCategoricalEnumerations().isEmpty()){
120
            result.supportedCategoricalEnumerations = new HashSet<>();
121
        }
122
        for (TermVocabulary<State> voc: term.getSupportedCategoricalEnumerations()){
123
            result.supportedCategoricalEnumerations.add(new TermVocabularyDto(voc.getUuid(), voc.getRepresentations(), voc.getTermType(), voc.getTitleCache(), voc.isAllowDuplicates(), voc.isOrderRelevant(), voc.isFlat()));
124
        }
125

    
126
        if (term.getRecommendedModifierEnumeration() != null && !term.getRecommendedModifierEnumeration().isEmpty()){
127
            result.recommendedModifierEnumeration = new HashSet<>();
128
        }
129
        for (TermVocabulary<DefinedTerm> voc: term.getRecommendedModifierEnumeration()){
130
            result.recommendedModifierEnumeration.add(new TermVocabularyDto(voc.getUuid(), voc.getRepresentations(), voc.getTermType(), voc.getTitleCache(), voc.isAllowDuplicates(), voc.isOrderRelevant(), voc.isFlat()));
131
        }
132
        return result;
133
    }
134

    
135
    /**
136
     * @return the isAvailableForTaxon
137
     */
138
    public boolean isAvailableForTaxon() {
139
        return isAvailableForTaxon;
140
    }
141

    
142
    /**
143
     * @param isAvailableForTaxon the isAvailableForTaxon to set
144
     */
145
    public void setAvailableForTaxon(boolean isAvailableForTaxon) {
146
        this.isAvailableForTaxon = isAvailableForTaxon;
147
    }
148

    
149
    /**
150
     * @return the isAvailableForTaxonName
151
     */
152
    public boolean isAvailableForTaxonName() {
153
        return isAvailableForTaxonName;
154
    }
155

    
156
    /**
157
     * @param isAvailableForTaxonName the isAvailableForTaxonName to set
158
     */
159
    public void setAvailableForTaxonName(boolean isAvailableForTaxonName) {
160
        this.isAvailableForTaxonName = isAvailableForTaxonName;
161
    }
162

    
163
    /**
164
     * @return the isAvailableForOccurrence
165
     */
166
    public boolean isAvailableForOccurrence() {
167
        return isAvailableForOccurrence;
168
    }
169

    
170
    /**
171
     * @param isAvailableForOccurrence the isAvailableForOccurrence to set
172
     */
173
    public void setAvailableForOccurrence(boolean isAvailableForOccurrence) {
174
        this.isAvailableForOccurrence = isAvailableForOccurrence;
175
    }
176

    
177
    /**
178
     * @return the isSupportsCategoricalData
179
     */
180
    public boolean isSupportsCategoricalData() {
181
        return isSupportsCategoricalData;
182
    }
183

    
184
    /**
185
     * @param isSupportsCategoricalData the isSupportsCategoricalData to set
186
     */
187
    public void setSupportsCategoricalData(boolean isSupportsCategoricalData) {
188
        this.isSupportsCategoricalData = isSupportsCategoricalData;
189
    }
190

    
191
    /**
192
     * @return the isSupportsQuantitativeData
193
     */
194
    public boolean isSupportsQuantitativeData() {
195
        return isSupportsQuantitativeData;
196
    }
197

    
198
    /**
199
     * @param isSupportsQuantitativeData the isSupportsQuantitativeData to set
200
     */
201
    public void setSupportsQuantitativeData(boolean isSupportsQuantitativeData) {
202
        this.isSupportsQuantitativeData = isSupportsQuantitativeData;
203
    }
204

    
205
    /**
206
     * @return the recommendedMeasurementUnits
207
     */
208
    public Set<TermDto> getRecommendedMeasurementUnits() {
209
        return recommendedMeasurementUnits;
210
    }
211

    
212
    /**
213
     * @param recommendedMeasurementUnits the recommendedMeasurementUnits to set
214
     */
215
    public void setRecommendedMeasurementUnits(Set<TermDto> recommendedMeasurementUnits) {
216
        this.recommendedMeasurementUnits = recommendedMeasurementUnits;
217
    }
218

    
219
    /**
220
     * @return the recommendedStatisticalMeasures
221
     */
222
    public Set<TermDto> getRecommendedStatisticalMeasures() {
223
        return recommendedStatisticalMeasures;
224
    }
225

    
226
    /**
227
     * @param recommendedStatisticalMeasures the recommendedStatisticalMeasures to set
228
     */
229
    public void setRecommendedStatisticalMeasures(Set<TermDto> recommendedStatisticalMeasures) {
230
        this.recommendedStatisticalMeasures = recommendedStatisticalMeasures;
231
    }
232

    
233
    /**
234
     * @return the supportedCategoricalEnumerations
235
     */
236
    public Set<TermVocabularyDto> getSupportedCategoricalEnumerations() {
237
        return supportedCategoricalEnumerations;
238
    }
239

    
240
    /**
241
     * @param supportedCategoricalEnumerations the supportedCategoricalEnumerations to set
242
     */
243
    public void setSupportedCategoricalEnumerations(Set<TermVocabularyDto> supportedCategoricalEnumerations) {
244
        this.supportedCategoricalEnumerations = supportedCategoricalEnumerations;
245
    }
246

    
247
    /**
248
     * @return the recommendedModifierEnumeration
249
     */
250
    public Set<TermVocabularyDto> getRecommendedModifierEnumeration() {
251
        return recommendedModifierEnumeration;
252
    }
253

    
254
    /**
255
     * @param recommendedModifierEnumeration the recommendedModifierEnumeration to set
256
     */
257
    public void setRecommendedModifierEnumeration(Set<TermVocabularyDto> recommendedModifierEnumeration) {
258
        this.recommendedModifierEnumeration = recommendedModifierEnumeration;
259
    }
260

    
261
    public static String getTermDtoSelect(){
262
        String[] result = createSqlParts("DefinedTermBase");
263

    
264
        return result[0]+result[1]+result[2];
265
    }
266

    
267
    private static String[] createSqlParts(String fromTable) {
268
        String sqlSelectString = ""
269
                + "select a.uuid, "
270
                + "r, "
271
                + "p.uuid, "
272
                + "k.uuid, "
273
                + "v.uuid, "
274
                + "a.orderIndex, "
275
                + "a.idInVocabulary, "
276
//                + "voc_rep,  "
277
                + "a.termType,  "
278
                + "a.uri,  "
279
                + "m,  "
280
                + "a.availableFor, "
281
                + "a.titleCache, "
282
                + "a.supportedDataTypes, "
283
                + "recommendedModifierEnumeration, "
284
                + "recommendedStatisticalMeasures, "
285
                + "supportedCategoricalEnumerations, "
286
                + "recommendedMeasurementUnits ";
287

    
288
        String sqlFromString =   " from "+fromTable+" as a ";
289

    
290
        String sqlJoinString =  "LEFT JOIN a.partOf as p "
291
                + "LEFT JOIN a.kindOf as k "
292
                + "LEFT JOIN a.media as m "
293
                + "LEFT JOIN a.representations AS r "
294
                + "LEFT JOIN a.vocabulary as v "
295
//                + "LEFT JOIN v.representations as voc_rep "
296
                + "LEFT JOIN a.recommendedModifierEnumeration as recommendedModifierEnumeration "
297
                + "LEFT JOIN a.recommendedStatisticalMeasures as recommendedStatisticalMeasures "
298
                + "LEFT JOIN a.supportedCategoricalEnumerations as supportedCategoricalEnumerations "
299
                + "LEFT JOIN a.recommendedMeasurementUnits as recommendedMeasurementUnits "
300
                ;
301

    
302
        String[] result = new String[3];
303
        result[0] = sqlSelectString;
304
        result[1] = sqlFromString;
305
        result[2] = sqlJoinString;
306
        return result;
307
    }
308

    
309

    
310
    public static List<TermDto> termDtoListFrom(List<Object[]> results) {
311
        List<TermDto> dtos = new ArrayList<>(); // list to ensure order
312
        // map to handle multiple representations/media/vocRepresentation because of LEFT JOIN
313
        Map<UUID, TermDto> dtoMap = new HashMap<>(results.size());
314
        for (Object[] elements : results) {
315
            UUID uuid = (UUID)elements[0];
316
            if(dtoMap.containsKey(uuid)){
317
                // multiple results for one term -> multiple (voc) representation/media
318
                if(elements[1]!=null){
319
                    dtoMap.get(uuid).addRepresentation((Representation)elements[1]);
320
                }
321
//                if(elements[7]!=null){
322
//                    dtoMap.get(uuid).addVocRepresentation((Representation)elements[7]);
323
//                }
324
                if(elements[9]!=null){
325
                    dtoMap.get(uuid).addMedia(((Media) elements[9]).getUuid());
326
                }
327
            } else {
328
                // term representation
329
                Set<Representation> representations = new HashSet<>();
330
                if(elements[1] instanceof Representation) {
331
                    representations = new HashSet<Representation>(1);
332
                    representations.add((Representation)elements[1]);
333
                }
334
                // term media
335
                Set<UUID> mediaUuids = new HashSet<>();
336
                if(elements[9] instanceof Media) {
337
                    mediaUuids.add(((Media) elements[9]).getUuid());
338
                }
339
                // voc representation
340
//                Set<Representation> vocRepresentations = new HashSet<>();
341
//                if(elements[7] instanceof Representation) {
342
//                    vocRepresentations = new HashSet<Representation>(7);
343
//                    vocRepresentations.add((Representation)elements[7]);
344
//                }
345
                boolean isAvailableForTaxon = false;
346
                boolean isAvailableForTaxonName = false;
347
                boolean isAvailableForOccurrence = false;
348

    
349
                EnumSet<CdmClass> availableForString = (EnumSet<CdmClass>)elements[10];
350

    
351
                if (availableForString.contains(CdmClass.TAXON)){
352
                    isAvailableForTaxon = true;
353
                }
354
                if (availableForString.contains(CdmClass.TAXON_NAME)){
355
                    isAvailableForTaxonName = true;
356
                }
357
                if (availableForString.contains(CdmClass.OCCURRENCE)){
358
                    isAvailableForOccurrence = true;
359
                }
360
                boolean isSupportsCategoricalData = false;
361
                boolean isSupportsQuantitativeData = false;
362

    
363
                EnumSet<CdmClass> supportsString = (EnumSet<CdmClass>)elements[12];
364

    
365
                if (supportsString.contains(CdmClass.CATEGORICAL_DATA)){
366
                    isSupportsCategoricalData = true;
367
                }
368
                if (supportsString.contains(CdmClass.QUANTITATIVE_DATA)){
369
                    isSupportsQuantitativeData = true;
370
                }
371

    
372
                Object o = elements[13];
373
                Set<TermVocabularyDto> recommendedModifierDtos = new HashSet<>();
374
                if (o instanceof TermVocabulary){
375
                    recommendedModifierDtos.add(TermVocabularyDto.fromVocabulary((TermVocabulary)o));
376
                }else if (o instanceof Set){
377
                    Set<TermVocabulary<DefinedTerm>> recommendedModifierEnumeration = (Set<TermVocabulary<DefinedTerm>>) o;
378
                    if (recommendedModifierEnumeration != null){
379
                        for (TermVocabulary<DefinedTerm> voc: recommendedModifierEnumeration){
380
                            recommendedModifierDtos.add(TermVocabularyDto.fromVocabulary(voc));
381
                        }
382
                    }
383
                }
384

    
385

    
386

    
387
                o = elements[14];
388
                Set<TermDto> recommendedStatisticalMeasuresDtos = new HashSet<>();
389
                if (o instanceof StatisticalMeasure){
390
                    recommendedStatisticalMeasuresDtos.add(TermDto.fromTerm((StatisticalMeasure)o));
391
                }else if (o instanceof Set){
392
                    Set<StatisticalMeasure> recommendedStatisticalMeasures = (Set<StatisticalMeasure>) o;
393
                    if (recommendedStatisticalMeasures != null) {
394
                        for (StatisticalMeasure term: recommendedStatisticalMeasures){
395
                            recommendedStatisticalMeasuresDtos.add(TermDto.fromTerm(term));
396
                        }
397
                    }
398
                }
399
                o =  elements[15];
400
                Set<TermVocabularyDto> supportedCategoricalDtos = new HashSet<>();
401
                if (o instanceof TermVocabulary){
402
                    supportedCategoricalDtos.add(TermVocabularyDto.fromVocabulary((TermVocabulary)o));
403
                }else if (o instanceof Set){
404
                    Set<TermVocabulary> supportedCategoricalEnumerations = (Set<TermVocabulary>)o;
405
                    for (TermVocabulary<State> voc: supportedCategoricalEnumerations){
406
                        supportedCategoricalDtos.add(TermVocabularyDto.fromVocabulary(voc));
407
                    }
408
                }
409

    
410
//                if (supportedCategoricalEnumerations != null){
411
//                    for (TermVocabulary<State> voc: supportedCategoricalEnumerations){
412
//                        supportedCategoricalDtos.add(TermVocabularyDto.fromVocabulary(voc));
413
//                    }
414
//                }
415
                o = elements[16];
416
                Set<TermDto> recommendedMeasurementUnitsDtos = new HashSet<>();
417
                if (o instanceof MeasurementUnit){
418
                    recommendedMeasurementUnitsDtos.add(TermDto.fromTerm((MeasurementUnit)o));
419
                }else if (o instanceof Set){
420
                    Set<MeasurementUnit> recommendedMeasurementUnits = (Set<MeasurementUnit>) elements[16];
421
                    for (MeasurementUnit term: recommendedMeasurementUnits){
422
                        recommendedMeasurementUnitsDtos.add(TermDto.fromTerm(term));
423
                    }
424
                }
425

    
426
//                if (recommendedMeasurementUnits != null){
427
//                    for (MeasurementUnit term: recommendedMeasurementUnits){
428
//                        recommendedMeasurementUnitsDtos.add(TermDto.fromTerm(term));
429
//                    }
430
//                }
431

    
432
                TermDto termDto = new FeatureDto(
433
                        uuid,
434
                        representations,
435
                        (UUID)elements[2],
436
                        (UUID)elements[3],
437
                        (UUID)elements[4],
438
                        (Integer)elements[5],
439
                        (String)elements[6],
440
//                        vocRepresentations,
441
                        isAvailableForTaxon,
442
                        isAvailableForTaxonName,
443
                        isAvailableForOccurrence,
444
                        (String)elements[11],
445
                        isSupportsCategoricalData,
446
                        isSupportsQuantitativeData,
447
                        supportedCategoricalDtos,
448
                        recommendedModifierDtos,
449
                        recommendedMeasurementUnitsDtos,
450
                        recommendedStatisticalMeasuresDtos)
451
                        ;
452
                termDto.setUri((URI)elements[8]);
453
                termDto.setMedia(mediaUuids);
454

    
455

    
456
                dtoMap.put(uuid, termDto);
457
                dtos.add(termDto);
458
            }
459
        }
460
        return dtos;
461
    }
462

    
463

    
464
}
(7-7/29)