Project

General

Profile

Download (6.83 KB) Statistics
| Branch: | Tag: | Revision:
1
package eu.etaxonomy.cdm.api.service;
2

    
3
import java.util.ArrayList;
4
import java.util.List;
5

    
6
import org.apache.log4j.Logger;
7
import org.springframework.beans.factory.annotation.Autowired;
8
import org.springframework.stereotype.Service;
9
import org.springframework.transaction.annotation.Transactional;
10

    
11
import eu.etaxonomy.cdm.api.service.statistics.Statistics;
12
import eu.etaxonomy.cdm.api.service.statistics.StatisticsConfigurator;
13
import eu.etaxonomy.cdm.api.service.statistics.StatisticsTypeEnum;
14
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
15
import eu.etaxonomy.cdm.model.description.DescriptionBase;
16
import eu.etaxonomy.cdm.model.name.TaxonName;
17
import eu.etaxonomy.cdm.model.taxon.Classification;
18
import eu.etaxonomy.cdm.model.taxon.Synonym;
19
import eu.etaxonomy.cdm.model.taxon.Taxon;
20
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
21
import eu.etaxonomy.cdm.persistence.dao.description.IDescriptionDao;
22
import eu.etaxonomy.cdm.persistence.dao.name.ITaxonNameDao;
23
import eu.etaxonomy.cdm.persistence.dao.reference.IReferenceDao;
24
import eu.etaxonomy.cdm.persistence.dao.statistics.IStatisticsDao;
25
import eu.etaxonomy.cdm.persistence.dao.taxon.IClassificationDao;
26
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;
27

    
28
/**
29
 *
30
 * @author s.buers Service to provide statistic data of the database elements
31
 */
32

    
33
@Service
34
@Transactional
35
public class StatisticsServiceImpl implements IStatisticsService {
36

    
37
	private static final Logger logger = Logger
38
			.getLogger(StatisticsServiceImpl.class);
39

    
40

    
41

    
42
	// this does not make sense, we just count nothing if no type is given.
43
	// the one who calls this service should check that there are types given!
44
//	private static final StatisticsTypeEnum DEFAULT_TYPE=StatisticsTypeEnum.ALL_TAXA;
45
	//TODO create a list with all types.
46

    
47
	// this constant can also be used by the ones that use the service
48

    
49
	private static final IdentifiableEntity<?> ALL_DB = null;
50

    
51
	@Override
52
	@Transactional
53
	public IdentifiableEntity<?> getFilterALL_DB(){
54
		return ALL_DB;
55
	}
56

    
57
	private ArrayList<Statistics> statisticsList;
58

    
59
	@Autowired
60
	private ITaxonDao taxonDao;
61

    
62
	@Autowired
63
	private ITaxonNameDao taxonNameDao;
64

    
65
	@Autowired
66
	private IClassificationDao classificationDao;
67

    
68
	@Autowired
69
	private IReferenceDao referenceDao;
70

    
71
	@Autowired
72
	private IStatisticsDao statisticsDao;
73

    
74
	@Autowired
75
	private IDescriptionDao descriptionDao;
76

    
77
	/**
78
	 * counts all the elements referenced in the configurator from the part of
79
	 * the database referenced in the configurator
80
	 *
81
	 * @param configurators
82
	 * @return be aware that a Statistics.countMap might contain "null"
83
	 *         {@link Number} values, if the count failed (, if the value is "0"
84
	 *         the count succeeded in counting zero elements.)
85
	 */
86
	@Override
87
	@Transactional
88
	public List<Statistics> getCountStatistics(
89
			List<StatisticsConfigurator> configurators) {
90

    
91
		statisticsList = new ArrayList<>();
92

    
93
		for (StatisticsConfigurator statisticsConfigurator : configurators) {
94
			// create a Statistics element for each configurator
95
			countStatisticsPart(statisticsConfigurator);
96
		}
97
		return this.statisticsList;
98
	}
99

    
100
	@Transactional
101
	private void countStatisticsPart(StatisticsConfigurator configurator) {
102
		// get last element of configurator.filter (the node that is the root
103
		// for the count):
104
		IdentifiableEntity<?> filter = configurator.getFilter().get(
105
				(configurator.getFilter().size()) - 1);
106
		if (filter == getFilterALL_DB()) {
107
			countAll(configurator);
108
		} else { // check for classtype classification
109
			countPart(configurator, filter);
110
		}
111

    
112
	}
113

    
114
	private void countAll(StatisticsConfigurator configurator) {
115
		Statistics statistics = new Statistics(configurator);
116

    
117
		for (StatisticsTypeEnum type : configurator.getType()) {
118
			Long counter = null;
119
			switch (type) {
120

    
121
			case ALL_TAXA:
122
				counter = taxonDao.count(TaxonBase.class);
123
				break;
124
			case SYNONYMS:
125
				counter = taxonDao.count(Synonym.class);
126
				break;
127
			case ACCEPTED_TAXA:
128
				counter = taxonDao.count(Taxon.class);
129
				break;
130
			case ALL_REFERENCES:
131
				counter = referenceDao.count(eu.etaxonomy.cdm.model.reference.Reference.class);
132
				counter -=statisticsDao.countNomenclaturalReferences();
133
				break;
134

    
135
			case NOMENCLATURAL_REFERENCES:
136

    
137
				counter = statisticsDao.countNomenclaturalReferences();
138
				break;
139

    
140
			case CLASSIFICATION:
141
				counter = classificationDao.count(Classification.class);
142

    
143
				break;
144

    
145
			case TAXON_NAMES:
146
				counter = taxonNameDao.count(TaxonName.class);
147
				break;
148

    
149
			case DESCRIPTIVE_SOURCE_REFERENCES:
150

    
151
				counter = statisticsDao.countDescriptiveSourceReferences();
152

    
153
				break;
154
			case DESCRIPTIONS:
155

    
156
				counter = descriptionDao.count(DescriptionBase.class);
157

    
158
				break;
159
			}
160

    
161
			statistics.addCount(type, counter);
162
		}
163
		statisticsList.add(statistics);
164
	}
165

    
166
	@Transactional
167
	private void countPart(StatisticsConfigurator configurator,
168
			IdentifiableEntity filter) {
169
		// TODO maybe remove redundant parameter filter
170
		Statistics statistics = new Statistics(configurator);
171

    
172
		Long counter = null;
173

    
174
		if (filter instanceof Classification) {
175

    
176
			for (StatisticsTypeEnum type : configurator.getType()) {
177

    
178
				switch (type) {
179
				case CLASSIFICATION:
180
					logger.info("there should not be any classification "
181
							+ "nested in an other classification");
182
					// so we set counter to 1, as a classification itself is one classification
183
					counter = new Long(1);
184
					break;
185
				case ACCEPTED_TAXA:
186
					counter = statisticsDao.countTaxaInClassification(
187
							Taxon.class, (Classification) filter);
188
					break;
189

    
190
				case ALL_TAXA:
191
					counter = statisticsDao.countTaxaInClassification(
192
							TaxonBase.class, (Classification) filter);
193
					break;
194
				case SYNONYMS:
195
					counter = statisticsDao.countTaxaInClassification(
196
							Synonym.class, (Classification) filter);
197
					break;
198
				case TAXON_NAMES:
199
					counter = statisticsDao
200
							.countTaxonNames((Classification) filter);
201
					break;
202
				case ALL_REFERENCES:
203
//					counter = statisticsDao.countReferencesInClassification((Classification) filter);
204
					counter = statisticsDao.countReferencesInClassificationWithUuids((Classification) filter);
205
					counter+=statisticsDao
206
							.countDescriptive(true, (Classification) filter);
207
					break;
208
				case DESCRIPTIVE_SOURCE_REFERENCES:
209
					counter = statisticsDao
210
							.countDescriptive(true, (Classification) filter);
211
					break;
212
				case DESCRIPTIONS:
213
					counter = statisticsDao
214
							.countDescriptive(false, (Classification) filter);
215
					break;
216
				case NOMENCLATURAL_REFERENCES:
217
					counter = statisticsDao
218
							.countNomenclaturalReferences((Classification) filter);
219
					break;
220

    
221
				}
222

    
223
				statistics.addCount(type, counter);
224
			}
225
		} else if(filter instanceof Taxon) {
226
			//TODO get all taxa of the tree:
227
			do{
228
				filter.getUuid();
229
				statisticsDao.getTaxonTree(filter);
230
			}while(true);
231
		}else {
232
			// we just return null as count for the statistics
233
			// element, if the filter is neither classification nor null.
234
		}
235

    
236
		statisticsList.add(statistics);
237
	}
238
}
(85-85/97)