@Override public DataQueryParams withTableNameAndPartitions( DataQueryParams params, QueryPlannerParams plannerParams ) { Partitions partitions = params.hasStartEndDate() ? PartitionUtils.getPartitions( params.getStartDate(), params.getEndDate() ) : PartitionUtils.getPartitions( params.getAllPeriods() ); return DataQueryParams.newBuilder( params ) .withTableName( plannerParams.getTableName() ) .withPartitions( partitions ) .build(); }
protected DataQueryParams instance() { return copyTo( new DataQueryParams() ); }
/** * Sets the given list of data dimension options. Replaces existing options * of the given data dimension type. * * @param itemType the data dimension type, or all types if null. * @param options the data dimension options. */ private void setDataDimensionOptions( @Nullable DataDimensionItemType itemType, List<? extends DimensionalItemObject> options ) { List<DimensionalItemObject> existing = getDimensionOptions( DATA_X_DIM_ID ); if ( itemType != null ) { existing = AnalyticsUtils.getByDataDimensionItemType( itemType, existing ); } DimensionalObject dimension = getDimension( DATA_X_DIM_ID ); if ( dimension == null ) { dimension = new BaseDimensionalObject( DATA_X_DIM_ID, DimensionType.DATA_X, null, DISPLAY_NAME_DATA_X, options ); addDimension( dimension ); } else { dimension.getItems().removeAll( existing ); dimension.getItems().addAll( options ); } }
/** * Makes assertions on the query. * * @param params the data query parameters. */ private void assertQuery( DataQueryParams params ) { Assert.notNull( params.getDataType(), "Data type must be present" ); Assert.notNull( params.getAggregationType(), "Aggregation type must be present" ); Assert.isTrue( !( params.getAggregationType().isLastPeriodAggregationType() && params.getPeriods().size() > 1 ), "Max one dimension period can be present per query for last period aggregation" ); } }
final List<DimensionalItemObject> dataElements = Lists.newArrayList( params.getDataElements() ); params.getProgramDataElements().forEach( pde -> dataElements.add( ((ProgramDataElementDimensionItem) pde).getDataElement() ) ); final List<DataElement> nonAggDataElements = FilterUtils.inverseFilter( asTypedList( dataElements ), AggregatableDataElementFilter.INSTANCE ); if ( params.getDimensions().isEmpty() ) if ( !params.isSkipData() && params.getDataDimensionAndFilterOptions().isEmpty() && params.getAllDataElementGroups().isEmpty() ) if ( !params.getDimensionsAsFilters().isEmpty() ) violation = "Dimensions cannot be specified as dimension and filter simultaneously: " + params.getDimensionsAsFilters(); if ( !params.hasPeriods() && !params.isSkipPartitioning() && !params.hasStartEndDate() ) if ( params.hasPeriods() && params.hasStartEndDate() ) if ( params.hasStartEndDate() && params.startDateAfterEndDate() ) if ( params.hasStartEndDate() && !params.getReportingRates().isEmpty() ) if ( !params.getFilterIndicators().isEmpty() && params.getFilterOptions( DATA_X_DIM_ID ).size() > 1 ) if ( !params.getFilterReportingRates().isEmpty() && params.getFilterOptions( DATA_X_DIM_ID ).size() > 1 ) if ( params.getFilters().contains( new BaseDimensionalObject( CATEGORYOPTIONCOMBO_DIM_ID ) ) ) if ( !params.getDuplicateDimensions().isEmpty() ) violation = "Dimensions cannot be specified more than once: " + params.getDuplicateDimensions();
for ( DimensionalObject dim : params.getDimensions() ) ListMap<String, DimensionalObject> filterMap = params.getDimensionFilterMap(); if ( params.isDataApproval() ) for ( OrganisationUnit unit : params.getDataApprovalLevels().keySet() ) Integer level = params.getDataApprovalLevels().get( unit ); if ( params.isRestrictByOrgUnitOpeningClosedDate() && params.hasStartEndDateRestriction() ) "(" + quoteAlias( "ouopeningdate" ) + " <= '" + getMediumDateString( params.getStartDateRestriction() ) + "' or " + quoteAlias( "ouopeningdate" ) + " is null) and " + "(" + quoteAlias( "oucloseddate" ) + " >= '" + getMediumDateString( params.getEndDateRestriction() ) + "' or " + quoteAlias( "oucloseddate" ) + " is null)) "; if ( params.isRestrictByCategoryOptionStartEndDate() && params.hasStartEndDateRestriction() ) "(" + quoteAlias( "costartdate" ) + " <= '" + getMediumDateString( params.getStartDateRestriction() ) + "' or " + quoteAlias( "costartdate" ) + " is null) and " + "(" + quoteAlias( "coenddate" ) + " >= '" + getMediumDateString( params.getEndDateRestriction() ) + "' or " + quoteAlias( "coenddate" ) + " is null)) "; if ( tableType.hasPeriodDimension() && params.hasStartEndDate() ) quoteAlias( "pestartdate" ) + " >= '" + getMediumDateString( params.getStartDate() ) + "' and " + quoteAlias( "peenddate" ) + " <= '" + getMediumDateString( params.getEndDate() ) + "' "; if ( params.isTimely() ) if ( !params.isSkipPartitioning() && params.hasPartitions() )
if ( !params.getReportingRates().isEmpty() && !params.isSkipData() ) if ( !COMPLETENESS_DIMENSION_TYPES.containsAll( params.getDimensionTypes() ) ) DataQueryParams targetParams = DataQueryParams.newBuilder( params ) .withSkipPartitioning( true ) .withTimely( false ) Integer periodIndex = params.getPeriodDimensionIndex(); Integer dataSetIndex = DataQueryParams.DX_INDEX; Map<String, PeriodType> dsPtMap = params.getDataSetPeriodTypeMap(); PeriodType filterPeriodType = params.getFilterPeriodType(); .addValue( params.isSkipRounding() ? value : MathUtils.getRounded( value ) ); if ( params.isIncludeNumDen() )
params.getDataPeriodAggregationPeriodMap(); if ( params.isDisaggregation() && params.hasDataPeriodType() ) params = DataQueryParams.newBuilder( params ) .withDataPeriodsForAggregationPeriods( dataPeriodAggregationPeriodMap ) .build(); if ( params.hasMeasureCriteria() && params.isDataType( DataType.NUMERIC ) )
if ( !params.getDataElements().isEmpty() ) DataQueryParams query = DataQueryParams.newBuilder( params ) .withDataElements( aggregationTypeDataElementMap.get( aggregationType ) ) .withAggregationType( aggregationType ).build(); else if ( !params.getDataElementGroupSets().isEmpty() ) DataElementGroup deg = params.getFirstDataElementGroup(); AnalyticsAggregationType aggregationType = ObjectUtils.firstNonNull( params.getAggregationType(), AnalyticsAggregationType.SUM ); PeriodType periodType = PeriodType.getPeriodTypeByName( params.getPeriodType() ); AnalyticsAggregationType degAggType = AnalyticsAggregationType.fromAggregationType( deg.getAggregationType() ); aggregationType = ObjectUtils.firstNonNull( params.getAggregationType(), degAggType, AnalyticsAggregationType.SUM ); aggregationType = QueryPlannerUtils.getAggregationType( aggregationType, deg.getValueType(), periodType, deg.getPeriodType() ); DataQueryParams query = DataQueryParams.newBuilder( params ) .withAggregationType( aggregationType ).build(); DataQueryParams query = DataQueryParams.newBuilder( params ) .withAggregationType( ObjectUtils.firstNonNull( params.getAggregationType(), AnalyticsAggregationType.SUM ) ).build();
if ( !params.getIndicators().isEmpty() && !params.isSkipData() ) DataQueryParams dataSourceParams = DataQueryParams.newBuilder( params ) .retainDataDimension( DataDimensionItemType.INDICATOR ) .withIncludeNumDen( false ).build(); List<Indicator> indicators = asTypedList( dataSourceParams.getIndicators() ); Period filterPeriod = dataSourceParams.getFilterPeriod(); List<List<DimensionItem>> dimensionItemPermutations = dataSourceParams.getDimensionItemPermutations(); .addValue( AnalyticsUtils.getRoundedValue( dataSourceParams, indicator.getDecimals(), value.getValue() ) ); if ( params.isIncludeNumDen() )
@Override public DataQueryParams withDimensionConstraints( DataQueryParams params ) { DataQueryParams.Builder builder = DataQueryParams.newBuilder( params ); applyOrganisationUnitConstraint( builder, params ); applyUserConstraints( builder, params ); return builder.build(); }
if ( params.isDisaggregation() && !params.getDataElements().isEmpty() ) QueryPlannerUtils.getPeriodTypeDataElementMap( params.getDataElements() ); DataQueryParams query = DataQueryParams.newBuilder( params ) .withDataElements( periodTypeDataElementMap.get( periodType ) ) .withDataPeriodType( periodType ).build(); else if ( params.isDisaggregation() && !params.getDataElementGroupSets().isEmpty() ) DataElementGroup deg = params.getFirstDataElementGroup(); PeriodType periodType = deg != null ? deg.getPeriodType() : null; queries.add( DataQueryParams.newBuilder( params ) .withDataPeriodType( periodType ).build() ); queries.add( DataQueryParams.newBuilder( params ).build() );
if ( params.isSkipPartitioning() ) else if ( !params.getPeriods().isEmpty() ) ListMap<String, DimensionalItemObject> periodTypePeriodMap = PartitionUtils.getPeriodTypePeriodMap( params.getPeriods() ); DataQueryParams query = DataQueryParams.newBuilder( params ) .addOrSetDimensionOptions( PERIOD_DIM_ID, DimensionType.PERIOD, periodType.toLowerCase(), periodTypePeriodMap.get( periodType ) ) .withPeriodType( periodType ).build(); else if ( !params.getFilterPeriods().isEmpty() ) DimensionalObject filter = params.getFilter( PERIOD_DIM_ID ); DataQueryParams.Builder query = DataQueryParams.newBuilder( params ) .removeFilter( PERIOD_DIM_ID ) queries.add( DataQueryParams.newBuilder( params ).build() ); return queries;
dataQueryParams.copyTo( params ); for ( DimensionalItemObject object : dataQueryParams.getProgramDataElements() ) for ( DimensionalItemObject object : dataQueryParams.getProgramAttributes() ) for ( DimensionalItemObject object : dataQueryParams.getFilterProgramDataElements() ) for ( DimensionalItemObject object : dataQueryParams.getFilterProgramAttributes() ) for ( DimensionalItemObject object : dataQueryParams.getProgramIndicators() )
/** * Performs pre-handling of the given query and returns the immutable, * handled query. If the query has a single indicator as item for the data * filter, the filter is set as a dimension and removed as a filter. * * @param params the {@link DataQueryParams}. * @return a {@link DataQueryParams}. */ private DataQueryParams preHandleQuery( DataQueryParams params ) { if ( params.hasSingleIndicatorAsDataFilter() || params.hasSingleReportingRateAsDataFilter() ) { DimensionalObject dx = params.getFilter( DATA_X_DIM_ID ); params = DataQueryParams.newBuilder( params ) .addDimension( dx ) .removeFilter( DATA_X_DIM_ID ) .addProcessingHint( ProcessingHint.SINGLE_INDICATOR_REPORTING_RATE_FILTER_ITEM ).build(); } return params; }
/** * Adds program data element values to the given grid based on the given data * query parameters. * * @param params the {@link DataQueryParams}. * @param grid the grid. */ private void addProgramDataElementAttributeIndicatorValues( DataQueryParams params, Grid grid ) { if ( ( !params.getAllProgramDataElementsAndAttributes().isEmpty() || !params.getProgramIndicators().isEmpty() ) && !params.isSkipData() ) { DataQueryParams dataSourceParams = DataQueryParams.newBuilder( params ) .retainDataDimensions( PROGRAM_DATA_ELEMENT, PROGRAM_ATTRIBUTE, PROGRAM_INDICATOR ).build(); EventQueryParams eventQueryParams = new EventQueryParams.Builder( EventQueryParams.fromDataQueryParams( dataSourceParams ) ) .withSkipMeta( true ).build(); Grid eventGrid = eventAnalyticsService.getAggregatedEventData( eventQueryParams ); grid.addRows( eventGrid ); } }
/** * Adds data element values to the given grid based on the given data query * parameters. * * @param params the {@link DataQueryParams}. * @param grid the grid. */ private void addDataElementValues( DataQueryParams params, Grid grid ) { if ( !params.getAllDataElements().isEmpty() && !params.isSkipData() ) { DataQueryParams dataSourceParams = DataQueryParams.newBuilder( params ) .retainDataDimension( DataDimensionItemType.DATA_ELEMENT ) .withIncludeNumDen( false ).build(); Map<String, Object> aggregatedDataMap = getAggregatedDataValueMapObjectTyped( dataSourceParams ); for ( Map.Entry<String, Object> entry : aggregatedDataMap.entrySet() ) { Object value = AnalyticsUtils.getRoundedValueObject( params, entry.getValue() ); grid.addRow() .addValues( entry.getKey().split( DIMENSION_SEP ) ) .addValue( value ); if ( params.isIncludeNumDen() ) { grid.addNullValues( 5 ); } } } }
AnalyticsAggregationType type = params.getAggregationType(); DataType.NUMERIC == type.getDataType(); if ( params.getPeriods().isEmpty() || !sumAvgNumeric ) queries.add( DataQueryParams.newBuilder( params ).build() ); return queries; QueryPlannerUtils.getDaysPeriodMap( params.getPeriods() ); DimensionalObject periodDim = params.getDimension( PERIOD_DIM_ID ); DataQueryParams query = DataQueryParams.newBuilder( params ) .addOrSetDimensionOptions( periodDim.getDimension(), periodDim.getDimensionType(), periodDim.getDimensionName(), daysPeriodMap.get( days ) ).build();
if ( !params.getPeriods().isEmpty() ) for ( DimensionalItemObject item : params.getPeriods() ) DataQueryParams query = DataQueryParams.newBuilder( params ) .withStartDateRestriction( period.getStartDate() ) .withEndDateRestriction( period.getEndDate() ).build(); BaseDimensionalObject staticPeriod = (BaseDimensionalObject) query.getDimension( PERIOD_DIM_ID ); staticPeriod.setDimensionName( period.getIsoDate() ); staticPeriod.setFixed( true ); else if ( !params.getFilterPeriods().isEmpty() ) Period period = (Period) params.getFilterPeriods().get( 0 ); DataQueryParams query = DataQueryParams.newBuilder( params ) .withStartDateRestriction( period.getStartDate() ) .withEndDateRestriction( period.getEndDate() )
if ( !params.getOrganisationUnits().isEmpty() ) QueryPlannerUtils.getLevelOrgUnitMap( params.getOrganisationUnits() ); DataQueryParams query = DataQueryParams.newBuilder( params ) .addOrSetDimensionOptions( ORGUNIT_DIM_ID, DimensionType.ORGANISATION_UNIT, LEVEL_PREFIX + level, levelOrgUnitMap.get( level ) ).build(); else if ( !params.getFilterOrganisationUnits().isEmpty() ) QueryPlannerUtils.getLevelOrgUnitMap( params.getFilterOrganisationUnits() ); DimensionalObject filter = params.getFilter( ORGUNIT_DIM_ID ); DataQueryParams.Builder query = DataQueryParams.newBuilder( params ) .removeFilter( ORGUNIT_DIM_ID ); queries.add( DataQueryParams.newBuilder( params ).build() ); return queries;