class DataQueryParams {

    public String getKey()
    {
        QueryKey key = new QueryKey();

        dimensions.forEach( e -> key.add( "dimension", "[" + e.getKey() + "]" ) );
        filters.forEach( e -> key.add( "filter", "[" + e.getKey() + "]" ) );

        measureCriteria.forEach( ( k, v ) -> key.add( "measureCriteria", ( String.valueOf( k ) + v ) ) );
        preAggregateMeasureCriteria.forEach( ( k, v ) -> key.add( "preAggregateMeasureCriteria", ( String.valueOf( k ) + v ) ) );

        return key
            .add( "aggregationType", aggregationType )
            .add( "skipMeta", skipMeta )
            .add( "skipData", skipData )
            .add( "skipHeaders", skipHeaders )
            .add( "skipRounding", skipRounding )
            .add( "completedOnly", completedOnly )
            .add( "hierarchyMeta", hierarchyMeta )
            .add( "ignoreLimit", ignoreLimit )
            .add( "hideEmptyRows", hideEmptyRows )
            .add( "hideEmptyColumns", hideEmptyColumns )
            .add( "showHierarchy", showHierarchy )
            .add( "includeNumDen", includeNumDen )
            .add( "includePeriodStartEndDates", includePeriodStartEndDates )
            .add( "includeMetadataDetails", includeMetadataDetails )
            .add( "displayProperty", displayProperty )
            .add( "outputIdScheme", outputIdScheme )
            .add( "outputFormat", outputFormat )
            .add( "duplicatesOnly", duplicatesOnly )
            .add( "approvalLevel", approvalLevel )
            .add( "startDate", startDate )
            .add( "endDate", endDate )
            .add( "order", order )
            .add( "timeField", timeField )
            .add( "orgUnitField", orgUnitField )
            .add( "userOrgUnitType", userOrgUnitType )
            .addIgnoreNull( "apiVersion", apiVersion ).build();
    }

    protected  DataQueryParams();

}