1
package org.hisp.dhis.aggregation.impl.dataelement;
4
* Copyright (c) 2004-2007, University of Oslo
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions are met:
9
* * Redistributions of source code must retain the above copyright notice, this
10
* list of conditions and the following disclaimer.
11
* * Redistributions in binary form must reproduce the above copyright notice,
12
* this list of conditions and the following disclaimer in the documentation
13
* and/or other materials provided with the distribution.
14
* * Neither the name of the HISP project nor the names of its contributors may
15
* be used to endorse or promote products derived from this software without
16
* specific prior written permission.
18
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
22
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
25
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
import java.util.Collection;
31
import java.util.Date;
33
import org.hisp.dhis.aggregation.AggregationService;
34
import org.hisp.dhis.dataelement.DataElement;
35
import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo;
36
import org.hisp.dhis.datavalue.DataValue;
37
import org.hisp.dhis.organisationunit.OrganisationUnit;
38
import org.hisp.dhis.organisationunit.OrganisationUnitHierarchy;
39
import org.hisp.dhis.period.Period;
41
import static org.hisp.dhis.system.util.MathUtils.getFloor;
42
import static org.hisp.dhis.system.util.MathUtils.getDays;
46
* @author Lars Helge Overland
47
* @version $Id: SumBoolDataElementAggregation.java 4753 2008-03-14 12:48:50Z larshelg $
49
public class SumBoolDataElementAggregation
50
extends AbstractDataElementAggregation
52
public double getAggregatedValue( DataElement dataElement, DataElementCategoryOptionCombo optionCombo, Date aggregationStartDate, Date aggregationEndDate,
53
OrganisationUnit organisationUnit )
55
Collection<OrganisationUnitHierarchy> hierarchies = aggregationCache.getOrganisationUnitHierarchies(
56
aggregationStartDate, aggregationEndDate );
58
double[] sums = getSumAndRelevantDays( dataElement.getId(), optionCombo.getId(), aggregationStartDate, aggregationEndDate,
59
hierarchies, organisationUnit.getId() );
63
return getFloor( sums[0] );
67
return AggregationService.NO_VALUES_REGISTERED;
71
protected Collection<DataValue> getDataValues( int dataElementId, int optionComboId, int organisationUnitId,
72
OrganisationUnitHierarchy hierarchy, Date startDate, Date endDate )
74
Collection<Integer> children = aggregationCache.getChildren( hierarchy, organisationUnitId );
76
Collection<Integer> periods = aggregationCache.getPeriodIds( startDate, endDate );
78
Collection<DataValue> values = aggregationStore.getDataValues( children, dataElementId, optionComboId, periods );
84
* Calculates the SUM for DataValues which period is within startDate and
85
* endDate. This method is typically used for DataValues. The number of true
86
* values is summarized and returned at index 0. The number of days within
87
* startDate and endDate is summarized and returned at index 1.
89
* @param dataValues The datavalues to aggregate
90
* @param startDate Start date of the period to aggregate over
91
* @param endDate End date of the period to aggregate over
92
* @param aggregationStartDate The original start date of the entire
94
* @param aggregationEndDate The original end date of the entire aggregation
96
* @return The SUMMARIZED value
98
protected double[] getAggregateOfValues( Collection<DataValue> dataValues, Date startDate, Date endDate,
99
Date aggregationStartDate, Date aggregationEndDate )
102
double totalRelevantDays = 0;
104
for ( DataValue dataValue : dataValues )
106
Period currentPeriod = aggregationCache.getPeriod( dataValue.getPeriod().getId() );
107
Date currentStartDate = currentPeriod.getStartDate();
108
Date currentEndDate = currentPeriod.getEndDate();
112
String stringValue = dataValue.getValue();
114
if ( stringValue != null && stringValue.toLowerCase().equals( TRUE ) )
119
double currentPeriodDuration = ( getDays( currentEndDate ) - getDays( currentStartDate ) );
121
if ( currentPeriodDuration > 0 )
123
long relevantDays = 0;
125
if ( currentStartDate.compareTo( startDate ) >= 0 && currentEndDate.compareTo( endDate ) <= 0 )
127
relevantDays = ( getDays( endDate ) - getDays( startDate ) );
130
else if ( currentStartDate.compareTo( startDate ) <= 0 && currentEndDate.compareTo( startDate ) >= 0
131
&& currentEndDate.compareTo( endDate ) <= 0 )
133
relevantDays = ( getDays( currentEndDate ) - getDays( startDate ) );
134
double factor = relevantDays / currentPeriodDuration;
135
totalSum += value * factor;
137
else if ( currentStartDate.compareTo( startDate ) >= 0 && currentStartDate.compareTo( endDate ) <= 0
138
&& currentEndDate.compareTo( endDate ) >= 0 )
140
relevantDays = ( getDays( endDate ) - getDays( currentStartDate ) );
141
double factor = relevantDays / currentPeriodDuration;
142
totalSum += value * factor;
144
else if ( currentStartDate.compareTo( startDate ) <= 0 && currentEndDate.compareTo( endDate ) >= 0 )
146
relevantDays = ( getDays( endDate ) - getDays( startDate ) );
147
double factor = relevantDays / currentPeriodDuration;
148
totalSum += value * factor;
151
totalRelevantDays += relevantDays;
155
double[] fraction = { totalSum, totalRelevantDays };