From bbda0f2b0cf4e301fab4cb5a77661588343ab619 Mon Sep 17 00:00:00 2001 From: ak2502 Date: Sat, 16 Sep 2023 10:33:51 +0530 Subject: [PATCH 1/4] avniproject/avni-product#1334 | added suggested changes: 1) added runInOrgContext in ReportRepository 2) removed getSummaryTable paramenters in ReportController 3) renamed StrUtil to StringUtil and removed isEmpty class as it is a predefined class Signed-off-by: ak2502 --- .../etl/controller/ReportController.java | 4 +- .../etl/repository/ReportRepository.java | 92 ++++++++++++++++--- .../org/avniproject/etl/util/ReportUtil.java | 2 +- .../util/{StrUtil.java => StringUtil.java} | 6 +- 4 files changed, 82 insertions(+), 22 deletions(-) rename src/main/java/org/avniproject/etl/util/{StrUtil.java => StringUtil.java} (67%) diff --git a/src/main/java/org/avniproject/etl/controller/ReportController.java b/src/main/java/org/avniproject/etl/controller/ReportController.java index 4e9f84b0..9bdaf449 100644 --- a/src/main/java/org/avniproject/etl/controller/ReportController.java +++ b/src/main/java/org/avniproject/etl/controller/ReportController.java @@ -25,9 +25,7 @@ public ReportController(ReportRepository reportRepository, ReportUtil reportUtil @PreAuthorize("hasAnyAuthority('analytics_user')") @RequestMapping(value = "/report/aggregate/summaryTable", method = RequestMethod.GET) - public List getSummaryTable(@RequestParam(value = "startDate", required = false) String startDate, - @RequestParam(value = "endDate", required = false) String endDate, - @RequestParam(value = "userIds", required = false, defaultValue = "") List userIds){ + public List getSummaryTable(){ return reportRepository.generateSummaryTable( OrgIdentityContextHolder.getDbSchema() ); diff --git a/src/main/java/org/avniproject/etl/repository/ReportRepository.java b/src/main/java/org/avniproject/etl/repository/ReportRepository.java index 0c762b7a..a2121683 100644 --- a/src/main/java/org/avniproject/etl/repository/ReportRepository.java +++ b/src/main/java/org/avniproject/etl/repository/ReportRepository.java @@ -1,25 +1,31 @@ package org.avniproject.etl.repository; +import org.avniproject.etl.domain.NullObject; import org.avniproject.etl.domain.metadata.SchemaMetadata; import org.avniproject.etl.dto.AggregateReportResult; import org.avniproject.etl.dto.UserActivityDTO; import org.avniproject.etl.repository.rowMappers.reports.*; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Component; import org.stringtemplate.v4.ST; import java.util.List; +import static org.avniproject.etl.repository.JdbcContextWrapper.runInOrgContext; + @Component public class ReportRepository { - private final NamedParameterJdbcTemplate jdbcTemplate; + private final NamedParameterJdbcTemplate namedJdbcTemplate; private final SchemaMetadataRepository schemaMetadataRepository; + private final JdbcTemplate jdbcTemplate; @Autowired - public ReportRepository(NamedParameterJdbcTemplate jdbcTemplate, SchemaMetadataRepository schemaMetadataRepository) { - this.jdbcTemplate = jdbcTemplate; + public ReportRepository(NamedParameterJdbcTemplate namedJdbcTemplate, SchemaMetadataRepository schemaMetadataRepository, JdbcTemplate jdbcTemplate) { + this.namedJdbcTemplate = namedJdbcTemplate; this.schemaMetadataRepository = schemaMetadataRepository; + this.jdbcTemplate = jdbcTemplate; } public List generateSummaryTable(String orgSchemaName){ @@ -28,7 +34,13 @@ public List generateSummaryTable(String orgSchemaName){ "where schema_name = '${schemaName}'\n" + "order by type;"; String query= baseQuery.replace("${schemaName}", orgSchemaName); - return jdbcTemplate.query(query, new SummaryTableMapper()); + + runInOrgContext(() -> { + jdbcTemplate.execute(query); + return NullObject.instance(); + }, jdbcTemplate); + + return namedJdbcTemplate.query(query, new SummaryTableMapper()); } public List generateUserActivity(String orgSchemaName, String subjectWhere, String encounterWhere, String enrolmentWhere, String userWhere) { @@ -135,7 +147,13 @@ public List generateUserActivity(String orgSchemaName, String s .replace("$encounterWhere", encounterWhere) .replace("$enrolmentWhere", enrolmentWhere) .replace("$userWhere", userWhere); - return jdbcTemplate.query(query, new UserActivityMapper()); + + runInOrgContext(() -> { + jdbcTemplate.execute(query); + return NullObject.instance(); + }, jdbcTemplate); + + return namedJdbcTemplate.query(query, new UserActivityMapper()); } public List generateUserSyncFailures(String orgSchemaName, String syncTelemetryWhere, String userWhere) { @@ -155,7 +173,13 @@ public List generateUserSyncFailures(String orgSchemaName, Stri .replace("${schemaName}", orgSchemaName) .replace("${syncTelemetryWhere}", syncTelemetryWhere) .replace("${userWhere}", userWhere); - return jdbcTemplate.query(query, new UserCountMapper()); + + runInOrgContext(() -> { + jdbcTemplate.execute(query); + return NullObject.instance(); + }, jdbcTemplate); + + return namedJdbcTemplate.query(query, new UserCountMapper()); } public List generateUserAppVersions(String orgSchemaName, String userWhere) { @@ -173,7 +197,13 @@ public List generateUserAppVersions(String orgSchemaName, String query = baseQuery .replace("${schemaName}", orgSchemaName) .replace("${userWhere}", userWhere); - return jdbcTemplate.query(query, new AggregateReportMapper()); + + runInOrgContext(() -> { + jdbcTemplate.execute(query); + return NullObject.instance(); + }, jdbcTemplate); + + return namedJdbcTemplate.query(query, new AggregateReportMapper()); } public List generateUserDeviceModels(String orgSchemaName, String userWhere) { @@ -191,7 +221,13 @@ public List generateUserDeviceModels(String orgSchemaName String query = baseQuery .replace("${schemaName}", orgSchemaName) .replace("${userWhere}", userWhere); - return jdbcTemplate.query(query, new AggregateReportMapper()); + + runInOrgContext(() -> { + jdbcTemplate.execute(query); + return NullObject.instance(); + }, jdbcTemplate); + + return namedJdbcTemplate.query(query, new AggregateReportMapper()); } public List generateUserDetails(String orgSchemaName, String userWhere) { @@ -215,7 +251,13 @@ public List generateUserDetails(String orgSchemaName, String us String query = baseQuery .replace("${schemaName}", orgSchemaName) .replace("${userWhere}", userWhere); - return jdbcTemplate.query(query, new UserDetailsMapper()); + + runInOrgContext(() -> { + jdbcTemplate.execute(query); + return NullObject.instance(); + }, jdbcTemplate); + + return namedJdbcTemplate.query(query, new UserDetailsMapper()); } public List generateLatestSyncs(String orgSchemaName, String syncTelemetryWhere, String userWhere) { @@ -232,7 +274,13 @@ public List generateLatestSyncs(String orgSchemaName, String sy .replace("${schemaName}", orgSchemaName) .replace("${syncTelemetryWhere}", syncTelemetryWhere) .replace("${userWhere}", userWhere); - return jdbcTemplate.query(query, new LatestSyncMapper()); + + runInOrgContext(() -> { + jdbcTemplate.execute(query); + return NullObject.instance(); + }, jdbcTemplate); + + return namedJdbcTemplate.query(query, new LatestSyncMapper()); } public List generateMedianSync(String orgSchemaName, String syncTelemetryWhere) { @@ -250,7 +298,13 @@ public List generateMedianSync(String orgSchemaName, String syn String query = baseQuery .replace("${schemaName}", orgSchemaName) .replace("${syncTelemetryWhere}", syncTelemetryWhere); - return jdbcTemplate.query(query, new MedianSyncMapper()); + + runInOrgContext(() -> { + jdbcTemplate.execute(query); + return NullObject.instance(); + }, jdbcTemplate); + + return namedJdbcTemplate.query(query, new MedianSyncMapper()); } public List generateCompletedVisitsOnTimeByProportion(String proportionCondition, String orgSchemaName, String encounterWhere, String userWhere) { @@ -321,7 +375,13 @@ public List generateCompletedVisitsOnTimeByProportion(Str .replace("$schemaName", orgSchemaName) .replace("$encounterWhere", encounterWhere) .replace("$userWhere", userWhere); - return jdbcTemplate.query(query, new AggregateReportMapper()); + + runInOrgContext(() -> { + jdbcTemplate.execute(query); + return NullObject.instance(); + }, jdbcTemplate); + + return namedJdbcTemplate.query(query, new AggregateReportMapper()); } public List generateUserCancellingMostVisits(String orgSchemaName, String encounterWhere, String userWhere) { @@ -385,6 +445,12 @@ public List generateUserCancellingMostVisits(String orgSc String query = baseQuery.render().replace("$schemaName", orgSchemaName) .replace("$encounterWhere", encounterWhere) .replace("$userWhere", userWhere); - return jdbcTemplate.query(query, new AggregateReportMapper()); + + runInOrgContext(() -> { + jdbcTemplate.execute(query); + return NullObject.instance(); + }, jdbcTemplate); + + return namedJdbcTemplate.query(query, new AggregateReportMapper()); } } diff --git a/src/main/java/org/avniproject/etl/util/ReportUtil.java b/src/main/java/org/avniproject/etl/util/ReportUtil.java index 239282b6..98436b12 100644 --- a/src/main/java/org/avniproject/etl/util/ReportUtil.java +++ b/src/main/java/org/avniproject/etl/util/ReportUtil.java @@ -24,7 +24,7 @@ public String getDateSeries(String startDate, String endDate) { public String getDynamicUserWhere(List userIds, String columnName) { if (!userIds.isEmpty()) { - return format("and %s in (%s)", columnName, StrUtil.joinLongToList(userIds)); + return format("and %s in (%s)", columnName, StringUtil.joinLongToList(userIds)); } return ""; } diff --git a/src/main/java/org/avniproject/etl/util/StrUtil.java b/src/main/java/org/avniproject/etl/util/StringUtil.java similarity index 67% rename from src/main/java/org/avniproject/etl/util/StrUtil.java rename to src/main/java/org/avniproject/etl/util/StringUtil.java index 10e759cc..8f0ccf45 100644 --- a/src/main/java/org/avniproject/etl/util/StrUtil.java +++ b/src/main/java/org/avniproject/etl/util/StringUtil.java @@ -3,11 +3,7 @@ import java.util.List; import java.util.stream.Collectors; -public class StrUtil { - - public static boolean isEmpty(String string) { - return string == null || string.trim().isEmpty(); - } +public class StringUtil { public static String joinLongToList(List lists) { return lists.isEmpty() ? "" : lists.stream().map(String::valueOf) From a5af384f9ef25e0872d8c74e96bf9b21af9ba870 Mon Sep 17 00:00:00 2001 From: ak2502 Date: Sat, 16 Sep 2023 11:10:44 +0530 Subject: [PATCH 2/4] avniproject/avni-product#1334 | added schemaName directly into ReportRepository (removed it as a parameter from function) Signed-off-by: ak2502 --- .../etl/controller/ReportController.java | 15 +------ .../etl/repository/ReportRepository.java | 41 ++++++++++--------- 2 files changed, 22 insertions(+), 34 deletions(-) diff --git a/src/main/java/org/avniproject/etl/controller/ReportController.java b/src/main/java/org/avniproject/etl/controller/ReportController.java index 9bdaf449..819a3f41 100644 --- a/src/main/java/org/avniproject/etl/controller/ReportController.java +++ b/src/main/java/org/avniproject/etl/controller/ReportController.java @@ -1,6 +1,5 @@ package org.avniproject.etl.controller; -import org.avniproject.etl.domain.OrgIdentityContextHolder; import org.avniproject.etl.dto.AggregateReportResult; import org.avniproject.etl.dto.UserActivityDTO; import org.avniproject.etl.repository.ReportRepository; @@ -26,9 +25,7 @@ public ReportController(ReportRepository reportRepository, ReportUtil reportUtil @PreAuthorize("hasAnyAuthority('analytics_user')") @RequestMapping(value = "/report/aggregate/summaryTable", method = RequestMethod.GET) public List getSummaryTable(){ - return reportRepository.generateSummaryTable( - OrgIdentityContextHolder.getDbSchema() - ); + return reportRepository.generateSummaryTable(); } @PreAuthorize("hasAnyAuthority('analytics_user')") @@ -37,7 +34,6 @@ public List getUserActivity(@RequestParam(value = "startDate", @RequestParam(value = "endDate", required = false) String endDate, @RequestParam(value = "userIds", required = false, defaultValue = "") List userIds){ return reportRepository.generateUserActivity( - OrgIdentityContextHolder.getDbSchema(), reportUtil.getDateDynamicWhere(startDate, endDate, "registration_date"), reportUtil.getDateDynamicWhere(startDate, endDate, "encounter_date_time"), reportUtil.getDateDynamicWhere(startDate, endDate, "enrolment_date_time"), @@ -51,7 +47,6 @@ public List getUserWiseSyncFailures(@RequestParam(value = "star @RequestParam(value = "endDate", required = false) String endDate, @RequestParam(value = "userIds", required = false, defaultValue = "") List userIds){ return reportRepository.generateUserSyncFailures( - OrgIdentityContextHolder.getDbSchema(), reportUtil.getDateDynamicWhere(startDate, endDate, "st.sync_start_time"), reportUtil.getDynamicUserWhere(userIds, "u.id") ); @@ -62,7 +57,6 @@ public List getUserWiseSyncFailures(@RequestParam(value = "star public List getUserWiseDeviceModels(@RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { return reportRepository.generateUserDeviceModels( - OrgIdentityContextHolder.getDbSchema(), reportUtil.getDynamicUserWhere(userIds, "u.id")); } @@ -71,7 +65,6 @@ public List getUserWiseDeviceModels(@RequestParam(value = public List getUserWiseAppVersions(@RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { return reportRepository.generateUserAppVersions( - OrgIdentityContextHolder.getDbSchema(), reportUtil.getDynamicUserWhere(userIds, "u.id")); } @@ -80,7 +73,6 @@ public List getUserWiseAppVersions(@RequestParam(value = public List getUserDetails(@RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { return reportRepository.generateUserDetails( - OrgIdentityContextHolder.getDbSchema(), reportUtil.getDynamicUserWhere(userIds, "u.id")); } @@ -91,7 +83,6 @@ public List getLatestSyncs(@RequestParam(value = "startDate", r @RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { return reportRepository.generateLatestSyncs( - OrgIdentityContextHolder.getDbSchema(), reportUtil.getDateDynamicWhere(startDate, endDate, "st.sync_end_time"), reportUtil.getDynamicUserWhere(userIds, "u.id")); } @@ -103,7 +94,6 @@ public List getMedianSync(@RequestParam(value = "startDate", re @RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { return reportRepository.generateMedianSync( - OrgIdentityContextHolder.getDbSchema(), reportUtil.getDateSeries(startDate, endDate)); } @@ -114,7 +104,6 @@ public List getChampionUsers(@RequestParam(value = "start @RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { return reportRepository.generateCompletedVisitsOnTimeByProportion( ">= 0.5", - OrgIdentityContextHolder.getDbSchema(), reportUtil.getDateDynamicWhere(startDate, endDate, "encounter_date_time"), reportUtil.getDynamicUserWhere(userIds, "u.id")); } @@ -126,7 +115,6 @@ public List getNonPerformingUsers(@RequestParam(value = " @RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { return reportRepository.generateCompletedVisitsOnTimeByProportion( "<= 0.5", - OrgIdentityContextHolder.getDbSchema(), reportUtil.getDateDynamicWhere(startDate, endDate, "encounter_date_time"), reportUtil.getDynamicUserWhere(userIds, "u.id") ); @@ -138,7 +126,6 @@ public List getUsersCancellingMostVisits(@RequestParam(va @RequestParam(value = "endDate", required = false) String endDate, @RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { return reportRepository.generateUserCancellingMostVisits( - OrgIdentityContextHolder.getDbSchema(), reportUtil.getDateDynamicWhere(startDate, endDate, "encounter_date_time"), reportUtil.getDynamicUserWhere(userIds, "u.id")); } diff --git a/src/main/java/org/avniproject/etl/repository/ReportRepository.java b/src/main/java/org/avniproject/etl/repository/ReportRepository.java index a2121683..f05cf859 100644 --- a/src/main/java/org/avniproject/etl/repository/ReportRepository.java +++ b/src/main/java/org/avniproject/etl/repository/ReportRepository.java @@ -1,6 +1,7 @@ package org.avniproject.etl.repository; import org.avniproject.etl.domain.NullObject; +import org.avniproject.etl.domain.OrgIdentityContextHolder; import org.avniproject.etl.domain.metadata.SchemaMetadata; import org.avniproject.etl.dto.AggregateReportResult; import org.avniproject.etl.dto.UserActivityDTO; @@ -28,12 +29,12 @@ public ReportRepository(NamedParameterJdbcTemplate namedJdbcTemplate, SchemaMeta this.jdbcTemplate = jdbcTemplate; } - public List generateSummaryTable(String orgSchemaName){ + public List generateSummaryTable(){ String baseQuery = "select name, type \n" + "from public.table_metadata\n" + "where schema_name = '${schemaName}'\n" + "order by type;"; - String query= baseQuery.replace("${schemaName}", orgSchemaName); + String query= baseQuery.replace("${schemaName}", OrgIdentityContextHolder.getDbSchema()); runInOrgContext(() -> { jdbcTemplate.execute(query); @@ -43,7 +44,7 @@ public List generateSummaryTable(String orgSchemaName){ return namedJdbcTemplate.query(query, new SummaryTableMapper()); } - public List generateUserActivity(String orgSchemaName, String subjectWhere, String encounterWhere, String enrolmentWhere, String userWhere) { + public List generateUserActivity(String subjectWhere, String encounterWhere, String enrolmentWhere, String userWhere) { SchemaMetadata schema = schemaMetadataRepository.getExistingSchemaMetadata(); List subjectTableNames = schema.getAllSubjectTableNames().stream().toList(); List encounterTableNames = schema.getAllEncounterTableNames().stream().toList(); @@ -142,7 +143,7 @@ public List generateUserActivity(String orgSchemaName, String s .add("encounterTableNames", encounterTableNames) .add("programEnrolmentTableNames", programEnrolmentTableNames) .add("programEncounterTableNames", programEncounterTableNames); - String query = baseQuery.render().replace("$schemaName", orgSchemaName) + String query = baseQuery.render().replace("$schemaName", OrgIdentityContextHolder.getDbSchema()) .replace("$subjectWhere", subjectWhere) .replace("$encounterWhere", encounterWhere) .replace("$enrolmentWhere", enrolmentWhere) @@ -156,7 +157,7 @@ public List generateUserActivity(String orgSchemaName, String s return namedJdbcTemplate.query(query, new UserActivityMapper()); } - public List generateUserSyncFailures(String orgSchemaName, String syncTelemetryWhere, String userWhere) { + public List generateUserSyncFailures(String syncTelemetryWhere, String userWhere) { String baseQuery = "select coalesce(u.name, u.username) as name, \n" + " count(*) as count\n" + "from ${schemaName}.sync_telemetry st\n" + @@ -170,7 +171,7 @@ public List generateUserSyncFailures(String orgSchemaName, Stri "order by 2 desc\n" + "limit 10;"; String query = baseQuery - .replace("${schemaName}", orgSchemaName) + .replace("${schemaName}", OrgIdentityContextHolder.getDbSchema()) .replace("${syncTelemetryWhere}", syncTelemetryWhere) .replace("${userWhere}", userWhere); @@ -182,7 +183,7 @@ public List generateUserSyncFailures(String orgSchemaName, Stri return namedJdbcTemplate.query(query, new UserCountMapper()); } - public List generateUserAppVersions(String orgSchemaName, String userWhere) { + public List generateUserAppVersions(String userWhere) { String baseQuery = "select app_version as indicator,\n" + " count(*) as count\n" + "from ${schemaName}.users u\n" + @@ -195,7 +196,7 @@ public List generateUserAppVersions(String orgSchemaName, "${userWhere}\n"+ "group by app_version;"; String query = baseQuery - .replace("${schemaName}", orgSchemaName) + .replace("${schemaName}", OrgIdentityContextHolder.getDbSchema()) .replace("${userWhere}", userWhere); runInOrgContext(() -> { @@ -206,7 +207,7 @@ public List generateUserAppVersions(String orgSchemaName, return namedJdbcTemplate.query(query, new AggregateReportMapper()); } - public List generateUserDeviceModels(String orgSchemaName, String userWhere) { + public List generateUserDeviceModels(String userWhere) { String baseQuery = "select device_model as indicator,\n" + " count(*) as count\n" + "from ${schemaName}.users u\n" + @@ -219,7 +220,7 @@ public List generateUserDeviceModels(String orgSchemaName "${userWhere}\n"+ "group by device_model;"; String query = baseQuery - .replace("${schemaName}", orgSchemaName) + .replace("${schemaName}", OrgIdentityContextHolder.getDbSchema()) .replace("${userWhere}", userWhere); runInOrgContext(() -> { @@ -230,7 +231,7 @@ public List generateUserDeviceModels(String orgSchemaName return namedJdbcTemplate.query(query, new AggregateReportMapper()); } - public List generateUserDetails(String orgSchemaName, String userWhere) { + public List generateUserDetails(String userWhere) { String baseQuery = "select coalesce(u.name, u.username) as name,\n" + " app_version,\n" + " device_model,\n" + @@ -249,7 +250,7 @@ public List generateUserDetails(String orgSchemaName, String us " ${userWhere}\n"+ "order by 1 desc;"; String query = baseQuery - .replace("${schemaName}", orgSchemaName) + .replace("${schemaName}", OrgIdentityContextHolder.getDbSchema()) .replace("${userWhere}", userWhere); runInOrgContext(() -> { @@ -260,7 +261,7 @@ public List generateUserDetails(String orgSchemaName, String us return namedJdbcTemplate.query(query, new UserDetailsMapper()); } - public List generateLatestSyncs(String orgSchemaName, String syncTelemetryWhere, String userWhere) { + public List generateLatestSyncs(String syncTelemetryWhere, String userWhere) { String baseQuery = "SELECT coalesce(u.name,u.username) as name, \n" + " android_version, app_version, device_name, sync_start_time, sync_end_time, sync_status, sync_source\n" + "FROM public.sync_telemetry st\n" + @@ -271,7 +272,7 @@ public List generateLatestSyncs(String orgSchemaName, String sy "order by 6 desc\n" + "limit 10;\n"; String query = baseQuery - .replace("${schemaName}", orgSchemaName) + .replace("${schemaName}", OrgIdentityContextHolder.getDbSchema()) .replace("${syncTelemetryWhere}", syncTelemetryWhere) .replace("${userWhere}", userWhere); @@ -283,7 +284,7 @@ public List generateLatestSyncs(String orgSchemaName, String sy return namedJdbcTemplate.query(query, new LatestSyncMapper()); } - public List generateMedianSync(String orgSchemaName, String syncTelemetryWhere) { + public List generateMedianSync(String syncTelemetryWhere) { String baseQuery = "with weeks as (\n" + " select day::date start_date, day::date+6 end_date\n" + " ${syncTelemetryWhere}\n" + @@ -296,7 +297,7 @@ public List generateMedianSync(String orgSchemaName, String syn "and st.sync_source = 'manual'\n" + "group by 1,2;"; String query = baseQuery - .replace("${schemaName}", orgSchemaName) + .replace("${schemaName}", OrgIdentityContextHolder.getDbSchema()) .replace("${syncTelemetryWhere}", syncTelemetryWhere); runInOrgContext(() -> { @@ -307,7 +308,7 @@ public List generateMedianSync(String orgSchemaName, String syn return namedJdbcTemplate.query(query, new MedianSyncMapper()); } - public List generateCompletedVisitsOnTimeByProportion(String proportionCondition, String orgSchemaName, String encounterWhere, String userWhere) { + public List generateCompletedVisitsOnTimeByProportion(String proportionCondition, String encounterWhere, String userWhere) { SchemaMetadata schema = schemaMetadataRepository.getExistingSchemaMetadata(); List encounterTableNames = schema.getAllEncounterTableNames().stream().toList(); List programEncounterTableNames = schema.getAllProgramEncounterTableNames().stream().toList(); @@ -372,7 +373,7 @@ public List generateCompletedVisitsOnTimeByProportion(Str baseQuery.add("programEncounterTableNames", programEncounterTableNames) .add("encounterTableNames", encounterTableNames); String query = baseQuery.render().replace("$proportion_condition", proportionCondition) - .replace("$schemaName", orgSchemaName) + .replace("$schemaName", OrgIdentityContextHolder.getDbSchema()) .replace("$encounterWhere", encounterWhere) .replace("$userWhere", userWhere); @@ -384,7 +385,7 @@ public List generateCompletedVisitsOnTimeByProportion(Str return namedJdbcTemplate.query(query, new AggregateReportMapper()); } - public List generateUserCancellingMostVisits(String orgSchemaName, String encounterWhere, String userWhere) { + public List generateUserCancellingMostVisits(String encounterWhere, String userWhere) { SchemaMetadata schema = schemaMetadataRepository.getExistingSchemaMetadata(); List encounterTableNames = schema.getAllEncounterTableNames().stream().toList(); List programEncounterTableNames = schema.getAllProgramEncounterTableNames().stream().toList(); @@ -442,7 +443,7 @@ public List generateUserCancellingMostVisits(String orgSc ); baseQuery.add("programEncounterTableNames", programEncounterTableNames) .add("encounterTableNames", encounterTableNames); - String query = baseQuery.render().replace("$schemaName", orgSchemaName) + String query = baseQuery.render().replace("$schemaName", OrgIdentityContextHolder.getDbSchema()) .replace("$encounterWhere", encounterWhere) .replace("$userWhere", userWhere); From abd284d413cb6f046f2aa2296090ebcae523c677 Mon Sep 17 00:00:00 2001 From: ak2502 Date: Sat, 16 Sep 2023 12:31:25 +0530 Subject: [PATCH 3/4] avniproject/avni-product#1334 | removed userIds from ReportController Signed-off-by: ak2502 --- .../etl/controller/ReportController.java | 29 ++++------- .../etl/repository/ReportRepository.java | 48 +++++++------------ 2 files changed, 25 insertions(+), 52 deletions(-) diff --git a/src/main/java/org/avniproject/etl/controller/ReportController.java b/src/main/java/org/avniproject/etl/controller/ReportController.java index 819a3f41..439fe931 100644 --- a/src/main/java/org/avniproject/etl/controller/ReportController.java +++ b/src/main/java/org/avniproject/etl/controller/ReportController.java @@ -36,9 +36,7 @@ public List getUserActivity(@RequestParam(value = "startDate", return reportRepository.generateUserActivity( reportUtil.getDateDynamicWhere(startDate, endDate, "registration_date"), reportUtil.getDateDynamicWhere(startDate, endDate, "encounter_date_time"), - reportUtil.getDateDynamicWhere(startDate, endDate, "enrolment_date_time"), - reportUtil.getDynamicUserWhere(userIds, "u.id") - ); + reportUtil.getDateDynamicWhere(startDate, endDate, "enrolment_date_time")); } @PreAuthorize("hasAnyAuthority('analytics_user')") @@ -47,8 +45,7 @@ public List getUserWiseSyncFailures(@RequestParam(value = "star @RequestParam(value = "endDate", required = false) String endDate, @RequestParam(value = "userIds", required = false, defaultValue = "") List userIds){ return reportRepository.generateUserSyncFailures( - reportUtil.getDateDynamicWhere(startDate, endDate, "st.sync_start_time"), - reportUtil.getDynamicUserWhere(userIds, "u.id") + reportUtil.getDateDynamicWhere(startDate, endDate, "st.sync_start_time") ); } @@ -56,24 +53,21 @@ public List getUserWiseSyncFailures(@RequestParam(value = "star @RequestMapping(value = "/report/hr/deviceModels", method = RequestMethod.GET) public List getUserWiseDeviceModels(@RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { - return reportRepository.generateUserDeviceModels( - reportUtil.getDynamicUserWhere(userIds, "u.id")); + return reportRepository.generateUserDeviceModels(); } @PreAuthorize("hasAnyAuthority('analytics_user')") @RequestMapping(value = "/report/hr/appVersions", method = RequestMethod.GET) public List getUserWiseAppVersions(@RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { - return reportRepository.generateUserAppVersions( - reportUtil.getDynamicUserWhere(userIds, "u.id")); + return reportRepository.generateUserAppVersions(); } @PreAuthorize("hasAnyAuthority('analytics_user')") @RequestMapping(value = "/report/hr/userDetails", method = RequestMethod.GET) public List getUserDetails(@RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { - return reportRepository.generateUserDetails( - reportUtil.getDynamicUserWhere(userIds, "u.id")); + return reportRepository.generateUserDetails(); } @PreAuthorize("hasAnyAuthority('analytics_user')") @@ -83,8 +77,7 @@ public List getLatestSyncs(@RequestParam(value = "startDate", r @RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { return reportRepository.generateLatestSyncs( - reportUtil.getDateDynamicWhere(startDate, endDate, "st.sync_end_time"), - reportUtil.getDynamicUserWhere(userIds, "u.id")); + reportUtil.getDateDynamicWhere(startDate, endDate, "st.sync_end_time")); } @PreAuthorize("hasAnyAuthority('analytics_user')") @@ -104,8 +97,7 @@ public List getChampionUsers(@RequestParam(value = "start @RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { return reportRepository.generateCompletedVisitsOnTimeByProportion( ">= 0.5", - reportUtil.getDateDynamicWhere(startDate, endDate, "encounter_date_time"), - reportUtil.getDynamicUserWhere(userIds, "u.id")); + reportUtil.getDateDynamicWhere(startDate, endDate, "encounter_date_time")); } @PreAuthorize("hasAnyAuthority('analytics_user')") @@ -115,9 +107,7 @@ public List getNonPerformingUsers(@RequestParam(value = " @RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { return reportRepository.generateCompletedVisitsOnTimeByProportion( "<= 0.5", - reportUtil.getDateDynamicWhere(startDate, endDate, "encounter_date_time"), - reportUtil.getDynamicUserWhere(userIds, "u.id") - ); + reportUtil.getDateDynamicWhere(startDate, endDate, "encounter_date_time")); } @PreAuthorize("hasAnyAuthority('analytics_user')") @@ -126,8 +116,7 @@ public List getUsersCancellingMostVisits(@RequestParam(va @RequestParam(value = "endDate", required = false) String endDate, @RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { return reportRepository.generateUserCancellingMostVisits( - reportUtil.getDateDynamicWhere(startDate, endDate, "encounter_date_time"), - reportUtil.getDynamicUserWhere(userIds, "u.id")); + reportUtil.getDateDynamicWhere(startDate, endDate, "encounter_date_time")); } diff --git a/src/main/java/org/avniproject/etl/repository/ReportRepository.java b/src/main/java/org/avniproject/etl/repository/ReportRepository.java index f05cf859..0b98631f 100644 --- a/src/main/java/org/avniproject/etl/repository/ReportRepository.java +++ b/src/main/java/org/avniproject/etl/repository/ReportRepository.java @@ -44,7 +44,7 @@ public List generateSummaryTable(){ return namedJdbcTemplate.query(query, new SummaryTableMapper()); } - public List generateUserActivity(String subjectWhere, String encounterWhere, String enrolmentWhere, String userWhere) { + public List generateUserActivity(String subjectWhere, String encounterWhere, String enrolmentWhere) { SchemaMetadata schema = schemaMetadataRepository.getExistingSchemaMetadata(); List subjectTableNames = schema.getAllSubjectTableNames().stream().toList(); List encounterTableNames = schema.getAllEncounterTableNames().stream().toList(); @@ -122,7 +122,6 @@ public List generateUserActivity(String subjectWhere, String en " where (u.is_voided = false or u.is_voided isnull) and u.organisation_id notnull\n" + " and coalesce(coalesce(registration_count, 0) + coalesce(encounter_count, 0) + coalesce(enrolment_count, 0) +\n" + " coalesce(program_encounter_count, 0), 0) > 0\n" + - " $userWhere \n" + "),\n" + "final_table as (\n" + " select id, name,\n"+ @@ -146,8 +145,7 @@ public List generateUserActivity(String subjectWhere, String en String query = baseQuery.render().replace("$schemaName", OrgIdentityContextHolder.getDbSchema()) .replace("$subjectWhere", subjectWhere) .replace("$encounterWhere", encounterWhere) - .replace("$enrolmentWhere", enrolmentWhere) - .replace("$userWhere", userWhere); + .replace("$enrolmentWhere", enrolmentWhere); runInOrgContext(() -> { jdbcTemplate.execute(query); @@ -157,7 +155,7 @@ public List generateUserActivity(String subjectWhere, String en return namedJdbcTemplate.query(query, new UserActivityMapper()); } - public List generateUserSyncFailures(String syncTelemetryWhere, String userWhere) { + public List generateUserSyncFailures(String syncTelemetryWhere) { String baseQuery = "select coalesce(u.name, u.username) as name, \n" + " count(*) as count\n" + "from ${schemaName}.sync_telemetry st\n" + @@ -166,14 +164,12 @@ public List generateUserSyncFailures(String syncTelemetryWhere, "and (u.is_voided = false or u.is_voided isnull)\n" + "and u.organisation_id notnull\n" + "${syncTelemetryWhere}\n"+ - "${userWhere}\n"+ "group by 1\n" + "order by 2 desc\n" + "limit 10;"; String query = baseQuery .replace("${schemaName}", OrgIdentityContextHolder.getDbSchema()) - .replace("${syncTelemetryWhere}", syncTelemetryWhere) - .replace("${userWhere}", userWhere); + .replace("${syncTelemetryWhere}", syncTelemetryWhere); runInOrgContext(() -> { jdbcTemplate.execute(query); @@ -183,7 +179,7 @@ public List generateUserSyncFailures(String syncTelemetryWhere, return namedJdbcTemplate.query(query, new UserCountMapper()); } - public List generateUserAppVersions(String userWhere) { + public List generateUserAppVersions() { String baseQuery = "select app_version as indicator,\n" + " count(*) as count\n" + "from ${schemaName}.users u\n" + @@ -193,11 +189,9 @@ public List generateUserAppVersions(String userWhere) { " row_number() over (partition by user_id order by sync_start_time desc ) as rn\n" + " from ${schemaName}.sync_telemetry) l on l.user_id = u.id and rn = 1\n" + "where (u.is_voided = false or u.is_voided isnull) and u.organisation_id notnull\n" + - "${userWhere}\n"+ "group by app_version;"; String query = baseQuery - .replace("${schemaName}", OrgIdentityContextHolder.getDbSchema()) - .replace("${userWhere}", userWhere); + .replace("${schemaName}", OrgIdentityContextHolder.getDbSchema()); runInOrgContext(() -> { jdbcTemplate.execute(query); @@ -207,7 +201,7 @@ public List generateUserAppVersions(String userWhere) { return namedJdbcTemplate.query(query, new AggregateReportMapper()); } - public List generateUserDeviceModels(String userWhere) { + public List generateUserDeviceModels() { String baseQuery = "select device_model as indicator,\n" + " count(*) as count\n" + "from ${schemaName}.users u\n" + @@ -217,11 +211,9 @@ public List generateUserDeviceModels(String userWhere) { " row_number() over (partition by user_id order by sync_start_time desc ) as rn\n" + " from ${schemaName}.sync_telemetry) l on l.user_id = u.id and rn = 1\n" + "where (u.is_voided = false or u.is_voided isnull) and u.organisation_id notnull \n" + - "${userWhere}\n"+ "group by device_model;"; String query = baseQuery - .replace("${schemaName}", OrgIdentityContextHolder.getDbSchema()) - .replace("${userWhere}", userWhere); + .replace("${schemaName}", OrgIdentityContextHolder.getDbSchema()); runInOrgContext(() -> { jdbcTemplate.execute(query); @@ -231,7 +223,7 @@ public List generateUserDeviceModels(String userWhere) { return namedJdbcTemplate.query(query, new AggregateReportMapper()); } - public List generateUserDetails(String userWhere) { + public List generateUserDetails() { String baseQuery = "select coalesce(u.name, u.username) as name,\n" + " app_version,\n" + " device_model,\n" + @@ -247,11 +239,9 @@ public List generateUserDetails(String userWhere) { " where sync_status = 'complete') l on l.user_id = u.id and rn = 1\n" + "where (u.is_voided = false or u.is_voided isnull)\n" + " and u.organisation_id notnull\n" + - " ${userWhere}\n"+ "order by 1 desc;"; String query = baseQuery - .replace("${schemaName}", OrgIdentityContextHolder.getDbSchema()) - .replace("${userWhere}", userWhere); + .replace("${schemaName}", OrgIdentityContextHolder.getDbSchema()); runInOrgContext(() -> { jdbcTemplate.execute(query); @@ -261,20 +251,18 @@ public List generateUserDetails(String userWhere) { return namedJdbcTemplate.query(query, new UserDetailsMapper()); } - public List generateLatestSyncs(String syncTelemetryWhere, String userWhere) { + public List generateLatestSyncs(String syncTelemetryWhere) { String baseQuery = "SELECT coalesce(u.name,u.username) as name, \n" + " android_version, app_version, device_name, sync_start_time, sync_end_time, sync_status, sync_source\n" + "FROM public.sync_telemetry st\n" + "join ${schemaName}.users u on st.last_modified_by_id = u.id\n" + "where (u.is_voided = false or u.is_voided isnull) and u.organisation_id notnull\n" + "${syncTelemetryWhere}\n"+ - "${userWhere}\n"+ "order by 6 desc\n" + "limit 10;\n"; String query = baseQuery .replace("${schemaName}", OrgIdentityContextHolder.getDbSchema()) - .replace("${syncTelemetryWhere}", syncTelemetryWhere) - .replace("${userWhere}", userWhere); + .replace("${syncTelemetryWhere}", syncTelemetryWhere); runInOrgContext(() -> { jdbcTemplate.execute(query); @@ -308,7 +296,7 @@ public List generateMedianSync(String syncTelemetryWhere) { return namedJdbcTemplate.query(query, new MedianSyncMapper()); } - public List generateCompletedVisitsOnTimeByProportion(String proportionCondition, String encounterWhere, String userWhere) { + public List generateCompletedVisitsOnTimeByProportion(String proportionCondition, String encounterWhere) { SchemaMetadata schema = schemaMetadataRepository.getExistingSchemaMetadata(); List encounterTableNames = schema.getAllEncounterTableNames().stream().toList(); List programEncounterTableNames = schema.getAllProgramEncounterTableNames().stream().toList(); @@ -360,7 +348,6 @@ public List generateCompletedVisitsOnTimeByProportion(Str " left join program_enc_data ped on ped.last_modified_by_id = u.id\n" + " where u.organisation_id notnull\n" + " and (is_voided = false or is_voided isnull)\n" + - " $userWhere\n" + " group by u.name, u.username \n" + ")\n" + "select indicator,\n" + @@ -374,8 +361,7 @@ public List generateCompletedVisitsOnTimeByProportion(Str .add("encounterTableNames", encounterTableNames); String query = baseQuery.render().replace("$proportion_condition", proportionCondition) .replace("$schemaName", OrgIdentityContextHolder.getDbSchema()) - .replace("$encounterWhere", encounterWhere) - .replace("$userWhere", userWhere); + .replace("$encounterWhere", encounterWhere); runInOrgContext(() -> { jdbcTemplate.execute(query); @@ -385,7 +371,7 @@ public List generateCompletedVisitsOnTimeByProportion(Str return namedJdbcTemplate.query(query, new AggregateReportMapper()); } - public List generateUserCancellingMostVisits(String encounterWhere, String userWhere) { + public List generateUserCancellingMostVisits(String encounterWhere) { SchemaMetadata schema = schemaMetadataRepository.getExistingSchemaMetadata(); List encounterTableNames = schema.getAllEncounterTableNames().stream().toList(); List programEncounterTableNames = schema.getAllProgramEncounterTableNames().stream().toList(); @@ -432,7 +418,6 @@ public List generateUserCancellingMostVisits(String encou "where u.organisation_id notnull\n" + " and (is_voided = false or is_voided isnull)\n" + " and coalesce(ged.cancelled_visits, 0) + coalesce(ped.cancelled_visits, 0) > 0 \n" + - " $userWhere\n" + " group by u.name,u.username \n" + ")\n" + "select indicator,\n" + @@ -444,8 +429,7 @@ public List generateUserCancellingMostVisits(String encou baseQuery.add("programEncounterTableNames", programEncounterTableNames) .add("encounterTableNames", encounterTableNames); String query = baseQuery.render().replace("$schemaName", OrgIdentityContextHolder.getDbSchema()) - .replace("$encounterWhere", encounterWhere) - .replace("$userWhere", userWhere); + .replace("$encounterWhere", encounterWhere); runInOrgContext(() -> { jdbcTemplate.execute(query); From 2a03014d8bce6597939c298ac2d86539f4cd468c Mon Sep 17 00:00:00 2001 From: ak2502 Date: Sat, 16 Sep 2023 12:40:25 +0530 Subject: [PATCH 4/4] avniproject/avni-product#1334 | removed userIds from ReportController Signed-off-by: ak2502 --- .../etl/controller/ReportController.java | 27 +++++++------------ 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/avniproject/etl/controller/ReportController.java b/src/main/java/org/avniproject/etl/controller/ReportController.java index 439fe931..05c68d22 100644 --- a/src/main/java/org/avniproject/etl/controller/ReportController.java +++ b/src/main/java/org/avniproject/etl/controller/ReportController.java @@ -31,8 +31,7 @@ public List getSummaryTable(){ @PreAuthorize("hasAnyAuthority('analytics_user')") @RequestMapping(value = "report/hr/userActivity", method = RequestMethod.GET) public List getUserActivity(@RequestParam(value = "startDate", required = false) String startDate, - @RequestParam(value = "endDate", required = false) String endDate, - @RequestParam(value = "userIds", required = false, defaultValue = "") List userIds){ + @RequestParam(value = "endDate", required = false) String endDate){ return reportRepository.generateUserActivity( reportUtil.getDateDynamicWhere(startDate, endDate, "registration_date"), reportUtil.getDateDynamicWhere(startDate, endDate, "encounter_date_time"), @@ -42,8 +41,7 @@ public List getUserActivity(@RequestParam(value = "startDate", @PreAuthorize("hasAnyAuthority('analytics_user')") @RequestMapping(value = "/report/hr/syncFailures",method = RequestMethod.GET) public List getUserWiseSyncFailures(@RequestParam(value = "startDate", required = false) String startDate, - @RequestParam(value = "endDate", required = false) String endDate, - @RequestParam(value = "userIds", required = false, defaultValue = "") List userIds){ + @RequestParam(value = "endDate", required = false) String endDate){ return reportRepository.generateUserSyncFailures( reportUtil.getDateDynamicWhere(startDate, endDate, "st.sync_start_time") ); @@ -51,21 +49,21 @@ public List getUserWiseSyncFailures(@RequestParam(value = "star @PreAuthorize("hasAnyAuthority('analytics_user')") @RequestMapping(value = "/report/hr/deviceModels", method = RequestMethod.GET) - public List getUserWiseDeviceModels(@RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { + public List getUserWiseDeviceModels() { return reportRepository.generateUserDeviceModels(); } @PreAuthorize("hasAnyAuthority('analytics_user')") @RequestMapping(value = "/report/hr/appVersions", method = RequestMethod.GET) - public List getUserWiseAppVersions(@RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { + public List getUserWiseAppVersions() { return reportRepository.generateUserAppVersions(); } @PreAuthorize("hasAnyAuthority('analytics_user')") @RequestMapping(value = "/report/hr/userDetails", method = RequestMethod.GET) - public List getUserDetails(@RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { + public List getUserDetails() { return reportRepository.generateUserDetails(); } @@ -73,8 +71,7 @@ public List getUserDetails(@RequestParam(value = "userIds", req @PreAuthorize("hasAnyAuthority('analytics_user')") @RequestMapping(value = "/report/hr/latestSyncs", method = RequestMethod.GET) public List getLatestSyncs(@RequestParam(value = "startDate", required = false) String startDate, - @RequestParam(value = "endDate", required = false) String endDate, - @RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { + @RequestParam(value = "endDate", required = false) String endDate) { return reportRepository.generateLatestSyncs( reportUtil.getDateDynamicWhere(startDate, endDate, "st.sync_end_time")); @@ -83,8 +80,7 @@ public List getLatestSyncs(@RequestParam(value = "startDate", r @PreAuthorize("hasAnyAuthority('analytics_user')") @RequestMapping(value = "/report/hr/medianSync", method = RequestMethod.GET) public List getMedianSync(@RequestParam(value = "startDate", required = false) String startDate, - @RequestParam(value = "endDate", required = false) String endDate, - @RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { + @RequestParam(value = "endDate", required = false) String endDate) { return reportRepository.generateMedianSync( reportUtil.getDateSeries(startDate, endDate)); @@ -93,8 +89,7 @@ public List getMedianSync(@RequestParam(value = "startDate", re @PreAuthorize("hasAnyAuthority('analytics_user')") @RequestMapping(value = "/report/hr/championUsers", method = RequestMethod.GET) public List getChampionUsers(@RequestParam(value = "startDate", required = false) String startDate, - @RequestParam(value = "endDate", required = false) String endDate, - @RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { + @RequestParam(value = "endDate", required = false) String endDate) { return reportRepository.generateCompletedVisitsOnTimeByProportion( ">= 0.5", reportUtil.getDateDynamicWhere(startDate, endDate, "encounter_date_time")); @@ -103,8 +98,7 @@ public List getChampionUsers(@RequestParam(value = "start @PreAuthorize("hasAnyAuthority('analytics_user')") @RequestMapping(value = "/report/hr/nonPerformingUsers", method = RequestMethod.GET) public List getNonPerformingUsers(@RequestParam(value = "startDate", required = false) String startDate, - @RequestParam(value = "endDate", required = false) String endDate, - @RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { + @RequestParam(value = "endDate", required = false) String endDate) { return reportRepository.generateCompletedVisitsOnTimeByProportion( "<= 0.5", reportUtil.getDateDynamicWhere(startDate, endDate, "encounter_date_time")); @@ -113,8 +107,7 @@ public List getNonPerformingUsers(@RequestParam(value = " @PreAuthorize("hasAnyAuthority('analytics_user')") @RequestMapping(value = "/report/hr/mostCancelled", method = RequestMethod.GET) public List getUsersCancellingMostVisits(@RequestParam(value = "startDate", required = false) String startDate, - @RequestParam(value = "endDate", required = false) String endDate, - @RequestParam(value = "userIds", required = false, defaultValue = "") List userIds) { + @RequestParam(value = "endDate", required = false) String endDate) { return reportRepository.generateUserCancellingMostVisits( reportUtil.getDateDynamicWhere(startDate, endDate, "encounter_date_time")); }