1 package eu
.etaxonomy
.cdm
.api
.service
;
3 import java
.util
.ArrayList
;
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
;
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
.TaxonNameBase
;
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
;
30 * @author s.buers Service to provide statistic data of the database elements
35 public class StatisticsServiceImpl
implements IStatisticsService
{
37 private static final Logger logger
= Logger
38 .getLogger(StatisticsServiceImpl
.class);
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.
47 // this constant can also be used by the ones that use the service
49 private static final IdentifiableEntity
<?
> ALL_DB
= null;
53 public IdentifiableEntity
<?
> getFilterALL_DB(){
57 private ArrayList
<Statistics
> statisticsList
;
60 private ITaxonDao taxonDao
;
63 private ITaxonNameDao taxonNameDao
;
66 private IClassificationDao classificationDao
;
69 private IReferenceDao referenceDao
;
72 private IStatisticsDao statisticsDao
;
75 private IDescriptionDao descriptionDao
;
78 * counts all the elements referenced in the configurator from the part of
79 * the database referenced in the configurator
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.)
88 public List
<Statistics
> getCountStatistics(
89 List
<StatisticsConfigurator
> configurators
) {
91 statisticsList
= new ArrayList
<Statistics
>();
93 for (StatisticsConfigurator statisticsConfigurator
: configurators
) {
94 // create a Statistics element for each configurator
95 countStatisticsPart(statisticsConfigurator
);
97 return this.statisticsList
;
101 private void countStatisticsPart(StatisticsConfigurator configurator
) {
102 // get last element of configurator.filter (the node that is the root
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
);
115 * @param configurator
117 private void countAll(StatisticsConfigurator configurator
) {
118 Statistics statistics
= new Statistics(configurator
);
120 for (StatisticsTypeEnum type
: configurator
.getType()) {
125 counter
= Long
.valueOf(taxonDao
.count(TaxonBase
.class));
128 counter
= Long
.valueOf(taxonDao
.count(Synonym
.class));
131 counter
= Long
.valueOf(taxonDao
.count(Taxon
.class));
135 .valueOf(referenceDao
136 .count(eu
.etaxonomy
.cdm
.model
.reference
.Reference
.class));
137 counter
-=statisticsDao
.countNomenclaturalReferences();
140 case NOMECLATURAL_REFERENCES
:
142 counter
= statisticsDao
.countNomenclaturalReferences();
146 counter
= Long
.valueOf(classificationDao
147 .count(Classification
.class));
152 counter
= Long
.valueOf(taxonNameDao
.count(TaxonNameBase
.class));
155 case DESCRIPTIVE_SOURCE_REFERENCES
:
157 counter
= statisticsDao
.countDescriptiveSourceReferences();
162 counter
= Long
.valueOf(descriptionDao
.count(DescriptionBase
.class));
167 statistics
.addCount(type
, counter
);
169 statisticsList
.add(statistics
);
173 private void countPart(StatisticsConfigurator configurator
,
174 IdentifiableEntity filter
) {
175 // TODO maybe remove redundant parameter filter
176 Statistics statistics
= new Statistics(configurator
);
180 if (filter
instanceof Classification
) {
182 for (StatisticsTypeEnum type
: configurator
.getType()) {
186 logger
.info("there should not be any classification "
187 + "nested in an other classification");
188 // so we set counter to 1, as a classification itself is one classification
189 counter
= new Long(1);
192 counter
= statisticsDao
.countTaxaInClassification(
193 Taxon
.class, (Classification
) filter
);
197 counter
= statisticsDao
.countTaxaInClassification(
198 TaxonBase
.class, (Classification
) filter
);
201 counter
= statisticsDao
.countTaxaInClassification(
202 Synonym
.class, (Classification
) filter
);
205 counter
= statisticsDao
206 .countTaxonNames((Classification
) filter
);
209 // counter = statisticsDao.countReferencesInClassification((Classification) filter);
210 counter
= statisticsDao
.countReferencesInClassificationWithUuids((Classification
) filter
);
211 counter
+=statisticsDao
212 .countDescriptive(true, (Classification
) filter
);
214 case DESCRIPTIVE_SOURCE_REFERENCES
:
215 counter
= statisticsDao
216 .countDescriptive(true, (Classification
) filter
);
219 counter
= statisticsDao
220 .countDescriptive(false, (Classification
) filter
);
222 case NOMECLATURAL_REFERENCES
:
223 counter
= statisticsDao
224 .countNomenclaturalReferences((Classification
) filter
);
229 statistics
.addCount(type
, counter
);
231 } else if(filter
instanceof Taxon
) {
232 //TODO get all taxa of the tree:
235 statisticsDao
.getTaxonTree(filter
);
238 // we just return null as count for the statistics
239 // element, if the filter is neither classification nor null.
242 statisticsList
.add(statistics
);