use of org.hisp.dhis.common.DimensionalItemObject in project dhis2-core by dhis2.
the class FavoriteDataItemUpgrader method upgradeFavorites.
private void upgradeFavorites(Class<? extends BaseAnalyticalObject> favoriteClass, String favoriteTablename, Class<? extends IdentifiableObject> objectClass, String objectTablename) {
String linkTablename = favoriteTablename + "_" + objectTablename + "s";
String selectSql = "select " + favoriteTablename + "id, " + objectTablename + "id from " + linkTablename + " " + "order by " + favoriteTablename + "id, sort_order";
SqlRowSet rs = jdbcTemplate.queryForRowSet(selectSql);
while (rs.next()) {
int rtId = rs.getInt(1);
int obId = rs.getInt(2);
BaseAnalyticalObject favorite = idObjectManager.get(favoriteClass, rtId);
DimensionalItemObject object = (DimensionalItemObject) idObjectManager.get(objectClass, obId);
DataDimensionItem item = DataDimensionItem.create(object);
favorite.getDataDimensionItems().add(item);
idObjectManager.update(favorite);
log.debug("Upgraded " + favoriteTablename + " " + favorite.getUid() + " for " + objectTablename + " " + object.getUid());
}
String dropSql = "drop table " + linkTablename;
jdbcTemplate.update(dropSql);
log.info("Update done, dropped table " + linkTablename);
}
use of org.hisp.dhis.common.DimensionalItemObject in project dhis2-core by dhis2.
the class DefaultAnalyticsService method addDataElementOperandValues.
/**
* Adds data element operand values to the given grid.
*
* @param params the {@link DataQueryParams}.
* @param grid the grid.
* @param totalType the operand {@link DataElementOperand.TotalType}.
*/
private void addDataElementOperandValues(DataQueryParams params, Grid grid, DataElementOperand.TotalType totalType) {
List<DataElementOperand> operands = asTypedList(params.getDataElementOperands());
operands = operands.stream().filter(o -> totalType.equals(o.getTotalType())).collect(Collectors.toList());
if (operands.isEmpty()) {
return;
}
List<DimensionalItemObject> dataElements = Lists.newArrayList(DimensionalObjectUtils.getDataElements(operands));
List<DimensionalItemObject> categoryOptionCombos = Lists.newArrayList(DimensionalObjectUtils.getCategoryOptionCombos(operands));
List<DimensionalItemObject> attributeOptionCobos = Lists.newArrayList(DimensionalObjectUtils.getAttributeOptionCombos(operands));
//TODO check if data was dim or filter
DataQueryParams.Builder builder = DataQueryParams.newBuilder(params).removeDimension(DATA_X_DIM_ID).addDimension(new BaseDimensionalObject(DATA_X_DIM_ID, DimensionType.DATA_X, dataElements));
if (totalType.isCategoryOptionCombo()) {
builder.addDimension(new BaseDimensionalObject(CATEGORYOPTIONCOMBO_DIM_ID, DimensionType.CATEGORY_OPTION_COMBO, categoryOptionCombos));
}
if (totalType.isAttributeOptionCombo()) {
builder.addDimension(new BaseDimensionalObject(ATTRIBUTEOPTIONCOMBO_DIM_ID, DimensionType.ATTRIBUTE_OPTION_COMBO, attributeOptionCobos));
}
DataQueryParams operandParams = builder.build();
Map<String, Object> aggregatedDataMap = getAggregatedDataValueMapObjectTyped(operandParams);
aggregatedDataMap = AnalyticsUtils.convertDxToOperand(aggregatedDataMap, totalType);
for (Map.Entry<String, Object> entry : aggregatedDataMap.entrySet()) {
Object value = AnalyticsUtils.getRoundedValueObject(operandParams, entry.getValue());
grid.addRow().addValues(entry.getKey().split(DIMENSION_SEP)).addValue(value);
if (params.isIncludeNumDen()) {
grid.addNullValues(3);
}
}
}
use of org.hisp.dhis.common.DimensionalItemObject in project dhis2-core by dhis2.
the class JdbcRawAnalyticsManager method getStatement.
private String getStatement(DataQueryParams params, String partition) {
List<String> dimensionColumns = params.getDimensions().stream().map(d -> statementBuilder.columnQuote(d.getDimensionName())).collect(Collectors.toList());
setOrgUnitSelect(params, dimensionColumns);
SqlHelper sqlHelper = new SqlHelper();
String sql = "select " + StringUtils.join(dimensionColumns, ", ") + ", " + DIM_NAME_OU + ", value " + "from " + partition + " ax " + "inner join organisationunit ou on ax.ou = ou.uid " + "inner join _periodstructure ps on ax.pe = ps.iso ";
for (DimensionalObject dim : params.getDimensions()) {
if (!dim.getItems().isEmpty() && !dim.isFixed()) {
String col = statementBuilder.columnQuote(dim.getDimensionName());
if (DimensionalObject.ORGUNIT_DIM_ID.equals(dim.getDimension())) {
sql += sqlHelper.whereAnd() + " (";
for (DimensionalItemObject item : dim.getItems()) {
OrganisationUnit unit = (OrganisationUnit) item;
sql += DIM_NAME_OU + " like '" + unit.getPath() + "%' or ";
}
sql = TextUtils.removeLastOr(sql) + ") ";
} else {
sql += sqlHelper.whereAnd() + " " + col + " in (" + getQuotedCommaDelimitedString(getUids(dim.getItems())) + ") ";
}
}
}
if (params.hasStartEndDate()) {
sql += sqlHelper.whereAnd() + " " + "ps.startdate >= '" + DateUtils.getMediumDateString(params.getStartDate()) + "' and " + "ps.enddate <= '" + DateUtils.getMediumDateString(params.getEndDate()) + "' ";
}
return sql;
}
use of org.hisp.dhis.common.DimensionalItemObject in project dhis2-core by dhis2.
the class DefaultQueryPlanner method validate.
// -------------------------------------------------------------------------
// DefaultQueryPlanner implementation
// -------------------------------------------------------------------------
@Override
public void validate(DataQueryParams params) throws IllegalQueryException {
String violation = null;
if (params == null) {
throw new IllegalQueryException("Params cannot be null");
}
final List<DimensionalItemObject> dataElements = Lists.newArrayList(params.getDataElements());
params.getProgramDataElements().stream().forEach(pde -> dataElements.add(((ProgramDataElementDimensionItem) pde).getDataElement()));
final List<DataElement> nonAggDataElements = FilterUtils.inverseFilter(asTypedList(dataElements), AggregatableDataElementFilter.INSTANCE);
if (params.getDimensions().isEmpty()) {
violation = "At least one dimension must be specified";
}
if (!params.getDimensionsAsFilters().isEmpty()) {
violation = "Dimensions cannot be specified as dimension and filter simultaneously: " + params.getDimensionsAsFilters();
}
if (!params.hasPeriods() && !params.isSkipPartitioning() && !params.hasStartEndDate()) {
violation = "At least one period must be specified as dimension or filter";
}
if (params.hasPeriods() && params.hasStartEndDate()) {
violation = "Periods and start and end dates cannot be specified simultaneously";
}
if (!params.getFilterIndicators().isEmpty() && params.getFilterOptions(DATA_X_DIM_ID).size() > 1) {
violation = "Only a single indicator can be specified as filter";
}
if (!params.getFilterReportingRates().isEmpty() && params.getFilterOptions(DATA_X_DIM_ID).size() > 1) {
violation = "Only a single reporting rate can be specified as filter";
}
if (params.getFilters().contains(new BaseDimensionalObject(CATEGORYOPTIONCOMBO_DIM_ID))) {
violation = "Category option combos cannot be specified as filter";
}
if (!params.getDuplicateDimensions().isEmpty()) {
violation = "Dimensions cannot be specified more than once: " + params.getDuplicateDimensions();
}
if (!params.getAllReportingRates().isEmpty() && !params.containsOnlyDimensionsAndFilters(COMPLETENESS_DIMENSION_TYPES)) {
violation = "Reporting rates can only be specified together with dimensions of type: " + COMPLETENESS_DIMENSION_TYPES;
}
if (params.hasDimensionOrFilter(CATEGORYOPTIONCOMBO_DIM_ID) && params.getAllDataElements().isEmpty()) {
violation = "Assigned categories cannot be specified when data elements are not specified";
}
if (params.hasDimensionOrFilter(CATEGORYOPTIONCOMBO_DIM_ID) && (params.getAllDataElements().size() != params.getAllDataDimensionItems().size())) {
violation = "Assigned categories can only be specified together with data elements, not indicators or reporting rates";
}
if (!nonAggDataElements.isEmpty()) {
violation = "Data elements must be of a value and aggregation type that allow aggregation: " + getUids(nonAggDataElements);
}
if (params.isOutputFormat(OutputFormat.DATA_VALUE_SET)) {
if (!params.hasDimension(DATA_X_DIM_ID)) {
violation = "A data dimension 'dx' must be specified when output format is DATA_VALUE_SET";
}
if (!params.hasDimension(PERIOD_DIM_ID)) {
violation = "A period dimension 'pe' must be specified when output format is DATA_VALUE_SET";
}
if (!params.hasDimension(ORGUNIT_DIM_ID)) {
violation = "An organisation unit dimension 'ou' must be specified when output format is DATA_VALUE_SET";
}
}
if (violation != null) {
log.warn(String.format("Analytics validation failed: %s", violation));
throw new IllegalQueryException(violation);
}
}
use of org.hisp.dhis.common.DimensionalItemObject in project dhis2-core by dhis2.
the class DefaultQueryPlanner method groupByStartEndDate.
@Override
public List<DataQueryParams> groupByStartEndDate(DataQueryParams params) {
List<DataQueryParams> queries = new ArrayList<>();
if (!params.getPeriods().isEmpty()) {
for (DimensionalItemObject item : params.getPeriods()) {
Period period = (Period) item;
DataQueryParams query = DataQueryParams.newBuilder(params).withStartDate(period.getStartDate()).withEndDate(period.getEndDate()).build();
BaseDimensionalObject staticPeriod = (BaseDimensionalObject) query.getDimension(PERIOD_DIM_ID);
staticPeriod.setDimensionName(period.getIsoDate());
staticPeriod.setFixed(true);
queries.add(query);
}
} else if (!params.getFilterPeriods().isEmpty()) {
Period period = (Period) params.getFilterPeriods().get(0);
DataQueryParams query = DataQueryParams.newBuilder(params).withStartDate(period.getStartDate()).withEndDate(period.getEndDate()).removeFilter(PERIOD_DIM_ID).build();
queries.add(query);
} else {
throw new IllegalQueryException("Query does not contain any period dimension items");
}
if (queries.size() > 1) {
log.debug(String.format("Split on period: %d", queries.size()));
}
return queries;
}
Aggregations