feat: Add Mongo Templates for plugin. (#11153)

Adds templates for the Aggregate, Distinct and Count commands for the MongoDB plugin.
This commit is contained in:
Félix Suarez Bonilla 2022-02-15 10:29:01 -06:00 committed by GitHub
parent 7a8db4270a
commit 9bcd4afff1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 167 additions and 0 deletions

View File

@ -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<DatasourceStructure.Template> generateTemplate(Map<String, Object> templateConfiguration) {
String collectionName = (String) templateConfiguration.get("collectionName");
Map<String, Object> 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
));
}
}

View File

@ -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<DatasourceStructure.Template> generateTemplate(Map<String, Object> templateConfiguration) {
String collectionName = (String) templateConfiguration.get("collectionName");
Map<String, Object> 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
));
}
}

View File

@ -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<DatasourceStructure.Template> generateTemplate(Map<String, Object> templateConfiguration) {
Map<String, Object> 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
));
}
}

View File

@ -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) {

View File

@ -580,6 +580,47 @@ public class MongoPluginTest {
"{ \"_id\": ObjectId(\"id_of_document_to_delete\") }");
assertEquals(getValueSafelyFromFormData((Map<String, Object>) 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<String, Object>) countTemplate.getConfiguration()).get(COMMAND), "COUNT");
assertEquals(getValueSafelyFromFormData((Map<String, Object>) 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<String, Object>) distinctTemplate.getConfiguration()).get(COMMAND), "DISTINCT");
assertEquals(getValueSafelyFromFormData((Map<String, Object>) distinctTemplate.getConfiguration(), DISTINCT_QUERY),
"{ \"_id\": ObjectId(\"id_of_document_to_distinct\") }");
assertEquals(getValueSafelyFromFormData((Map<String, Object>) 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<String, Object>) aggregateTemplate.getConfiguration()).get(COMMAND), "AGGREGATE");
assertEquals(getValueSafelyFromFormData((Map<String, Object>) aggregateTemplate.getConfiguration(), AGGREGATE_PIPELINE),
"[ {\"$sort\" : {\"_id\": 1} } ]");
})
.verifyComplete();
}