From 23ce13ce98428683cfd1b125da9a12d1fe6bc4d0 Mon Sep 17 00:00:00 2001 From: Trisha Anand Date: Mon, 30 Aug 2021 16:32:48 +0530 Subject: [PATCH] [Mongo] Added default values for query for Find, Count and Distinct commands (#6960) * Added smart defaults for query in Count, Distinct & Find commands * Added test cases for smart inputs for query and limit for find, and query for count and distinct --- .../com/external/plugins/commands/Count.java | 16 +-- .../com/external/plugins/commands/Delete.java | 1 + .../external/plugins/commands/Distinct.java | 13 +- .../com/external/plugins/commands/Find.java | 17 +-- .../external/plugins/commands/UpdateMany.java | 2 + .../com/external/plugins/MongoPluginTest.java | 111 ++++++++++++++++++ app/util/plugin-generation/.gitignore | 1 + 7 files changed, 129 insertions(+), 32 deletions(-) create mode 100644 app/util/plugin-generation/.gitignore 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 6bb6db0b98..fad2f53cf2 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 @@ -28,24 +28,16 @@ public class Count extends MongoCommand { } } - @Override - public Boolean isValid() { - if (super.isValid()) { - if (!StringUtils.isNullOrEmpty(query)) { - return Boolean.TRUE; - } else { - fieldNamesWithNoConfiguration.add("Query"); - } - } - return Boolean.FALSE; - } - @Override public Document parseCommand() { Document document = new Document(); document.put("count", this.collection); + if (StringUtils.isNullOrEmpty(this.query)) { + this.query = "{}"; + } + document.put("query", parseSafely("Query", this.query)); return document; diff --git a/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/Delete.java b/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/Delete.java index 4a9ac56690..f2857a021c 100644 --- a/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/Delete.java +++ b/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/Delete.java @@ -56,6 +56,7 @@ public class Delete extends MongoCommand { if (!StringUtils.isNullOrEmpty(query)) { return Boolean.TRUE; } else { + // Not adding smart defaults for query due to data impact fieldNamesWithNoConfiguration.add("Query"); } } 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 3d9d0edde6..98d8ac0a37 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 @@ -37,15 +37,10 @@ public class Distinct extends MongoCommand { @Override public Boolean isValid() { if (super.isValid()) { - if (!StringUtils.isNullOrEmpty(query) && !StringUtils.isNullOrEmpty(key)) { + if (!StringUtils.isNullOrEmpty(key)) { return Boolean.TRUE; - } else { - if (StringUtils.isNullOrEmpty(query)) { - fieldNamesWithNoConfiguration.add("Query"); - } - if (StringUtils.isNullOrEmpty(key)) { + } else if (StringUtils.isNullOrEmpty(key)) { fieldNamesWithNoConfiguration.add("Key/Field"); - } } } @@ -58,6 +53,10 @@ public class Distinct extends MongoCommand { document.put("distinct", this.collection); + if (StringUtils.isNullOrEmpty(this.query)) { + this.query = "{}"; + } + document.put("query", parseSafely("Query", this.query)); document.put("key", this.key); diff --git a/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/Find.java b/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/Find.java index 53f3bcc318..8ab26882a7 100644 --- a/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/Find.java +++ b/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/Find.java @@ -63,23 +63,14 @@ public class Find extends MongoCommand { } } - @Override - public Boolean isValid() { - if (super.isValid()) { - if (!StringUtils.isNullOrEmpty(query)) { - return Boolean.TRUE; - } else { - fieldNamesWithNoConfiguration.add("Query"); - } - } - - return Boolean.FALSE; - } - @Override public Document parseCommand() { Document document = new Document(); + if (StringUtils.isNullOrEmpty(this.query)) { + this.query = "{}"; + } + document.put("find", this.collection); document.put("filter", parseSafely("Query", this.query)); diff --git a/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/UpdateMany.java b/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/UpdateMany.java index 2ab5f9d86f..d81e20f3fd 100644 --- a/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/UpdateMany.java +++ b/app/server/appsmith-plugins/mongoPlugin/src/main/java/com/external/plugins/commands/UpdateMany.java @@ -62,9 +62,11 @@ public class UpdateMany extends MongoCommand { if (!StringUtils.isNullOrEmpty(query) && !StringUtils.isNullOrEmpty(update)) { return Boolean.TRUE; } else { + // Not adding smart defaults for query due to data impact if (StringUtils.isNullOrEmpty(query)) { fieldNamesWithNoConfiguration.add("Query"); } + // Not adding smart defaults for query due to data impact if (StringUtils.isNullOrEmpty(update)) { fieldNamesWithNoConfiguration.add("Update"); } 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 ce944294a5..29b0b2c1e1 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 @@ -1524,4 +1524,115 @@ public class MongoPluginTest { .verifyComplete(); } + @Test + public void testFormSmartInputFind() { + DatasourceConfiguration datasourceConfiguration = createDatasourceConfiguration(); + + ActionConfiguration actionConfiguration = new ActionConfiguration(); + + Map configMap = new HashMap<>(); + configMap.put(SMART_BSON_SUBSTITUTION, Boolean.TRUE); + configMap.put(COMMAND, "FIND"); + // Skip adding the query + configMap.put(FIND_SORT, "{ id: {{Input2.text}} }"); + // Skip adding limit + configMap.put(COLLECTION, "{{Input4.text}}"); + + actionConfiguration.setPluginSpecifiedTemplates(generateMongoFormConfigTemplates(configMap)); + + ExecuteActionDTO executeActionDTO = new ExecuteActionDTO(); + List params = new ArrayList<>(); + Param param1 = new Param(); + param1.setKey("Input2.text"); + param1.setValue("1"); + params.add(param1); + Param param2 = new Param(); + param2.setKey("Input4.text"); + param2.setValue("users"); + params.add(param2); + executeActionDTO.setParams(params); + + Mono dsConnectionMono = pluginExecutor.datasourceCreate(datasourceConfiguration); + Mono executeMono = dsConnectionMono.flatMap(conn -> pluginExecutor.executeParameterized(conn, + executeActionDTO, + datasourceConfiguration, + actionConfiguration)); + + StepVerifier.create(executeMono) + .assertNext(obj -> { + ActionExecutionResult result = obj; + assertNotNull(result); + assertTrue(result.getIsExecutionSuccess()); + assertNotNull(result.getBody()); + assertEquals(3, ((ArrayNode) result.getBody()).size()); + + assertEquals( + List.of(new ParsedDataType(JSON), new ParsedDataType(RAW)).toString(), + result.getDataTypes().toString() + ); + + String expectedQuery = "{\"find\": \"users\", \"filter\": {}, \"sort\": {\"id\": 1}, \"limit\": 10, \"batchSize\": 10}"; + assertEquals(expectedQuery, + ((RequestParamDTO)(((List)result.getRequest().getRequestParams())).get(0)).getValue()); + }) + .verifyComplete(); + } + + @Test + public void testFormSmartInputCount() { + DatasourceConfiguration dsConfig = createDatasourceConfiguration(); + Mono dsConnectionMono = pluginExecutor.datasourceCreate(dsConfig); + + ActionConfiguration actionConfiguration = new ActionConfiguration(); + + Map configMap = new HashMap<>(); + configMap.put(SMART_BSON_SUBSTITUTION, Boolean.TRUE); + configMap.put(COMMAND, "COUNT"); + configMap.put(COLLECTION, "users"); + // Skip adding the query + + actionConfiguration.setPluginSpecifiedTemplates(generateMongoFormConfigTemplates(configMap)); + + Mono executeMono = dsConnectionMono.flatMap(conn -> pluginExecutor.executeParameterized(conn, new ExecuteActionDTO(), dsConfig, actionConfiguration)); + StepVerifier.create(executeMono) + .assertNext(obj -> { + ActionExecutionResult result = (ActionExecutionResult) obj; + assertNotNull(result); + assertTrue(result.getIsExecutionSuccess()); + assertNotNull(result.getBody()); + JsonNode value = ((ObjectNode) result.getBody()).get("n"); + assertEquals(value.asInt(), 3); + }) + .verifyComplete(); + } + + @Test + public void testFormSmartInputDistinct() { + DatasourceConfiguration dsConfig = createDatasourceConfiguration(); + Mono dsConnectionMono = pluginExecutor.datasourceCreate(dsConfig); + + ActionConfiguration actionConfiguration = new ActionConfiguration(); + + Map configMap = new HashMap<>(); + configMap.put(SMART_BSON_SUBSTITUTION, Boolean.TRUE); + configMap.put(COMMAND, "DISTINCT"); + configMap.put(COLLECTION, "users"); + // Skip adding the query + configMap.put(DISTINCT_KEY, "name"); + + actionConfiguration.setPluginSpecifiedTemplates(generateMongoFormConfigTemplates(configMap)); + + Mono executeMono = dsConnectionMono.flatMap(conn -> pluginExecutor.executeParameterized(conn, new ExecuteActionDTO(), dsConfig, actionConfiguration)); + StepVerifier.create(executeMono) + .assertNext(obj -> { + ActionExecutionResult result = (ActionExecutionResult) obj; + assertNotNull(result); + assertTrue(result.getIsExecutionSuccess()); + assertNotNull(result.getBody()); + int valuesSize = ((ArrayNode) result.getBody()).size(); + assertEquals(valuesSize, 3); + }) + .verifyComplete(); + } + } diff --git a/app/util/plugin-generation/.gitignore b/app/util/plugin-generation/.gitignore new file mode 100644 index 0000000000..c2658d7d1b --- /dev/null +++ b/app/util/plugin-generation/.gitignore @@ -0,0 +1 @@ +node_modules/