diff --git a/avni-server-api/src/main/java/org/avni/server/dao/metabase/QuestionRepository.java b/avni-server-api/src/main/java/org/avni/server/dao/metabase/QuestionRepository.java index baa342981..807617081 100644 --- a/avni-server-api/src/main/java/org/avni/server/dao/metabase/QuestionRepository.java +++ b/avni-server-api/src/main/java/org/avni/server/dao/metabase/QuestionRepository.java @@ -3,55 +3,45 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; -import org.springframework.boot.web.client.RestTemplateBuilder; +import com.google.common.collect.ImmutableList; import org.avni.server.domain.metabase.*; import org.avni.server.util.ObjectMapperSingleton; +import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public class QuestionRepository extends MetabaseConnector { + public static final String IS_VOIDED = "is_voided"; + private final DatabaseRepository databaseRepository; - public QuestionRepository(RestTemplateBuilder restTemplateBuilder , DatabaseRepository databaseRepository) { + public QuestionRepository(RestTemplateBuilder restTemplateBuilder, DatabaseRepository databaseRepository) { super(restTemplateBuilder); this.databaseRepository = databaseRepository; } - public void createSubjectTypeIndividualQuestion(Database database) { + public void createCustomQuestionOfVisualization(Database database, QuestionName question, VisualizationType visualizationType, List additionalFilterConditions) { QuestionConfig config = new QuestionConfig() .withAggregation(AggregationType.COUNT) - .withBreakout("name", "subject_type_id") - .withFilters( - new FilterCondition(ConditionType.EQUAL, databaseRepository.getFieldDetailsByName(database, new TableDetails("individual"), new FieldDetails("is_voided")).getId() , FieldType.BOOLEAN.getTypeName(), false), - new FilterCondition(ConditionType.EQUAL, databaseRepository.getFieldDetailsByName(database, new TableDetails("subject_type"), new FieldDetails("is_voided")).getId() , FieldType.BOOLEAN.getTypeName(), false,databaseRepository.getFieldDetailsByName(database, new TableDetails("individual"), new FieldDetails("subject_type_id")).getId()) - ) - .withVisualization(VisualizationType.PIE); - MetabaseQuery query = createAdvancedQuery("individual", "subject_type", config, database); + .withBreakout(question.getBreakoutField(), question.getPrimaryField()) + .withFilters(getFilterConditions(additionalFilterConditions, database, question).toArray(FilterCondition[]::new)) + .withVisualization(visualizationType); + MetabaseQuery query = createAdvancedQuery(question.getPrimaryTableName(), question.getSecondaryTableName(), config, database); postQuestion( - QuestionName.QUESTION_1.getQuestionName(), + question.getQuestionName(), query, config, databaseRepository.getCollectionForDatabase(database).getIdAsInt() ); } - public void createProgramEnrollmentsQuestion(Database database) { - QuestionConfig config = new QuestionConfig() - .withAggregation(AggregationType.COUNT) - .withBreakout("name", "program_id") - .withFilters( - new FilterCondition(ConditionType.EQUAL, databaseRepository.getFieldDetailsByName(database, new TableDetails("program_enrolment"), new FieldDetails("is_voided")).getId() , FieldType.BOOLEAN.getTypeName(), false), - new FilterCondition(ConditionType.IS_NULL, databaseRepository.getFieldDetailsByName(database, new TableDetails("program_enrolment"), new FieldDetails("program_exit_date_time")).getId() , FieldType.DATE_TIME_WITH_LOCAL_TZ.getTypeName(),null), - new FilterCondition(ConditionType.EQUAL, databaseRepository.getFieldDetailsByName(database, new TableDetails("program"), new FieldDetails("is_voided")).getId() , FieldType.BOOLEAN.getTypeName(), false,databaseRepository.getFieldDetailsByName(database, new TableDetails("program_enrolment"), new FieldDetails("program_id")).getId()) - ) - .withVisualization(VisualizationType.PIE); - MetabaseQuery query = createAdvancedQuery("program_enrolment", "program", config, database); - postQuestion( - QuestionName.QUESTION_2.getQuestionName(), - query, - config, - databaseRepository.getCollectionForDatabase(database).getIdAsInt() - ); + private List getFilterConditions(List additionalFilterConditions, Database database, QuestionName question) { + return ImmutableList.builder() + .addAll(List.of(new FilterCondition(ConditionType.EQUAL, databaseRepository.getFieldDetailsByName(database, new TableDetails(question.getPrimaryTableName()), new FieldDetails(IS_VOIDED)).getId(), FieldType.BOOLEAN.getTypeName(), false), + new FilterCondition(ConditionType.EQUAL, databaseRepository.getFieldDetailsByName(database, new TableDetails(question.getSecondaryTableName()), new FieldDetails(IS_VOIDED)).getId(), FieldType.BOOLEAN.getTypeName(), false, databaseRepository.getFieldDetailsByName(database, new TableDetails(question.getPrimaryTableName()), new FieldDetails(question.getPrimaryField())).getId()))) + .addAll(additionalFilterConditions).build(); } private void postQuestion(String questionName, MetabaseQuery query, QuestionConfig config, int collectionId) { diff --git a/avni-server-api/src/main/java/org/avni/server/service/metabase/DatabaseService.java b/avni-server-api/src/main/java/org/avni/server/service/metabase/DatabaseService.java index a6d7a0f5b..00dcb0685 100644 --- a/avni-server-api/src/main/java/org/avni/server/service/metabase/DatabaseService.java +++ b/avni-server-api/src/main/java/org/avni/server/service/metabase/DatabaseService.java @@ -1,8 +1,8 @@ package org.avni.server.service.metabase; import org.avni.server.dao.metabase.CollectionRepository; -import org.avni.server.dao.metabase.MetabaseDashboardRepository; import org.avni.server.dao.metabase.DatabaseRepository; +import org.avni.server.dao.metabase.MetabaseDashboardRepository; import org.avni.server.dao.metabase.QuestionRepository; import org.avni.server.domain.metabase.*; import org.springframework.beans.factory.annotation.Autowired; @@ -191,12 +191,14 @@ private void createQuestionsForIndividualTables() { private void createCustomQuestions() { ensureSyncComplete(); Database database = getGlobalDatabase(); - if (isQuestionMissing(QuestionName.QUESTION_1.getQuestionName())) { - questionRepository.createSubjectTypeIndividualQuestion(database); + if (isQuestionMissing(QuestionName.NonVoidedIndividual.getQuestionName())) { + questionRepository.createCustomQuestionOfVisualization(database, QuestionName.NonVoidedIndividual, VisualizationType.PIE, Collections.EMPTY_LIST); } - - if (isQuestionMissing(QuestionName.QUESTION_2.getQuestionName())) { - questionRepository.createProgramEnrollmentsQuestion(database); + if (isQuestionMissing(QuestionName.NonExitedNonVoidedProgram.getQuestionName())) { + FilterCondition additionalFilterCondition = new FilterCondition(ConditionType.IS_NULL, + databaseRepository.getFieldDetailsByName(database, new TableDetails(QuestionName.NonExitedNonVoidedProgram.getPrimaryTableName()), + new FieldDetails("program_exit_date_time")).getId(), FieldType.DATE_TIME_WITH_LOCAL_TZ.getTypeName(), null); + questionRepository.createCustomQuestionOfVisualization(database, QuestionName.NonExitedNonVoidedProgram, VisualizationType.PIE, Arrays.asList(additionalFilterCondition)); } updateGlobalDashboardWithCustomQuestions(); @@ -204,31 +206,31 @@ private void createCustomQuestions() { public void updateGlobalDashboardWithCustomQuestions() { List dashcards = new ArrayList<>(); - dashcards.add(new Dashcard(-1, getCardIdByQuestionName(QuestionName.QUESTION_1.getQuestionName()), null, 0, 0, 12, 8)); - dashcards.add(new Dashcard(-2, getCardIdByQuestionName(QuestionName.QUESTION_2.getQuestionName()), null, 0, 12, 12, 8)); + dashcards.add(new Dashcard(-1, getCardIdByQuestionName(QuestionName.NonVoidedIndividual.getQuestionName()), null, 0, 0, 12, 8)); + dashcards.add(new Dashcard(-2, getCardIdByQuestionName(QuestionName.NonExitedNonVoidedProgram.getQuestionName()), null, 0, 12, 12, 8)); metabaseDashboardRepository.updateDashboard(getGlobalDashboard().getId(), new DashboardUpdateRequest(dashcards)); addFilterToDashboard(); } - private void addFilterToDashboard(){ + private void addFilterToDashboard() { List updateDashcards = new ArrayList<>(); - updateDashcards.add(new Dashcard(-1,getCardIdByQuestionName(QuestionName.QUESTION_1.getQuestionName()), null, 0, 0, 12, 8, Collections.emptyMap(),createDashcardParameterMappingForFirstDashcard())); - updateDashcards.add(new Dashcard(-2,getCardIdByQuestionName(QuestionName.QUESTION_2.getQuestionName()), null, 0, 12, 12, 8, Collections.emptyMap(),createDashcardParameterMappingForSecondDashcard())); - metabaseDashboardRepository.updateDashboard(getGlobalDashboard().getId(),new DashboardUpdateRequest(updateDashcards,createParametersForDashboard())); + updateDashcards.add(new Dashcard(-1, getCardIdByQuestionName(QuestionName.NonVoidedIndividual.getQuestionName()), null, 0, 0, 12, 8, Collections.emptyMap(), createDashcardParameterMappingForFirstDashcard())); + updateDashcards.add(new Dashcard(-2, getCardIdByQuestionName(QuestionName.NonExitedNonVoidedProgram.getQuestionName()), null, 0, 12, 12, 8, Collections.emptyMap(), createDashcardParameterMappingForSecondDashcard())); + metabaseDashboardRepository.updateDashboard(getGlobalDashboard().getId(), new DashboardUpdateRequest(updateDashcards, createParametersForDashboard())); } private List createDashcardParameterMappingForFirstDashcard(){ List firstDashcardParameterMapping = new ArrayList<>(); - firstDashcardParameterMapping.add(new ParameterMapping("dateTimeId",getCardIdByQuestionName(QuestionName.QUESTION_1.getQuestionName()),new Target(MetabaseTargetType.DIMENSION,new FieldTarget(getFieldId(new TableDetails(TableName.INDIVIDUAL.getName()),new FieldDetails(FieldName.REGISTRATION_DATE.getName())),FieldType.DATE.getTypeName())))); + firstDashcardParameterMapping.add(new ParameterMapping("dateTimeId", getCardIdByQuestionName(QuestionName.NonVoidedIndividual.getQuestionName()), new Target(MetabaseTargetType.DIMENSION, new FieldTarget(getFieldId(new TableDetails(TableName.INDIVIDUAL.getName()), new FieldDetails(FieldName.REGISTRATION_DATE.getName())), FieldType.DATE.getTypeName())))); return firstDashcardParameterMapping; } private List createDashcardParameterMappingForSecondDashcard(){ List secondDashcardParameterMapping = new ArrayList<>(); - secondDashcardParameterMapping.add(new ParameterMapping("dateTimeId",getCardIdByQuestionName(QuestionName.QUESTION_2.getQuestionName()),new Target(MetabaseTargetType.DIMENSION,new FieldTarget(getFieldId(new TableDetails(TableName.PROGRAM_ENROLMENT.getName()),new FieldDetails(FieldName.ENROLMENT_DATE_TIME.getName())),FieldType.DATE_TIME_WITH_LOCAL_TZ.getTypeName())))); + secondDashcardParameterMapping.add(new ParameterMapping("dateTimeId", getCardIdByQuestionName(QuestionName.NonExitedNonVoidedProgram.getQuestionName()), new Target(MetabaseTargetType.DIMENSION, new FieldTarget(getFieldId(new TableDetails(TableName.PROGRAM_ENROLMENT.getName()), new FieldDetails(FieldName.ENROLMENT_DATE_TIME.getName())), FieldType.DATE_TIME_WITH_LOCAL_TZ.getTypeName())))); return secondDashcardParameterMapping; } diff --git a/avni-server-data/src/main/java/org/avni/server/domain/metabase/QuestionName.java b/avni-server-data/src/main/java/org/avni/server/domain/metabase/QuestionName.java index bc658609d..de8010167 100644 --- a/avni-server-data/src/main/java/org/avni/server/domain/metabase/QuestionName.java +++ b/avni-server-data/src/main/java/org/avni/server/domain/metabase/QuestionName.java @@ -1,16 +1,47 @@ package org.avni.server.domain.metabase; public enum QuestionName { - QUESTION_1("Pie Chart : Count of Non Voided Individuals - Non Voided Subject Type"), - QUESTION_2("Pie Chart : Number of Non exited and Non voided Enrollments for Non Voided Program"); + NonVoidedIndividual("Pie Chart : Count of Non Voided Individuals - Non Voided Subject Type", "individual", + "subject_type", + "subject_type_id", + "name"), + NonExitedNonVoidedProgram("Pie Chart : Number of Non exited and Non voided Enrolments for Non Voided Program", "program_enrolment", + "program", + "program_id", + "name"); private final String questionName; + private final String primaryTableName; + private final String secondaryTableName; + private final String primaryField; + private final String breakoutField; - QuestionName(String questionName) { + + QuestionName(String questionName, String primaryTableName, String secondaryTableName, String primaryField, String breakoutField) { this.questionName = questionName; + this.primaryTableName = primaryTableName; + this.secondaryTableName = secondaryTableName; + this.primaryField = primaryField; + this.breakoutField = breakoutField; } public String getQuestionName() { return questionName; } + + public String getPrimaryTableName() { + return primaryTableName; + } + + public String getSecondaryTableName() { + return secondaryTableName; + } + + public String getPrimaryField() { + return primaryField; + } + + public String getBreakoutField() { + return breakoutField; + } }