Skip to content

Commit

Permalink
WIP - Re-fixed row context logic
Browse files Browse the repository at this point in the history
  • Loading branch information
luciano-fiandesio committed Dec 18, 2024
1 parent f383bac commit 3e070ce
Show file tree
Hide file tree
Showing 5 changed files with 299 additions and 189 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,12 @@
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import lombok.Getter;

public class CTEContext {
private final Map<String, String> cteDefinitions = new LinkedHashMap<>();
private final Map<String, String> columnMappings = new HashMap<>();
@Getter private final Map<String, String> rowContextReferences = new HashMap<>();

public void addCTE(String cteName, String cteDefinition) {
cteDefinitions.put(cteName, cteDefinition);
Expand All @@ -44,6 +46,17 @@ public void addColumnMapping(String originalColumn, String cteReference) {
columnMappings.put(originalColumn, cteReference);
}

/**
* Adds a mapping between a row context column and the CTE name that it references.
*
* @param alias The alias of the row context column, for instance "EPEcjy3FWmI.lJTx9EZ1dk1"
* @param cteName The name of the CTE that the row context column references, for instance
* "ps_epecjy3fwmi_ljtx9ez1dk1"
*/
public void addRowContextColumnMapping(String alias, String cteName) {
rowContextReferences.put(alias, cteName);
}

public String getCTEDefinition() {
if (cteDefinitions.isEmpty()) {
return "";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,46 @@
/*
* Copyright (c) 2004-2024, University of Oslo
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* Neither the name of the HISP project nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.hisp.dhis.analytics.common;

import org.hisp.dhis.common.QueryItem;

public class CTEUtils {

public static String createFilterName(QueryItem queryItem) {
return "filter_" + getIdentifier(queryItem).replace('.', '_').toLowerCase();
}
public static String createFilterName(QueryItem queryItem) {
return "filter_" + getIdentifier(queryItem).replace('.', '_').toLowerCase();
}

public static String createFilterNameByIdentifier(String identifier) {
return "filter_" + identifier.replace('.', '_').toLowerCase();
}
public static String createFilterNameByIdentifier(String identifier) {
return "filter_" + identifier.replace('.', '_').toLowerCase();
}

public static String getIdentifier(QueryItem queryItem) {
String stage = queryItem.hasProgramStage() ? queryItem.getProgramStage().getUid() : "default";
return stage + "." + queryItem.getItemId();
}
public static String getIdentifier(QueryItem queryItem) {
String stage = queryItem.hasProgramStage() ? queryItem.getProgramStage().getUid() : "default";
return stage + "." + queryItem.getItemId();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/*
* Copyright (c) 2004-2024, University of Oslo
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* Neither the name of the HISP project nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.hisp.dhis.analytics.common;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.hisp.dhis.db.sql.SqlBuilder;

public class RowContextUtils {

public static List<String> getRowContextColumns(CTEContext cteContext, SqlBuilder sqlBuilder) {
List<String> columns = new ArrayList<>();
Map<String, String> rowCtxRefs = cteContext.getRowContextReferences();
for (String aliases : rowCtxRefs.keySet()) {
columns.add(getStatusColumn(aliases, rowCtxRefs.get(aliases), sqlBuilder));
columns.add(getExistsColumn(aliases, rowCtxRefs.get(aliases), sqlBuilder));
}

return columns;
}

public static List<String> getRowContextWhereClauses(CTEContext cteContext) {
List<String> whereClauses = new ArrayList<>();
Map<String, String> rowCtxRefs = cteContext.getRowContextReferences();
for (String alias : rowCtxRefs.values()) {
whereClauses.add("%s.value is null".formatted(alias));
whereClauses.add("%s.exists_flag = true".formatted(alias));
}
return whereClauses;
}

private static String getExistsColumn(
String aliases, String cteReference, SqlBuilder sqlBuilder) {
return "coalesce(%s.exists_flag, false) as %s"
.formatted(cteReference, sqlBuilder.quote(aliases + ".status.exists"));
}

private static String getStatusColumn(String alias, String cteReference, SqlBuilder sqlBuilder) {
return "%s_status.status as %s".formatted(cteReference, sqlBuilder.quote(alias));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -414,7 +414,7 @@ private void addItemSelectColumns(
* @param queryItem
* @return true when eligible for row context
*/
private boolean rowContextAllowedAndNeeded(EventQueryParams params, QueryItem queryItem) {
protected boolean rowContextAllowedAndNeeded(EventQueryParams params, QueryItem queryItem) {
return params.getEndpointItem() == ENROLLMENT
&& params.isRowContext()
&& queryItem.hasProgramStage()
Expand Down
Loading

0 comments on commit 3e070ce

Please sign in to comment.