diff --git a/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/Aggregate.java b/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/Aggregate.java index 998df74830..a8d18adce4 100644 --- a/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/Aggregate.java +++ b/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/Aggregate.java @@ -4,9 +4,11 @@ import com.appsmith.external.constants.DataType; import com.appsmith.external.exceptions.pluginExceptions.AppsmithPluginError; import com.appsmith.external.exceptions.pluginExceptions.AppsmithPluginException; import com.appsmith.external.helpers.DataTypeStringUtils; +import com.appsmith.external.models.DatasourceStructure; import com.appsmith.external.models.ActionConfiguration; import lombok.Getter; import lombok.Setter; +import lombok.NoArgsConstructor; import org.bson.BsonArray; import org.bson.Document; import org.bson.json.JsonParseException; @@ -14,16 +16,25 @@ import org.pf4j.util.StringUtils; import java.util.ArrayList; import java.util.Map; +import java.util.List; +import java.util.HashMap; +import java.util.Collections; import static com.appsmith.external.helpers.PluginUtils.getValueSafelyFromFormData; +import static com.appsmith.external.helpers.PluginUtils.setValueSafelyInFormData; import static com.external.plugins.constants.FieldName.AGGREGATE_LIMIT; import static com.external.plugins.utils.MongoPluginUtils.parseSafely; import static com.appsmith.external.helpers.PluginUtils.validConfigurationPresentInFormData; import static com.external.plugins.constants.FieldName.AGGREGATE_PIPELINE; import static org.apache.commons.lang3.StringUtils.isBlank; +import static com.external.plugins.constants.FieldName.COLLECTION; +import static com.external.plugins.constants.FieldName.COMMAND; +import static com.external.plugins.constants.FieldName.SMART_SUBSTITUTION; + @Getter @Setter +@NoArgsConstructor public class Aggregate extends MongoCommand { String pipeline; String limit; @@ -98,4 +109,31 @@ public class Aggregate extends MongoCommand { return commandDocument; } + + @Override + public List generateTemplate(Map templateConfiguration) { + String collectionName = (String) templateConfiguration.get("collectionName"); + + Map configMap = new HashMap<>(); + + setValueSafelyInFormData(configMap, SMART_SUBSTITUTION, Boolean.TRUE); + setValueSafelyInFormData(configMap, COMMAND, "AGGREGATE"); + setValueSafelyInFormData(configMap, COLLECTION, collectionName); + setValueSafelyInFormData(configMap, AGGREGATE_PIPELINE, "[ {\"$sort\" : {\"_id\": 1} } ]"); + setValueSafelyInFormData(configMap, AGGREGATE_LIMIT, "10"); + + + String rawQuery = "{\n" + + " \"aggregate\": \"" + collectionName + "\",\n" + + " \"pipeline\": " + "[ {\"$sort\" : {\"_id\": 1} } ],\n" + + " \"limit\": 10,\n" + + " \"explain\": \"true\"\n" + // Specifies to return the information on the processing of the pipeline. (This also avoids the use of the 'cursor' aggregate key according to Mongo doc) + "}\n"; + + return Collections.singletonList(new DatasourceStructure.Template( + "Aggregate", + rawQuery, + configMap + )); + } } diff --git a/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/Count.java b/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/Count.java index 73bc5e9d6d..105f55d585 100644 --- a/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/Count.java +++ b/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/Count.java @@ -1,20 +1,31 @@ package com.external.plugins.commands; import com.appsmith.external.models.ActionConfiguration; +import com.appsmith.external.models.DatasourceStructure; + import lombok.Getter; import lombok.Setter; +import lombok.NoArgsConstructor; import org.bson.Document; import org.pf4j.util.StringUtils; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; import java.util.Map; import static com.appsmith.external.helpers.PluginUtils.getValueSafelyFromFormData; import static com.external.plugins.utils.MongoPluginUtils.parseSafely; +import static com.appsmith.external.helpers.PluginUtils.setValueSafelyInFormData; import static com.appsmith.external.helpers.PluginUtils.validConfigurationPresentInFormData; import static com.external.plugins.constants.FieldName.COUNT_QUERY; +import static com.external.plugins.constants.FieldName.SMART_SUBSTITUTION; +import static com.external.plugins.constants.FieldName.COLLECTION; +import static com.external.plugins.constants.FieldName.COMMAND; @Getter @Setter +@NoArgsConstructor public class Count extends MongoCommand { String query; @@ -42,4 +53,27 @@ public class Count extends MongoCommand { return document; } + + @Override + public List generateTemplate(Map templateConfiguration) { + String collectionName = (String) templateConfiguration.get("collectionName"); + + Map configMap = new HashMap<>(); + + setValueSafelyInFormData(configMap, SMART_SUBSTITUTION, Boolean.TRUE); + setValueSafelyInFormData(configMap, COMMAND, "COUNT"); + setValueSafelyInFormData(configMap, COUNT_QUERY, "{\"_id\": {\"$exists\": true}}"); + setValueSafelyInFormData(configMap, COLLECTION, collectionName); + + String rawQuery = "{\n" + + " \"count\": \"" + collectionName + "\",\n" + + " \"query\": " + "{\"_id\": {\"$exists\": true}} \n" + + "}\n"; + + return Collections.singletonList(new DatasourceStructure.Template( + "Count", + rawQuery, + configMap + )); + } } diff --git a/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/Distinct.java b/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/Distinct.java index fd01e900be..50144ca1ec 100644 --- a/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/Distinct.java +++ b/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/Distinct.java @@ -1,21 +1,34 @@ package com.external.plugins.commands; import com.appsmith.external.models.ActionConfiguration; +import com.appsmith.external.models.DatasourceStructure; import com.external.plugins.constants.FieldName; import lombok.Getter; import lombok.Setter; +import lombok.NoArgsConstructor; import org.bson.Document; import org.pf4j.util.StringUtils; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; import java.util.Map; import static com.appsmith.external.helpers.PluginUtils.getValueSafelyFromFormData; import static com.external.plugins.utils.MongoPluginUtils.parseSafely; +import static com.appsmith.external.helpers.PluginUtils.setValueSafelyInFormData; import static com.appsmith.external.helpers.PluginUtils.validConfigurationPresentInFormData; import static com.external.plugins.constants.FieldName.DISTINCT_QUERY; +import static com.external.plugins.constants.FieldName.DISTINCT_KEY; +import static com.external.plugins.constants.FieldName.COLLECTION; +import static com.external.plugins.constants.FieldName.COMMAND; +import static com.external.plugins.constants.FieldName.SMART_SUBSTITUTION; +import static com.external.plugins.constants.FieldName.KEY; @Getter @Setter +@NoArgsConstructor public class Distinct extends MongoCommand { String query; String key; @@ -63,4 +76,32 @@ public class Distinct extends MongoCommand { return document; } + + + @Override + public List generateTemplate(Map templateConfiguration) { + Map configMap = new HashMap<>(); + String collectionName = (String) templateConfiguration.get("collectionName"); + + setValueSafelyInFormData(configMap, SMART_SUBSTITUTION, Boolean.TRUE); + setValueSafelyInFormData(configMap, COMMAND, "DISTINCT"); + setValueSafelyInFormData(configMap, DISTINCT_QUERY, "{ \"_id\": ObjectId(\"id_of_document_to_distinct\") }"); + setValueSafelyInFormData(configMap, DISTINCT_KEY, "_id"); + setValueSafelyInFormData(configMap, COLLECTION, collectionName); + + + String rawQuery = "{\n" + + " \"distinct\": \"" + collectionName + "\",\n" + + " \"query\": { \"_id\": ObjectId(\"id_of_document_to_distinct\") }," + + " \"key\": \"_id\"," + + "}\n"; + + + + return Collections.singletonList(new DatasourceStructure.Template( + "Distinct", + rawQuery, + configMap + )); + } } diff --git a/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/utils/MongoPluginUtils.java b/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/utils/MongoPluginUtils.java index 2f593439cd..8bb857f04e 100644 --- a/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/utils/MongoPluginUtils.java +++ b/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/utils/MongoPluginUtils.java @@ -185,6 +185,19 @@ public class MongoPluginUtils { templates.addAll( new Delete().generateTemplate(templateConfiguration) ); + + templates.addAll( + new Count().generateTemplate(templateConfiguration) + ); + + templates.addAll( + new Distinct().generateTemplate(templateConfiguration) + ); + + templates.addAll( + new Aggregate().generateTemplate(templateConfiguration) + ); + } public static String urlEncode(String text) { diff --git a/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginTest.java b/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginTest.java index 979ee9d121..73d6a29c43 100644 --- a/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginTest.java +++ b/app/server/appsmith-plugins/mongoPlugin/src/test/java/com/external/plugins/MongoPluginTest.java @@ -580,6 +580,47 @@ public class MongoPluginTest { "{ \"_id\": ObjectId(\"id_of_document_to_delete\") }"); assertEquals(getValueSafelyFromFormData((Map) deleteTemplate.getConfiguration(), DELETE_LIMIT), "SINGLE"); + + // Assert Count Command + DatasourceStructure.Template countTemplate = templates.get(5); + assertEquals(countTemplate.getTitle(), "Count"); + assertEquals(countTemplate.getBody(), "{\n" + + " \"count\": \"users\",\n" + + " \"query\": " + "{\"_id\": {\"$exists\": true}} \n" + + "}\n"); + assertEquals(((Map) countTemplate.getConfiguration()).get(COMMAND), "COUNT"); + assertEquals(getValueSafelyFromFormData((Map) countTemplate.getConfiguration(), COUNT_QUERY), + "{\"_id\": {\"$exists\": true}}"); + + // Assert Distinct Command + DatasourceStructure.Template distinctTemplate = templates.get(6); + assertEquals(distinctTemplate.getTitle(), "Distinct"); + assertEquals(distinctTemplate.getBody(), "{\n" + + " \"distinct\": \"users\",\n" + + " \"query\": { \"_id\": ObjectId(\"id_of_document_to_distinct\") }," + + " \"key\": \"_id\"," + + "}\n"); + assertEquals(((Map) distinctTemplate.getConfiguration()).get(COMMAND), "DISTINCT"); + assertEquals(getValueSafelyFromFormData((Map) distinctTemplate.getConfiguration(), DISTINCT_QUERY), + "{ \"_id\": ObjectId(\"id_of_document_to_distinct\") }"); + assertEquals(getValueSafelyFromFormData((Map) distinctTemplate.getConfiguration(), DISTINCT_KEY), + "_id"); + + // Assert Aggregate Command + DatasourceStructure.Template aggregateTemplate = templates.get(7); + assertEquals(aggregateTemplate.getTitle(), "Aggregate"); + assertEquals(aggregateTemplate.getBody(), "{\n" + + " \"aggregate\": \"users\",\n" + + " \"pipeline\": " + "[ {\"$sort\" : {\"_id\": 1} } ],\n" + + " \"limit\": 10,\n" + + " \"explain\": \"true\"\n" + + "}\n"); + + assertEquals(((Map) aggregateTemplate.getConfiguration()).get(COMMAND), "AGGREGATE"); + assertEquals(getValueSafelyFromFormData((Map) aggregateTemplate.getConfiguration(), AGGREGATE_PIPELINE), + "[ {\"$sort\" : {\"_id\": 1} } ]"); + + }) .verifyComplete(); }