Project

General

Profile

Download (19.9 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.Feature;
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.TermType;
30
import eu.etaxonomy.cdm.model.term.TermVocabulary;
31

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

    
38
    private static final long serialVersionUID = 5123011385890020838L;
39

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

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

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

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

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

    
70

    
71

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
262
        return result[0]+result[1]+result[2];
263
    }
264

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

    
286
        String sqlFromString =   " from "+fromTable+" as a ";
287

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

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

    
307

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

    
347
                EnumSet<CdmClass> availableForString = (EnumSet<CdmClass>)elements[10];
348

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

    
361
                EnumSet<CdmClass> supportsString = (EnumSet<CdmClass>)elements[12];
362

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

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

    
383

    
384

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

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

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

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

    
453

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

    
461

    
462
}
(7-7/29)