Skip to content

Commit

Permalink
#850 | Refactor CustomQuestions generation functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
himeshr committed Jan 17, 2025
1 parent 0332a7e commit 8dc3d4a
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<FilterCondition> 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<FilterCondition> getFilterConditions(List<FilterCondition> additionalFilterConditions, Database database, QuestionName question) {
return ImmutableList.<FilterCondition>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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -191,44 +191,46 @@ 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();

}

public void updateGlobalDashboardWithCustomQuestions() {
List<Dashcard> 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<Dashcard> 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<ParameterMapping> createDashcardParameterMappingForFirstDashcard(){
List<ParameterMapping> 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<ParameterMapping> createDashcardParameterMappingForSecondDashcard(){
List<ParameterMapping> 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;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}
}

0 comments on commit 8dc3d4a

Please sign in to comment.