public String getBoundaryCondition( AnalyticsPeriodBoundary boundary, ProgramIndicator programIndicator, Date reportingStartDate, Date reportingEndDate ) { String column = boundary.isEventDateBoundary() ? AnalyticsPeriodBoundary.DB_EVENT_DATE : boundary.isEnrollmentDateBoundary() ? AnalyticsPeriodBoundary.DB_ENROLLMENT_DATE : boundary.isIncidentDateBoundary() ? AnalyticsPeriodBoundary.DB_INCIDENT_DATE : this.getBoundaryElementColumnSql( boundary, reportingStartDate, reportingEndDate, programIndicator ); final SimpleDateFormat format = new SimpleDateFormat(); format.applyPattern( Period.DEFAULT_DATE_FORMAT ); return column + " " + ( boundary.getAnalyticsPeriodBoundaryType().isEndBoundary() ? "<" : ">=" ) + " cast( '" + format.format( boundary.getBoundaryDate( reportingStartDate, reportingEndDate ) ) + "' as date )"; } }
/** * Determines wether there exists any analytics period boundaries that has type "Event in program stage". * @return true if any boundary exists with type "Event in program stage" */ public boolean hasEventDateCohortBoundary() { for ( AnalyticsPeriodBoundary boundary : analyticsPeriodBoundaries ) { if ( boundary.isEnrollmentHavingEventDateCohortBoundary() ) { return true; } } return false; }
@Override public int hashCode() { return 31 * Objects.hash( this.boundaryTarget, this.analyticsPeriodBoundaryType, this.offsetPeriodType, getOffsetPeriodsInt() ); }
/** * Returns the boundary for the earliest event date to include in the further evaluation. * @return The analytics period boundary that defines the event start date. Null if none is found. */ public AnalyticsPeriodBoundary getStartEventBoundary() { for ( AnalyticsPeriodBoundary boundary : analyticsPeriodBoundaries ) { if ( boundary.isEventDateBoundary() && boundary.getAnalyticsPeriodBoundaryType().isStartBoundary() ) { return boundary; } } return null; }
/** * Returns any analytics period boundaries that has type "Event in program stage", organized as a map * where the program stage is the key, and the list of boundaries for that program stage is the value. */ public Map<String, Set<AnalyticsPeriodBoundary>> getEventDateCohortBoundaryByProgramStage() { Map<String, Set<AnalyticsPeriodBoundary>> map = new HashMap<String, Set<AnalyticsPeriodBoundary>>(); for ( AnalyticsPeriodBoundary boundary : analyticsPeriodBoundaries ) { if ( boundary.isEnrollmentHavingEventDateCohortBoundary() ) { Matcher matcher = AnalyticsPeriodBoundary.COHORT_HAVING_PROGRAM_STAGE_PATTERN.matcher( boundary.getBoundaryTarget() ); Assert.isTrue( matcher.find(), "Can not parse program stage pattern for analyticsPeriodBoundary " + boundary.getUid() + " - boundaryTarget: " + boundary.getBoundaryTarget() ); String programStage = matcher.group( AnalyticsPeriodBoundary.PROGRAM_STAGE_REGEX_GROUP ); Assert.isTrue( programStage != null, "Can not find programStage for analyticsPeriodBoundary " + boundary.getUid() + " - boundaryTarget: " + boundary.getBoundaryTarget() ); if ( !map.containsKey( programStage ) ) { map.put( programStage, new HashSet<AnalyticsPeriodBoundary>() ); } map.get( programStage ).add( boundary ); } } return map; }
private String getBoundaryElementColumnSql( AnalyticsPeriodBoundary boundary, Date reportingStartDate, Date reportingEndDate, ProgramIndicator programIndicator ) { String columnSql = null; if ( boundary.isDataElementCohortBoundary() ) { Matcher matcher = AnalyticsPeriodBoundary.COHORT_HAVING_DATA_ELEMENT_PATTERN.matcher( boundary.getBoundaryTarget() ); Assert.isTrue( matcher.find(), "Can not parse data element pattern for analyticsPeriodBoundary " + boundary.getUid() + " - unknown boundaryTarget: " + boundary.getBoundaryTarget() ); String programStage = matcher.group( AnalyticsPeriodBoundary.PROGRAM_STAGE_REGEX_GROUP ); Assert.isTrue( programStage != null, "Can not find programStage for analyticsPeriodBoundary " + boundary.getUid() + " - boundaryTarget: " + boundary.getBoundaryTarget() ); String dataElement = matcher.group( AnalyticsPeriodBoundary.DATA_ELEMENT_REGEX_GROUP ); Assert.isTrue( dataElement != null, "Can not find data element for analyticsPeriodBoundary " + boundary.getUid() + " - boundaryTarget: " + boundary.getBoundaryTarget() ); columnSql = getCastToDate( getProgramIndicatorDataValueSelectSql( programStage, dataElement, reportingStartDate, reportingEndDate, programIndicator ) ); } else if ( boundary.isAttributeCohortBoundary() ) { Matcher matcher = AnalyticsPeriodBoundary.COHORT_HAVING_ATTRIBUTE_PATTERN.matcher( boundary.getBoundaryTarget() ); Assert.isTrue( matcher.find(), "Can not parse attribute pattern for analyticsPeriodBoundary " + boundary.getUid() + " - unknown boundaryTarget: " + boundary.getBoundaryTarget() ); String attribute = matcher.group( AnalyticsPeriodBoundary.ATTRIBUTE_REGEX_GROUP ); Assert.isTrue( attribute != null, "Can not find attribute for analyticsPeriodBoundary " + boundary.getUid() + " - boundaryTarget: " + boundary.getBoundaryTarget() ); columnSql = getCastToDate( this.columnQuote( attribute ) ); } Assert.isTrue( columnSql != null, "Can not determine boundary type for analyticsPeriodBoundary " + boundary.getUid() + " - boundaryTarget: " + boundary.getBoundaryTarget() ); return columnSql; }
private String getProgramIndicatorEventInProgramStageSql(ProgramIndicator programIndicator, Date reportingStartDate, Date reportingEndDate ) { Assert.isTrue( programIndicator.hasEventDateCohortBoundary(), "Can not get event date cohort boundaries for program indicator:" + programIndicator.getUid() ); Map<String, Set<AnalyticsPeriodBoundary>> map = programIndicator.getEventDateCohortBoundaryByProgramStage(); final SimpleDateFormat format = new SimpleDateFormat(); format.applyPattern( Period.DEFAULT_DATE_FORMAT ); String sql = ""; for ( String programStage : map.keySet() ) { Set<AnalyticsPeriodBoundary> boundaries = map.get( programStage ); String eventTableName = "analytics_event_" + programIndicator.getProgram().getUid(); sql += " (select count(*) from " + eventTableName + " where " + eventTableName + ".pi = " + ANALYTICS_TBL_ALIAS + ".pi and executiondate is not null "; for ( AnalyticsPeriodBoundary boundary : boundaries ) { sql += " and executiondate " + ( boundary.getAnalyticsPeriodBoundaryType().isStartBoundary() ? ">" : "<" ) + " cast( '" + format.format( boundary.getBoundaryDate( reportingStartDate, reportingEndDate ) ) + "' as date )"; } sql += ") > 0"; } return sql; }
public String getBoundaryCondition( ProgramIndicator programIndicator, Date reportingStartDate, Date reportingEndDate, SqlHelper sqlHelper ) { String sql = ""; for ( AnalyticsPeriodBoundary boundary : programIndicator.getAnalyticsPeriodBoundaries() ) { if ( boundary.isCohortDateBoundary() && !boundary.isEnrollmentHavingEventDateCohortBoundary() ) { sql += sqlHelper.whereAnd() + " " + getBoundaryCondition( boundary, programIndicator, reportingStartDate, reportingEndDate ); } } if ( programIndicator.hasEventDateCohortBoundary() ) { sql += sqlHelper.whereAnd() + " " + getProgramIndicatorEventInProgramStageSql( programIndicator, reportingStartDate, reportingEndDate ); } return sql; }
public Boolean isCohortDateBoundary() { return !isEventDateBoundary(); }
public static ProgramIndicator createProgramIndicator( char uniqueCharacter, AnalyticsType analyticsType, Program program, String expression, String filter ) { ProgramIndicator indicator = new ProgramIndicator(); indicator.setAutoFields(); indicator.setName( "Indicator" + uniqueCharacter ); indicator.setShortName( "IndicatorShort" + uniqueCharacter ); indicator.setCode( "IndicatorCode" + uniqueCharacter ); indicator.setDescription( "IndicatorDescription" + uniqueCharacter ); indicator.setProgram( program ); indicator.setExpression( expression ); indicator.setAnalyticsType( analyticsType ); indicator.setFilter( filter ); Set<AnalyticsPeriodBoundary> boundaries = new HashSet<AnalyticsPeriodBoundary>(); if ( analyticsType == AnalyticsType.EVENT ) { boundaries.add( new AnalyticsPeriodBoundary( AnalyticsPeriodBoundary.EVENT_DATE, AnalyticsPeriodBoundaryType.BEFORE_END_OF_REPORTING_PERIOD, null, 0 ) ); boundaries.add( new AnalyticsPeriodBoundary( AnalyticsPeriodBoundary.EVENT_DATE, AnalyticsPeriodBoundaryType.AFTER_START_OF_REPORTING_PERIOD, null, 0 ) ); } else if ( analyticsType == AnalyticsType.ENROLLMENT ) { boundaries.add( new AnalyticsPeriodBoundary( AnalyticsPeriodBoundary.ENROLLMENT_DATE, AnalyticsPeriodBoundaryType.BEFORE_END_OF_REPORTING_PERIOD, null, 0 ) ); boundaries.add( new AnalyticsPeriodBoundary( AnalyticsPeriodBoundary.ENROLLMENT_DATE, AnalyticsPeriodBoundaryType.AFTER_START_OF_REPORTING_PERIOD, null, 0 ) ); } for ( AnalyticsPeriodBoundary boundary : boundaries ) { boundary.setAutoFields(); } indicator.setAnalyticsPeriodBoundaries( boundaries ); return indicator; }
/** * Returns the boundary for the latest event date to include in the further evaluation. * @return The analytics period boundary that defines the event end date. Null if none is found. */ public AnalyticsPeriodBoundary getEndEventBoundary() { for ( AnalyticsPeriodBoundary boundary : analyticsPeriodBoundaries ) { if ( boundary.isEventDateBoundary() && boundary.getAnalyticsPeriodBoundaryType().isEndBoundary() ) { return boundary; } } return null; }
@Override public boolean equals( Object obj ) { if ( this == obj ) { return true; } if ( obj == null || getClass() != obj.getClass() ) { return false; } final AnalyticsPeriodBoundary other = (AnalyticsPeriodBoundary) obj; return Objects.equals( this.boundaryTarget, other.boundaryTarget ) && Objects.equals( this.analyticsPeriodBoundaryType, other.analyticsPeriodBoundaryType ) && Objects.equals( this.offsetPeriodType, other.offsetPeriodType ) && Objects.equals( this.getOffsetPeriodsInt(), other.getOffsetPeriodsInt() ); }
public Date getBoundaryDate( Date reportingStartDate, Date reportingEndDate ) { Date returnDate = null; if ( analyticsPeriodBoundaryType.isEndBoundary() ) { DateTime reportingEndDateTime = new DateTime(reportingEndDate); returnDate = reportingEndDateTime.plusDays(1).toDate(); } else { returnDate = new Date( reportingStartDate.getTime() ); } if ( offsetPeriods != null && offsetPeriodType != null ) { returnDate = this.offsetPeriodType.getDateWithOffset( returnDate, getOffsetPeriodsInt() ); } return returnDate; }