Skip to content

Commit 4be2634

Browse files
refactor: [DHIS2-21420] centralise analytics_event/_enrollment table names
Introduce AnalyticsTableNames in dhis-support-sql with eventTable(Program) and enrollmentTable(Program) helpers. Replace every inline "analytics_event_" + program.getUid().toLowerCase() and equivalent "analytics_enrollment_" + ... concatenation with a call through the helper.
1 parent bba46e6 commit 4be2634

12 files changed

Lines changed: 183 additions & 24 deletions

File tree

dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/AbstractJdbcEventAnalyticsManager.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@
170170
import org.hisp.dhis.commons.util.SqlHelper;
171171
import org.hisp.dhis.commons.util.TextUtils;
172172
import org.hisp.dhis.db.sql.AnalyticsSqlBuilder;
173+
import org.hisp.dhis.db.util.AnalyticsTableNames;
173174
import org.hisp.dhis.external.conf.DhisConfigurationProvider;
174175
import org.hisp.dhis.feedback.ErrorCode;
175176
import org.hisp.dhis.option.Option;
@@ -281,8 +282,6 @@ public static AggregateClause of(String sql, AggregationType type, String innerE
281282

282283
private final DateFieldPeriodBucketColumnResolver dateFieldPeriodBucketColumnResolver;
283284

284-
static final String ANALYTICS_EVENT = "analytics_event_";
285-
286285
static final String COLUMN_ENROLLMENT_GEOMETRY_GEOJSON =
287286
String.format(
288287
"ST_AsGeoJSON(%s)", EnrollmentAnalyticsColumnName.ENROLLMENT_GEOMETRY_COLUMN_NAME);
@@ -2447,7 +2446,7 @@ private void addShadowEnrollmentTableCte(EventQueryParams params, CteContext cte
24472446
*/
24482447
private void addShadowEventTableCte(EventQueryParams params, CteContext cteContext) {
24492448
// Create a shadow CTE with the EXACT same name as the real event table
2450-
String eventTableName = "analytics_event_" + params.getProgram().getUid().toLowerCase();
2449+
String eventTableName = AnalyticsTableNames.eventTable(params.getProgram());
24512450

24522451
SelectBuilder shadowEvents = new SelectBuilder();
24532452

@@ -2791,7 +2790,7 @@ private void generateFilterCTEs(EventQueryParams params, CteContext cteContext)
27912790
private void buildProgramStageCte(
27922791
CteContext cteContext, QueryItem item, EventQueryParams params) {
27932792
// The event table name, e.g. "analytics_event_XYZ".
2794-
String eventTableName = ANALYTICS_EVENT + item.getProgram().getUid().toLowerCase();
2793+
String eventTableName = AnalyticsTableNames.eventTable(item.getProgram());
27952794

27962795
// Quoted column name for the item (e.g. "ax"."my_column").
27972796
String colName = quote(item.getItemName());
@@ -3118,7 +3117,7 @@ private String getSqlFilterValue(QueryFilter filter, QueryItem item, EventQueryP
31183117
*/
31193118
private String buildAggregateFilterCteSql(List<QueryItem> stageItems, EventQueryParams params) {
31203119
QueryItem firstItem = stageItems.get(0);
3121-
String tableName = "analytics_event_" + firstItem.getProgram().getUid().toLowerCase();
3120+
String tableName = AnalyticsTableNames.eventTable(firstItem.getProgram());
31223121
String stageUid = firstItem.getProgramStage().getUid();
31233122

31243123
List<String> innerColumns = new ArrayList<>();
@@ -3215,10 +3214,7 @@ private String buildFilterCteSql(List<QueryItem> queryItems, EventQueryParams pa
32153214
// Determine the correct table: event table or enrollment table
32163215
String tableName =
32173216
item.hasProgramStage()
3218-
? "analytics_event_"
3219-
+ item.getProgram()
3220-
.getUid()
3221-
.toLowerCase() // Event table for program stage
3217+
? AnalyticsTableNames.eventTable(item.getProgram())
32223218
: params.getTableName(); // Enrollment table
32233219

32243220
String programStageCondition =

dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/EnrollmentEventSubqueryBuilder.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.hisp.dhis.common.RepeatableStageParams;
3939
import org.hisp.dhis.common.ValueType;
4040
import org.hisp.dhis.db.sql.AnalyticsSqlBuilder;
41+
import org.hisp.dhis.db.util.AnalyticsTableNames;
4142
import org.hisp.dhis.event.EventStatus;
4243
import org.locationtech.jts.util.Assert;
4344
import org.springframework.stereotype.Component;
@@ -54,8 +55,6 @@
5455
@RequiredArgsConstructor
5556
public class EnrollmentEventSubqueryBuilder {
5657

57-
private static final String ANALYTICS_EVENT_TABLE_PREFIX = "analytics_event_";
58-
5958
private static final String LIMIT_1 = "limit 1";
6059

6160
private static final String IS_NOT_NULL = " is not null ";
@@ -72,7 +71,7 @@ public class EnrollmentEventSubqueryBuilder {
7271
public String renderValueSubquery(QueryItem item, String suffix) {
7372
assertProgram(item);
7473
String quotedColName = sqlBuilder.quote(item.getItemName() + suffix);
75-
String eventTableName = ANALYTICS_EVENT_TABLE_PREFIX + item.getProgram().getUid().toLowerCase();
74+
String eventTableName = AnalyticsTableNames.eventTable(item.getProgram());
7675

7776
if (item.getProgramStage().getRepeatable() && item.hasRepeatableStageParams()) {
7877
return repeatableStageSubquery(item, quotedColName, eventTableName);
@@ -89,7 +88,7 @@ public ColumnAndAlias renderCoordinateSubquery(QueryItem item) {
8988
return ColumnAndAlias.EMPTY;
9089
}
9190

92-
String eventTableName = ANALYTICS_EVENT_TABLE_PREFIX + item.getProgram().getUid().toLowerCase();
91+
String eventTableName = AnalyticsTableNames.eventTable(item.getProgram());
9392
String quotedColName = sqlBuilder.quote(item.getItemId());
9493

9594
String psCondition = "";

dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/EnrollmentTimeFieldSqlRenderer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import org.hisp.dhis.analytics.event.EventQueryParams;
5151
import org.hisp.dhis.common.DimensionalItemObject;
5252
import org.hisp.dhis.db.sql.SqlBuilder;
53+
import org.hisp.dhis.db.util.AnalyticsTableNames;
5354
import org.hisp.dhis.period.Period;
5455
import org.hisp.dhis.period.PeriodDimension;
5556
import org.hisp.dhis.program.AnalyticsPeriodBoundary;
@@ -141,8 +142,7 @@ private String getProgramIndicatorEventInProgramStageSql(
141142
for (String programStage : map.keySet()) {
142143
Set<AnalyticsPeriodBoundary> boundaries = map.get(programStage);
143144

144-
String eventTableName =
145-
"analytics_event_" + programIndicator.getProgram().getUid().toLowerCase();
145+
String eventTableName = AnalyticsTableNames.eventTable(programIndicator.getProgram());
146146
sql +=
147147
(firstIteration ? "" : " and ")
148148
+ " exists(select 1 from "

dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEnrollmentAnalyticsManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@
108108
import org.hisp.dhis.commons.util.ExpressionUtils;
109109
import org.hisp.dhis.commons.util.SqlHelper;
110110
import org.hisp.dhis.db.sql.AnalyticsSqlBuilder;
111+
import org.hisp.dhis.db.util.AnalyticsTableNames;
111112
import org.hisp.dhis.external.conf.DhisConfigurationProvider;
112113
import org.hisp.dhis.organisationunit.OrganisationUnit;
113114
import org.hisp.dhis.period.PeriodDimension;
@@ -934,7 +935,7 @@ private void addBaseAggregatedCteJoins(
934935
return;
935936
}
936937

937-
String eventTableName = ANALYTICS_EVENT + params.getProgram().getUid().toLowerCase();
938+
String eventTableName = AnalyticsTableNames.eventTable(params.getProgram());
938939
String eventEnrollmentFilterSql =
939940
"""
940941
(

dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/programindicator/ctefactory/D2FunctionCteFactory.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.hisp.dhis.analytics.event.data.programindicator.ctefactory.placeholder.PlaceholderParser;
4646
import org.hisp.dhis.antlr.AntlrParserUtils;
4747
import org.hisp.dhis.db.sql.SqlBuilder;
48+
import org.hisp.dhis.db.util.AnalyticsTableNames;
4849
import org.hisp.dhis.program.AnalyticsPeriodBoundary;
4950
import org.hisp.dhis.program.ProgramIndicator;
5051

@@ -196,7 +197,7 @@ private static String resolveEventTable(ProgramIndicator pi) {
196197
log.error("ProgramIndicator {} lacks program – cannot build D2 CTE.", pi.getUid());
197198
return null;
198199
}
199-
return "analytics_event_" + pi.getProgram().getUid().toLowerCase();
200+
return AnalyticsTableNames.eventTable(pi.getProgram());
200201
}
201202

202203
private enum D2FuncType {

dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/programindicator/ctefactory/FilterCteFactory.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.hisp.dhis.analytics.event.data.programindicator.ctefactory.placeholder.PlaceholderParser;
4141
import org.hisp.dhis.analytics.event.data.programindicator.ctefactory.placeholder.PlaceholderParser.FilterFields;
4242
import org.hisp.dhis.db.sql.SqlBuilder;
43+
import org.hisp.dhis.db.util.AnalyticsTableNames;
4344
import org.hisp.dhis.program.ProgramIndicator;
4445

4546
public class FilterCteFactory implements CteSqlFactory {
@@ -134,7 +135,7 @@ private static String buildFilterCteSql(
134135
Date end,
135136
SqlBuilder qb) {
136137

137-
String table = "analytics_event_" + pi.getProgram().getUid().toLowerCase();
138+
String table = AnalyticsTableNames.eventTable(pi.getProgram());
138139
String quotedCol = qb.quote(column);
139140

140141
String boundaries =

dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/programindicator/ctefactory/ProgramStageDataElementCteFactory.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import org.hisp.dhis.dataelement.DataElement;
4747
import org.hisp.dhis.dataelement.DataElementService;
4848
import org.hisp.dhis.db.sql.SqlBuilder;
49+
import org.hisp.dhis.db.util.AnalyticsTableNames;
4950
import org.hisp.dhis.program.AnalyticsPeriodBoundary;
5051
import org.hisp.dhis.program.ProgramIndicator;
5152

@@ -149,7 +150,7 @@ private void ensureCte(
149150
log.error("PI {} has no Program – cannot create CTE {}", pi.getUid(), key);
150151
return;
151152
}
152-
String table = "analytics_event_" + pi.getProgram().getUid().toLowerCase();
153+
String table = AnalyticsTableNames.eventTable(pi.getProgram());
153154
String boundaries =
154155
BoundarySqlBuilder.buildSql(
155156
pi.getAnalyticsPeriodBoundaries(),

dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/programindicator/ctefactory/VariableCteFactory.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.hisp.dhis.analytics.event.data.programindicator.ctefactory.placeholder.PlaceholderParser;
4444
import org.hisp.dhis.analytics.event.data.programindicator.ctefactory.placeholder.PlaceholderParser.VariableFields;
4545
import org.hisp.dhis.db.sql.SqlBuilder;
46+
import org.hisp.dhis.db.util.AnalyticsTableNames;
4647
import org.hisp.dhis.program.ProgramIndicator;
4748

4849
@Slf4j
@@ -115,7 +116,7 @@ private void buildVariableCte(
115116
CteContext ctx,
116117
SqlBuilder qb) {
117118

118-
String table = "analytics_event_" + pi.getProgram().getUid().toLowerCase();
119+
String table = AnalyticsTableNames.eventTable(pi.getProgram());
119120
String psCondition = v.psUid() != null ? "and ps = '" + v.psUid() + "' " : "";
120121

121122
String boundaries =

dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/trackedentity/query/context/querybuilder/ProgramIndicatorQueryBuilder.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import org.hisp.dhis.analytics.trackedentity.query.context.sql.SqlQueryBuilder;
6767
import org.hisp.dhis.analytics.trackedentity.query.context.sql.SqlQueryBuilders;
6868
import org.hisp.dhis.commons.util.TextUtils;
69+
import org.hisp.dhis.db.util.AnalyticsTableNames;
6970
import org.hisp.dhis.program.AnalyticsType;
7071
import org.hisp.dhis.program.Program;
7172
import org.hisp.dhis.program.ProgramIndicator;
@@ -262,8 +263,8 @@ private static String enrollmentProgramIndicatorSelect(
262263
+ ", "
263264
+ (needsExpressions ? expression + " as value, " : "")
264265
+ " row_number() over (partition by trackedentity order by enrollmentdate desc) as rn "
265-
+ " from analytics_enrollment_"
266-
+ program.getElement().getUid().toLowerCase()
266+
+ " from "
267+
+ AnalyticsTableNames.enrollmentTable(program.getElement())
267268
+ " as "
268269
+ SUBQUERY_TABLE_ALIAS
269270
+ (needsExpressions ? " where " + filter : "")

dhis-2/dhis-support/dhis-support-expression-parser/src/main/java/org/hisp/dhis/parser/expression/statement/DefaultStatementBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import lombok.RequiredArgsConstructor;
4444
import org.hisp.dhis.analytics.AnalyticsConstants;
4545
import org.hisp.dhis.db.sql.SqlBuilder;
46+
import org.hisp.dhis.db.util.AnalyticsTableNames;
4647
import org.hisp.dhis.period.Period;
4748
import org.hisp.dhis.program.AnalyticsPeriodBoundary;
4849
import org.hisp.dhis.program.AnalyticsType;
@@ -138,8 +139,7 @@ private String getProgramIndicatorEventInEnrollmentSelectSql(
138139
programStageCondition = "and ps = '" + programStageUid + "' ";
139140
}
140141

141-
String eventTableName =
142-
"analytics_event_" + programIndicator.getProgram().getUid().toLowerCase();
142+
String eventTableName = AnalyticsTableNames.eventTable(programIndicator.getProgram());
143143
return "(select "
144144
+ columnName
145145
+ " from "

0 commit comments

Comments
 (0)