diff --git a/avni-server-api/src/main/java/org/avni/server/dao/metabase/DatabaseRepository.java b/avni-server-api/src/main/java/org/avni/server/dao/metabase/DatabaseRepository.java index d8cd74566..f57e0d05b 100644 --- a/avni-server-api/src/main/java/org/avni/server/dao/metabase/DatabaseRepository.java +++ b/avni-server-api/src/main/java/org/avni/server/dao/metabase/DatabaseRepository.java @@ -88,7 +88,7 @@ public void createQuestionForTable(Database database, TableDetails tableDetails, postForObject(metabaseApiUrl + "/card", requestBody.toJson(objectMapper), JsonNode.class); } - public void createQuestionForIndividualTable(Database database, TableDetails tableDetails) { + public void createQuestionForASingleTable(Database database, TableDetails tableDetails) { MetabaseQuery query = new MetabaseQueryBuilder(database, objectMapper.createArrayNode(), objectMapper) .forTable(tableDetails) .build(); diff --git a/avni-server-api/src/main/java/org/avni/server/domain/metabase/CardType.java b/avni-server-api/src/main/java/org/avni/server/domain/metabase/CardType.java index 6afc67c28..2c45436ee 100644 --- a/avni-server-api/src/main/java/org/avni/server/domain/metabase/CardType.java +++ b/avni-server-api/src/main/java/org/avni/server/domain/metabase/CardType.java @@ -1,5 +1,6 @@ package org.avni.server.domain.metabase; +//Refer Documentation : https://www.metabase.com/docs/latest/api/card#post-apicard public enum CardType { QUESTION("question"); diff --git a/avni-server-api/src/main/java/org/avni/server/domain/metabase/FieldAttribute.java b/avni-server-api/src/main/java/org/avni/server/domain/metabase/FieldAttribute.java new file mode 100644 index 000000000..e74428016 --- /dev/null +++ b/avni-server-api/src/main/java/org/avni/server/domain/metabase/FieldAttribute.java @@ -0,0 +1,31 @@ +package org.avni.server.domain.metabase; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; + +public enum FieldAttribute { + FIELD("field"), + FIELDS("fields"), + SOURCE_TABLE("source-table"), + ALIAS("alias"), + CONDITION("condition"), + JOINS("joins"), + JOIN_ALIAS("join-alias"), + BASE_TYPE("base-type"); + + private final String attributeName; + + FieldAttribute(String attributeName) { + this.attributeName = attributeName; + } + + public String getAttributeName() { + return attributeName; + } + + public ObjectNode toJson(ObjectMapper objectMapper, Object value) { + ObjectNode attributeNode = objectMapper.createObjectNode(); + attributeNode.put(attributeName, value.toString()); + return attributeNode; + } +} diff --git a/avni-server-api/src/main/java/org/avni/server/domain/metabase/BaseType.java b/avni-server-api/src/main/java/org/avni/server/domain/metabase/FieldType.java similarity index 63% rename from avni-server-api/src/main/java/org/avni/server/domain/metabase/BaseType.java rename to avni-server-api/src/main/java/org/avni/server/domain/metabase/FieldType.java index e9404dd72..f4f93b6d4 100644 --- a/avni-server-api/src/main/java/org/avni/server/domain/metabase/BaseType.java +++ b/avni-server-api/src/main/java/org/avni/server/domain/metabase/FieldType.java @@ -1,13 +1,15 @@ package org.avni.server.domain.metabase; -public enum BaseType { +// Refer Documentation here : https://www.metabase.com/docs/latest/data-modeling/field-types + +public enum FieldType { INTEGER("type/Integer"), TEXT("type/Text"), BOOLEAN("type/Boolean"); private final String typeName; - BaseType(String typeName) { + FieldType(String typeName) { this.typeName = typeName; } diff --git a/avni-server-api/src/main/java/org/avni/server/domain/metabase/MetabaseJoin.java b/avni-server-api/src/main/java/org/avni/server/domain/metabase/MetabaseJoin.java deleted file mode 100644 index f3bde2044..000000000 --- a/avni-server-api/src/main/java/org/avni/server/domain/metabase/MetabaseJoin.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.avni.server.domain.metabase; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; - -public class MetabaseJoin { - private String fields; - private String alias; - private int sourceTable; - private JsonNode condition; - - public MetabaseJoin(String fields, String alias, int sourceTable, int joinFieldId1, int joinFieldId2, String tableName, ObjectMapper objectMapper) throws Exception { - this.fields = fields; - this.alias = alias; - this.sourceTable = sourceTable; - - this.condition = createConditionNode(joinFieldId1, joinFieldId2, tableName, BaseType.INTEGER, objectMapper); - } - - private JsonNode createConditionNode(int joinFieldId1, int joinFieldId2, String tableName, BaseType baseType, ObjectMapper objectMapper) throws Exception { - ArrayNode conditionNode = objectMapper.createArrayNode(); - conditionNode.add(ConditionType.EQUAL.getOperator()); - conditionNode.add(objectMapper.createArrayNode().add("field").add(joinFieldId1).add(objectMapper.createObjectNode().put("base-type", baseType.getTypeName()))); - conditionNode.add(objectMapper.createArrayNode().add("field").add(joinFieldId2).add(objectMapper.createObjectNode().put("base-type", baseType.getTypeName()).put("join-alias", tableName))); - return conditionNode; - } - - public ObjectNode toJson(ObjectMapper objectMapper) { - ObjectNode joinNode = objectMapper.createObjectNode(); - joinNode.put("fields", this.fields); - joinNode.put("alias", this.alias); - joinNode.put("source-table", this.sourceTable); - joinNode.set("condition", this.condition); - - return joinNode; - } -} diff --git a/avni-server-api/src/main/java/org/avni/server/domain/metabase/MetabaseQueryBuilder.java b/avni-server-api/src/main/java/org/avni/server/domain/metabase/MetabaseQueryBuilder.java index d5a417bd1..2f9ed77d3 100644 --- a/avni-server-api/src/main/java/org/avni/server/domain/metabase/MetabaseQueryBuilder.java +++ b/avni-server-api/src/main/java/org/avni/server/domain/metabase/MetabaseQueryBuilder.java @@ -18,34 +18,34 @@ public MetabaseQueryBuilder(Database database, ArrayNode joinsArray, ObjectMappe } public MetabaseQueryBuilder forTable(TableDetails tableDetails) { - queryNode.put("source-table", tableDetails.getId()); + queryNode.put(FieldAttribute.SOURCE_TABLE.getAttributeName(), tableDetails.getId()); return this; } public MetabaseQueryBuilder joinWith(TableDetails addressTable, FieldDetails joinField1, FieldDetails joinField2) { ObjectNode joinNode = objectMapper.createObjectNode(); - joinNode.put("fields", "all"); - joinNode.put("alias", addressTable.getName()); - joinNode.put("source-table", addressTable.getId()); + joinNode.put(FieldAttribute.FIELDS.getAttributeName(), "all"); + joinNode.put(FieldAttribute.ALIAS.getAttributeName(), addressTable.getName()); ArrayNode conditionArray = objectMapper.createArrayNode(); - conditionArray.add("="); + conditionArray.add(ConditionType.EQUAL.getOperator()); ArrayNode leftField = objectMapper.createArrayNode(); - leftField.add("field"); + leftField.add(FieldAttribute.FIELD.getAttributeName()); leftField.add(joinField2.getId()); - leftField.add(objectMapper.createObjectNode().put("base-type", "type/Integer")); + leftField.add(objectMapper.createObjectNode().put(FieldAttribute.BASE_TYPE.getAttributeName(), FieldType.INTEGER.getTypeName())); conditionArray.add(leftField); ArrayNode rightField = objectMapper.createArrayNode(); - rightField.add("field"); + rightField.add(FieldAttribute.FIELD.getAttributeName()); rightField.add(joinField1.getId()); - rightField.add(objectMapper.createObjectNode().put("base-type", "type/Integer").put("join-alias", addressTable.getName())); + rightField.add(objectMapper.createObjectNode().put(FieldAttribute.BASE_TYPE.getAttributeName(), FieldType.INTEGER.getTypeName()).put(FieldAttribute.JOIN_ALIAS.getAttributeName(), addressTable.getName())); conditionArray.add(rightField); - joinNode.set("condition", conditionArray); + joinNode.set(FieldAttribute.CONDITION.getAttributeName(), conditionArray); + joinNode.put(FieldAttribute.SOURCE_TABLE.getAttributeName(), addressTable.getId()); joinsArray.add(joinNode); - queryNode.set("joins", joinsArray); + queryNode.set(FieldAttribute.JOINS.getAttributeName(), joinsArray); return this; } diff --git a/avni-server-api/src/main/java/org/avni/server/domain/metabase/MetabaseRequestBody.java b/avni-server-api/src/main/java/org/avni/server/domain/metabase/MetabaseRequestBody.java index 6076c9ed2..0de5a6fe5 100644 --- a/avni-server-api/src/main/java/org/avni/server/domain/metabase/MetabaseRequestBody.java +++ b/avni-server-api/src/main/java/org/avni/server/domain/metabase/MetabaseRequestBody.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; +// Refer docs : https://www.metabase.com/docs/latest/api/card#post-apicard public class MetabaseRequestBody { private String name; private MetabaseQuery datasetQuery; diff --git a/avni-server-api/src/main/java/org/avni/server/domain/metabase/VisualizationType.java b/avni-server-api/src/main/java/org/avni/server/domain/metabase/VisualizationType.java index 94dc0611c..d44b50ac6 100644 --- a/avni-server-api/src/main/java/org/avni/server/domain/metabase/VisualizationType.java +++ b/avni-server-api/src/main/java/org/avni/server/domain/metabase/VisualizationType.java @@ -1,5 +1,6 @@ package org.avni.server.domain.metabase; +//Refer documentation : https://www.metabase.com/docs/latest/questions/sharing/visualizing-results public enum VisualizationType { TABLE("table"), CHART("chart"); diff --git a/avni-server-api/src/main/java/org/avni/server/service/metabase/AddressQuestionCreationService.java b/avni-server-api/src/main/java/org/avni/server/service/metabase/AddressQuestionCreationService.java index 676b3192c..1e2441dda 100644 --- a/avni-server-api/src/main/java/org/avni/server/service/metabase/AddressQuestionCreationService.java +++ b/avni-server-api/src/main/java/org/avni/server/service/metabase/AddressQuestionCreationService.java @@ -32,6 +32,6 @@ public void createQuestionForTable(String tableName, String schema) { tableDetails.setName(tableName); TableDetails fetchedTableDetails = databaseRepository.findTableDetailsByName(database, tableDetails); - databaseRepository.createQuestionForIndividualTable(database, fetchedTableDetails); + databaseRepository.createQuestionForASingleTable(database, fetchedTableDetails); } }