From 1ca4386b6f75ff99ea821453b6d547e7315d17eb Mon Sep 17 00:00:00 2001 From: Suhas Vishwanath Date: Wed, 12 Jul 2023 16:43:35 +0530 Subject: [PATCH] #29 | Vivek, Suhas | Checklist table creation WIP --- .../etl/domain/metadata/TableMetadata.java | 3 +- .../repository/SchemaMetadataRepository.java | 23 ++++++++++-- .../rowMappers/TableNameGenerator.java | 4 +-- .../tableMappers/ChecklistTable.java | 35 +++++++++++++++++++ .../sql/etl/checklist/checklistMetadata.sql | 9 +++++ 5 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/avniproject/etl/repository/rowMappers/tableMappers/ChecklistTable.java create mode 100644 src/main/resources/sql/etl/checklist/checklistMetadata.sql diff --git a/src/main/java/org/avniproject/etl/domain/metadata/TableMetadata.java b/src/main/java/org/avniproject/etl/domain/metadata/TableMetadata.java index 59a6de3..41619c3 100644 --- a/src/main/java/org/avniproject/etl/domain/metadata/TableMetadata.java +++ b/src/main/java/org/avniproject/etl/domain/metadata/TableMetadata.java @@ -248,7 +248,8 @@ public enum Type { ManualProgramEnrolmentEligibility, GroupToMember, HouseholdToMember, - RepeatableQuestionGroup + RepeatableQuestionGroup, + Checklist } public enum TableType { diff --git a/src/main/java/org/avniproject/etl/repository/SchemaMetadataRepository.java b/src/main/java/org/avniproject/etl/repository/SchemaMetadataRepository.java index d9538c6..85b93b4 100644 --- a/src/main/java/org/avniproject/etl/repository/SchemaMetadataRepository.java +++ b/src/main/java/org/avniproject/etl/repository/SchemaMetadataRepository.java @@ -10,6 +10,7 @@ import org.avniproject.etl.repository.rowMappers.MediaTableMetadataBuilder; import org.avniproject.etl.repository.rowMappers.TableMetadataMapper; import org.avniproject.etl.repository.rowMappers.tableMappers.AddressTable; +import org.avniproject.etl.repository.rowMappers.tableMappers.ChecklistTable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; @@ -45,6 +46,7 @@ public SchemaMetadata getNewSchemaMetadata() { tables.addAll(getGroupSubjectTables()); tables.addAll(getRepeatableQuestionGroupTables()); + //tables.addAll(getChecklistTables()); return new SchemaMetadata(tables); } @@ -72,7 +74,7 @@ private TableMetadata getAddressTable() { private List getRepeatableQuestionGroupTables() { String sqlFormat = readSqlFile("repeatableQG/repeatableQuestionGroups.sql"); String sql = format(sqlFormat, PLACEHOLDER_CONCEPT_UUID); - return getTableMetadata(sql); + return getTableMetadataForForm(sql); } private List getFormTables() { @@ -114,13 +116,28 @@ private List getFormTables() { " and (p.id is null or op.id is not null) and (et.id is null or oet.id is not null)" + " and nafe.id is null;", PLACEHOLDER_CONCEPT_UUID); - List tables = getTableMetadata(sql); + List tables = getTableMetadataForForm(sql); tables.forEach(this::addDecisionConceptColumns); tables.stream().filter(t -> !t.isSubjectTable()).forEach(this::addSyncAttributeColumns); return tables; } - private List getTableMetadata(String sql) { + private List getChecklistTables() { + String sql = readSqlFile("checklist/checklistMetadata.sql"); + List> checklistTypes = runInOrgContext(() -> jdbcTemplate.queryForList(sql), jdbcTemplate); + ChecklistTable checklistTable = new ChecklistTable(checklistTypes); + + Map tableDetails = checklistTypes.get(0); + + return checklistTypes.stream().map(x -> { + TableMetadata tableMetadata = new TableMetadata(); + tableMetadata.setName(checklistTable.name(tableDetails)); + tableMetadata.setType(TableMetadata.Type.Checklist); + return tableMetadata; + }).collect(Collectors.toList()); + } + + private List getTableMetadataForForm(String sql) { List> maps = runInOrgContext(() -> jdbcTemplate.queryForList(sql), jdbcTemplate); Map>> tableMaps = maps.stream().collect(Collectors.groupingBy(stringObjectMap -> stringObjectMap.get("form_mapping_uuid"))); return tableMaps.values().stream().map(mapList -> new TableMetadataMapper().create(mapList)).collect(Collectors.toList()); diff --git a/src/main/java/org/avniproject/etl/repository/rowMappers/TableNameGenerator.java b/src/main/java/org/avniproject/etl/repository/rowMappers/TableNameGenerator.java index 89acac8..376d654 100644 --- a/src/main/java/org/avniproject/etl/repository/rowMappers/TableNameGenerator.java +++ b/src/main/java/org/avniproject/etl/repository/rowMappers/TableNameGenerator.java @@ -12,7 +12,7 @@ public class TableNameGenerator { public static final String ProgramEnrolmentRepeatableQuestionGroup = "ProgramEnrolmentRepeatableQuestionGroup"; public static final String ProgramEncounterRepeatableQuestionGroup = "ProgramEncounterRepeatableQuestionGroup"; - private static final Map> tableTypeTrimmingMap = new HashMap<>() {{ + private static final Map> trims = new HashMap<>() {{ put("Registration", List.of(6)); put(RegistrationRepeatableQuestionGroup, List.of(6, 20)); put("Encounter", List.of(6, 20)); @@ -41,7 +41,7 @@ public String generateName(List entities, String tableType, String suffi } private String getTrimmedTableName(List entities, String tableType, String suffix) { - List trimmingList = tableTypeTrimmingMap.get(tableType); + List trimmingList = trims.get(tableType); List trimmedNameList = IntStream .range(0, entities.size()) .mapToObj(i -> getTrimmedName(entities, new StringBuilder(), trimmingList, i, suffix)) diff --git a/src/main/java/org/avniproject/etl/repository/rowMappers/tableMappers/ChecklistTable.java b/src/main/java/org/avniproject/etl/repository/rowMappers/tableMappers/ChecklistTable.java new file mode 100644 index 0000000..6395848 --- /dev/null +++ b/src/main/java/org/avniproject/etl/repository/rowMappers/tableMappers/ChecklistTable.java @@ -0,0 +1,35 @@ +package org.avniproject.etl.repository.rowMappers.tableMappers; + +import org.avniproject.etl.domain.metadata.Column; +import org.avniproject.etl.domain.metadata.ColumnMetadata; +import org.avniproject.etl.repository.rowMappers.ColumnMetadataMapper; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static java.lang.String.format; + +public class ChecklistTable extends Table { + private final List> checklistTypes; + + public ChecklistTable(List> checklistTypes) { + this.checklistTypes = checklistTypes; + } + + @Override + public String name(Map tableDetails) { + return generateTableName("checklist", "", tableDetails, "name"); + } + + @Override + public List columns() { + return new Columns() + .withIdColumn() + .withColumn(new Column("program_enrolment_id", Column.Type.integer, Column.ColumnType.index)) + .withColumn(new Column("base_date", Column.Type.date)) + .withCommonColumns() + .build(); + } +} diff --git a/src/main/resources/sql/etl/checklist/checklistMetadata.sql b/src/main/resources/sql/etl/checklist/checklistMetadata.sql new file mode 100644 index 0000000..25de370 --- /dev/null +++ b/src/main/resources/sql/etl/checklist/checklistMetadata.sql @@ -0,0 +1,9 @@ +select cd.name name, + program.name program_name, + st.name subject_type_name + from checklist_detail cd + join program on program.name = 'Child' + join form_mapping fm on fm.entity_id = program.id + join form f on fm.form_id = f.id + join subject_type st on st.id = fm.subject_type_id +where f.form_type = 'ProgramEnrolment'; \ No newline at end of file