private Set buildComplexDataQueryGroups()

in SdmxStructureParser/src/main/java/org/sdmxsource/sdmx/structureparser/builder/query/v21/DataQueryBuilderV21.java [386:475]


    private Set<ComplexDataQuerySelectionGroup> buildComplexDataQueryGroups(DataParametersAndType dataWhere, SdmxBeanRetrievalManager structureRetrievalManager, Set<DataProviderBean> dataProviders) {

        Set<ComplexDataQuerySelectionGroup> complexDataQuerySelectionGroups = new HashSet<ComplexDataQuerySelectionGroup>();
        Set<ComplexDataQuerySelection> complexSelections = new HashSet<ComplexDataQuerySelection>();
        Set<ComplexComponentValue> primaryMeasureValues = new HashSet<ComplexComponentValue>();
        ORDERED_OPERATOR dateFromOperator = ORDERED_OPERATOR.EQUAL;
        ORDERED_OPERATOR dateToOperator = ORDERED_OPERATOR.EQUAL;
        SdmxDate dateFrom = null;
        SdmxDate dateTo = null;

        //primary measure
        if (dataWhere.getPrimaryMeasureValueList() != null && (dataWhere.getPrimaryMeasureValueList().size() > 0)) {
            PrimaryMeasureValueType primaryMeasure = dataWhere.getPrimaryMeasureValueList().get(0);
            Set<ComplexComponentValue> complexValues = getComplexComponentValues(primaryMeasure, SDMX_STRUCTURE_TYPE.PRIMARY_MEASURE);
            for (ComplexComponentValue complexValue : complexValues) {
                primaryMeasureValues.add(complexValue);
            }
        }
        //add all
        //time dimension
        if (dataWhere.getTimeDimensionValueList() != null && dataWhere.getTimeDimensionValueList().size() > 0) {
            TimeDimensionValueType timeValue = dataWhere.getTimeDimensionValueList().get(0);
            Set<ComplexComponentValue> complexValues = getComplexComponentValues(timeValue, SDMX_STRUCTURE_TYPE.TIME_DIMENSION);
            ComplexComponentValue[] complexTimeValues = complexValues.toArray(new ComplexComponentValue[0]);

            if (complexValues != null && complexValues.size() > 0) {
                if (complexTimeValues[0].getOrderedOperator().equals(ORDERED_OPERATOR.GREATER_THAN) ||
                        complexTimeValues[0].getOrderedOperator().equals(ORDERED_OPERATOR.GREATER_THAN_OR_EQUAL) ||
                        complexTimeValues[0].getOrderedOperator().equals(ORDERED_OPERATOR.EQUAL)) {
                    dateFrom = new SdmxDateImpl(complexTimeValues[0].getValue());
                    dateFromOperator = complexTimeValues[0].getOrderedOperator();
                    if (complexValues.size() == 2) {
                        dateTo = new SdmxDateImpl(complexTimeValues[1].getValue());
                        dateToOperator = complexTimeValues[1].getOrderedOperator();
                    }
                } else {
                    dateTo = new SdmxDateImpl(complexTimeValues[0].getValue());
                    dateToOperator = complexTimeValues[0].getOrderedOperator();
                    if (complexValues.size() == 2) {
                        dateFrom = new SdmxDateImpl(complexTimeValues[1].getValue());
                        dateFromOperator = complexTimeValues[1].getOrderedOperator();
                    }
                }
                if (complexValues.size() == 2) {
                    //interchange dates if not the correct order
                    if (dateFrom.isLater(dateTo)) {
                        SdmxDate tempDate = dateTo;
                        dateTo = dateFrom;
                        dateFrom = tempDate;
                        ORDERED_OPERATOR tempOperator = dateToOperator;
                        dateToOperator = dateFromOperator;
                        dateFromOperator = tempOperator;
                    }
                    //cases when same operator is used
                    if (dateToOperator.equals(dateFromOperator)) {
                        if (ORDERED_OPERATOR.GREATER_THAN.equals(dateToOperator) ||
                                ORDERED_OPERATOR.GREATER_THAN_OR_EQUAL.equals(dateToOperator)) {
                            //only the greatest date is considered
                            dateFrom = dateTo;
                            dateTo = null;
                        }
                        if (ORDERED_OPERATOR.LESS_THAN.equals(dateToOperator) ||
                                ORDERED_OPERATOR.LESS_THAN_OR_EQUAL.equals(dateToOperator)) {
                            //only the lowest date is considered
                            dateTo = dateFrom;
                            dateFrom = null;
                        }
                    }
                }
            }
        }
        //dimensions
        if (dataWhere.getDimensionValueList() != null && dataWhere.getDimensionValueList().size() > 0) {
            for (DimensionValueType dimValue : dataWhere.getDimensionValueList()) {
                ComplexComponentValue comValue = getComplexComponentValue(dimValue, SDMX_STRUCTURE_TYPE.DIMENSION);
                addComponentSelection(complexSelections, dimValue.getID(), comValue);
            }
        }
        //attributes
        if (dataWhere.getAttributeValueList() != null && dataWhere.getAttributeValueList().size() > 0) {
            for (AttributeValueType attrValue : dataWhere.getAttributeValueList()) {
                ComplexComponentValue comValue = getComplexComponentValue(attrValue, SDMX_STRUCTURE_TYPE.DATA_ATTRIBUTE);
                addComponentSelection(complexSelections, attrValue.getID(), comValue);
            }
        }
        //DataParametersOrType
        processParametersOrType(dataWhere.getOrList(), complexSelections, structureRetrievalManager, dataProviders);
        addGroupIfSelectionsExist(complexSelections, dateFrom, dateFromOperator, dateTo, dateToOperator, primaryMeasureValues, complexDataQuerySelectionGroups);
        return complexDataQuerySelectionGroups;
    }