diff --git a/app/server/appsmith-interfaces/pom.xml b/app/server/appsmith-interfaces/pom.xml
index 439d2e11da..944db31b54 100644
--- a/app/server/appsmith-interfaces/pom.xml
+++ b/app/server/appsmith-interfaces/pom.xml
@@ -126,6 +126,12 @@
2.4.7
compile
+
+ com.h2database
+ h2
+ 1.4.200
+
+
diff --git a/app/server/appsmith-plugins/firestorePlugin/src/main/java/com/external/plugins/Op.java b/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/constants/ConditionalOperator.java
similarity index 61%
rename from app/server/appsmith-plugins/firestorePlugin/src/main/java/com/external/plugins/Op.java
rename to app/server/appsmith-interfaces/src/main/java/com/appsmith/external/constants/ConditionalOperator.java
index ac177c01d0..502d8f3b60 100644
--- a/app/server/appsmith-plugins/firestorePlugin/src/main/java/com/external/plugins/Op.java
+++ b/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/constants/ConditionalOperator.java
@@ -1,6 +1,6 @@
-package com.external.plugins;
+package com.appsmith.external.constants;
-public enum Op {
+public enum ConditionalOperator {
LT,
LTE,
EQ,
diff --git a/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/models/Condition.java b/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/models/Condition.java
new file mode 100644
index 0000000000..774c771d3a
--- /dev/null
+++ b/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/models/Condition.java
@@ -0,0 +1,61 @@
+package com.appsmith.external.models;
+
+import com.appsmith.external.constants.ConditionalOperator;
+import com.appsmith.external.constants.DataType;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.appsmith.external.helpers.DataTypeStringUtils.stringToKnownDataTypeConverter;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class Condition {
+
+ String path;
+
+ ConditionalOperator operator;
+
+ String value;
+
+ @JsonIgnore
+ DataType valueDataType;
+
+ public Condition(String path, String operator, String value) {
+ this.path = path;
+ this.operator = ConditionalOperator.valueOf(operator);
+ this.value = value;
+ }
+
+ public static List addValueDataType(List conditionList) {
+
+ return conditionList
+ .stream()
+ .map(condition -> {
+ String value = condition.getValue();
+ DataType dataType = stringToKnownDataTypeConverter(value);
+ condition.setValueDataType(dataType);
+ return condition;
+ })
+ .collect(Collectors.toList());
+ }
+
+ public static Boolean isValid(Condition condition) {
+
+ if (StringUtils.isEmpty(condition.getPath()) ||
+ (condition.getOperator() == null) ||
+ StringUtils.isEmpty(condition.getValue())) {
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/services/FilterDataService.java b/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/services/FilterDataService.java
new file mode 100644
index 0000000000..c99996e107
--- /dev/null
+++ b/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/services/FilterDataService.java
@@ -0,0 +1,431 @@
+package com.appsmith.external.services;
+
+import com.appsmith.external.constants.ConditionalOperator;
+import com.appsmith.external.constants.DataType;
+import com.appsmith.external.exceptions.pluginExceptions.AppsmithPluginError;
+import com.appsmith.external.exceptions.pluginExceptions.AppsmithPluginException;
+import com.appsmith.external.models.Condition;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import lombok.extern.slf4j.Slf4j;
+import org.bson.types.ObjectId;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static com.appsmith.external.helpers.DataTypeStringUtils.stringToKnownDataTypeConverter;
+import static com.appsmith.external.models.Condition.addValueDataType;
+
+@Component
+@Slf4j
+public class FilterDataService {
+
+ private static FilterDataService instance = null;
+ private ObjectMapper objectMapper;
+ private Connection connection;
+
+ private static final String URL = "jdbc:h2:mem:filterDb";
+
+ private static final Map SQL_DATATYPE_MAP = Map.of(
+ DataType.INTEGER, "INT",
+ DataType.LONG, "BIGINT",
+ DataType.FLOAT, "REAL",
+ DataType.DOUBLE, "DOUBLE",
+ DataType.BOOLEAN, "BOOLEAN",
+ DataType.STRING, "VARCHAR"
+ );
+
+ private static final Map SQL_OPERATOR_MAP = Map.of(
+ ConditionalOperator.LT, "<",
+ ConditionalOperator.LTE, "<=",
+ ConditionalOperator.EQ, "=",
+ ConditionalOperator.NOT_EQ, "<>",
+ ConditionalOperator.GT, ">",
+ ConditionalOperator.GTE, ">=",
+ ConditionalOperator.IN, "IN",
+ ConditionalOperator.NOT_IN, "NOT IN"
+ );
+
+ private FilterDataService() {
+
+ objectMapper = new ObjectMapper();
+
+ try {
+ connection = DriverManager.getConnection(URL);
+ } catch (SQLException e) {
+ log.error(e.getMessage());
+ throw new AppsmithPluginException(AppsmithPluginError.PLUGIN_ERROR, "Failed to connect to the in memory database. Unable to perform filtering");
+ }
+ }
+
+ public static FilterDataService getInstance() {
+
+ if (instance == null) {
+ instance = new FilterDataService();
+ }
+
+ return instance;
+ }
+
+ public ArrayNode filterData(ArrayNode items, List conditionList) {
+
+ if (items == null || items.size() == 0) {
+ return items;
+ }
+
+ if (!validConditionList(conditionList)) {
+ throw new AppsmithPluginException(AppsmithPluginError.PLUGIN_EXECUTE_ARGUMENT_ERROR, "Conditions for filtering were incomplete or incorrect.");
+ }
+
+ List conditions = addValueDataType(conditionList);
+
+ // Generate the schema of the table using the first object
+ JsonNode jsonNode = items.get(0);
+
+ Map schema = generateSchema(jsonNode);
+
+ String tableName = generateTable(schema);
+
+ // insert the data
+ insertData(tableName, items, schema);
+
+ // Filter the data
+ List