Ver Fonte

update filter

AE86 há 5 anos atrás
pai
commit
9264bdf874

+ 25 - 13
dbsyncer-connector/src/main/java/org/dbsyncer/connector/config/Filter.java

@@ -1,8 +1,10 @@
 package org.dbsyncer.connector.config;
 
-import java.util.List;
+import org.dbsyncer.connector.enums.FilterEnum;
+import org.dbsyncer.connector.enums.OperationEnum;
 
 /**
+ * 字段属性条件
  * @author AE86
  * @version 1.0.0
  * @date 2019/9/30 15:10
@@ -10,28 +12,38 @@ import java.util.List;
 public class Filter {
 
     /**
-     * and 过滤
+     * 字段名,ID
      */
-    private List<FieldFilter> and;
+    private String name;
 
     /**
-     * or 过滤
+     * @see OperationEnum
      */
-    private List<FieldFilter> or;
+    private String operation;
 
-    public Filter() {
+    /**
+     * @see FilterEnum
+     */
+    private String filter;
+
+    /**
+     * 值
+     */
+    private String value;
+
+    public String getName() {
+        return name;
     }
 
-    public Filter(List<FieldFilter> and, List<FieldFilter> or) {
-        this.and = and;
-        this.or = or;
+    public String getOperation() {
+        return operation;
     }
 
-    public List<FieldFilter> getAnd() {
-        return and;
+    public String getFilter() {
+        return filter;
     }
 
-    public List<FieldFilter> getOr() {
-        return or;
+    public String getValue() {
+        return value;
     }
 }

+ 14 - 18
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/AbstractDatabaseConnector.java

@@ -4,7 +4,6 @@ import org.apache.commons.lang.StringUtils;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.connector.ConnectorException;
 import org.dbsyncer.connector.config.*;
-import org.dbsyncer.connector.enums.FilterEnum;
 import org.dbsyncer.connector.enums.OperationEnum;
 import org.dbsyncer.connector.enums.SqlBuilderEnum;
 import org.dbsyncer.connector.util.DatabaseUtil;
@@ -19,6 +18,7 @@ import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 public abstract class AbstractDatabaseConnector implements Database {
 
@@ -98,24 +98,22 @@ public abstract class AbstractDatabaseConnector implements Database {
     }
 
     @Override
-    public String getQueryFilterSql(Filter filter) {
-        if (filter == null) {
+    public String getQueryFilterSql(List<Filter> filter) {
+        if (CollectionUtils.isEmpty(filter)) {
             return "";
         }
         // 过滤条件SQL
         StringBuilder condition = new StringBuilder();
 
         // 拼接并且SQL
-        List<FieldFilter> and = filter.getAnd();
-        String addSql = getFilterSql(OperationEnum.AND, and);
+        String addSql = getFilterSql(OperationEnum.AND.getName(), filter);
         // 如果Add条件存在
         if (StringUtils.isNotBlank(addSql)) {
             condition.append(addSql);
         }
 
         // 拼接或者SQL
-        List<FieldFilter> or = filter.getOr();
-        String orSql = getFilterSql(OperationEnum.OR, or);
+        String orSql = getFilterSql(OperationEnum.OR.getName(), filter);
         // 如果Or条件和Add条件都存在
         if (StringUtils.isNotBlank(orSql) && StringUtils.isNotBlank(addSql)) {
             condition.append(" OR ").append(orSql);
@@ -224,29 +222,27 @@ public abstract class AbstractDatabaseConnector implements Database {
     /**
      * 根据过滤条件获取查询SQL
      *
-     * @param operationEnum and/or
-     * @param list
+     * @param queryOperator and/or
+     * @param filter
      * @return
      */
-    private String getFilterSql(OperationEnum operationEnum, List<FieldFilter> list) {
-        if (null == operationEnum || CollectionUtils.isEmpty(list)) {
-            return null;
+    private String getFilterSql(String queryOperator, List<Filter> filter) {
+        List<Filter> list = filter.stream().filter(f -> StringUtils.equals(f.getOperation(), queryOperator)).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(list)){
+            return "";
         }
-        String queryExpressionOperator = operationEnum.getCode();
 
         int size = list.size();
         int end = size - 1;
         StringBuilder sql = new StringBuilder();
         sql.append("(");
-        FieldFilter c = null;
-        String oper = null;
+        Filter c = null;
         for (int i = 0; i < size; i++) {
             c = list.get(i);
-            oper = FilterEnum.getCode(c.getOperator());
             // USER = 'zhangsan'
-            sql.append(c.getName()).append(oper).append("'").append(c.getValue()).append("'");
+            sql.append(c.getName()).append(c.getFilter()).append("'").append(c.getValue()).append("'");
             if (i < end) {
-                sql.append(" ").append(queryExpressionOperator).append(" ");
+                sql.append(" ").append(queryOperator).append(" ");
             }
         }
         sql.append(")");

+ 1 - 1
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/Database.java

@@ -18,7 +18,7 @@ public interface Database extends Connector {
 
     void close(JdbcTemplate jdbcTemplate);
 
-    String getQueryFilterSql(Filter filter);
+    String getQueryFilterSql(List<Filter> filter);
 
     String getPageSql(DatabaseConfig config, String tableName, String pk, String querySQL);
 

+ 7 - 27
dbsyncer-connector/src/main/java/org/dbsyncer/connector/enums/FilterEnum.java

@@ -1,8 +1,5 @@
 package org.dbsyncer.connector.enums;
 
-import org.apache.commons.lang.StringUtils;
-import org.dbsyncer.connector.ConnectorException;
-
 /**
  * 运算符表达式类型
  *
@@ -15,54 +12,37 @@ public enum FilterEnum {
     /**
      * 等于
      */
-    EQUAL("equal", "="),
+    EQUAL("="),
     /**
      * 不等于
      */
-    NOT_EQUAL("notEqual", "!="),
+    NOT_EQUAL("!="),
     /**
      * 大于
      */
-    GT("gt", ">"),
+    GT(">"),
     /**
      * 小于
      */
-    LT("lt", "<"),
+    LT("<"),
     /**
      * 大于等于
      */
-    GT_AND_EQUAL("gtAndEqual", ">="),
+    GT_AND_EQUAL(">="),
     /**
      * 小于等于
      */
-    LT_AND_EQUAL("ltAndEqual", "<=");
+    LT_AND_EQUAL("<=");
 
     // 运算符名称
     private String name;
 
-    // 运算符
-    private String code;
-
-    FilterEnum(String name, String code) {
+    FilterEnum(String name) {
         this.name = name;
-        this.code = code;
-    }
-
-    public static String getCode(String name){
-        for (FilterEnum e : FilterEnum.values()) {
-            if (StringUtils.equals(name, e.getName())) {
-                return e.getCode();
-            }
-        }
-        throw new ConnectorException(String.format("Filter name \"%s\" does not exist.", name));
     }
 
     public String getName() {
         return name;
     }
 
-    public String getCode() {
-        return code;
-    }
-
 }

+ 3 - 11
dbsyncer-connector/src/main/java/org/dbsyncer/connector/enums/OperationEnum.java

@@ -12,29 +12,21 @@ public enum OperationEnum {
     /**
      * 并且
      */
-    AND("and", "and"),
+    AND("and"),
     /**
      * 或者
      */
-    OR("or", "or");
+    OR("or");
 
     // 描述
     private String name;
 
-    // 运算符
-    private String code;
-
-    OperationEnum(String name, String code) {
+    OperationEnum(String name) {
         this.name = name;
-        this.code = code;
     }
 
     public String getName() {
         return name;
     }
 
-    public String getCode() {
-        return code;
-    }
-
 }

+ 0 - 13
dbsyncer-listener/src/main/java/org/dbsyncer/listener/config/PollingListenerConfig.java

@@ -1,6 +1,5 @@
 package org.dbsyncer.listener.config;
 
-import org.dbsyncer.connector.config.Filter;
 import org.dbsyncer.listener.enums.ListenerEnum;
 
 import java.util.List;
@@ -20,9 +19,6 @@ public class PollingListenerConfig extends ListenerConfig {
     // 定时表达式, 格式: [秒] [分] [小时] [日] [月] [周]
     private String cronExpression = "*/30 * * * * ?";
 
-    // 过滤条件
-    private Filter filter;
-
     // 事件字段
     private String eventFieldName;
 
@@ -44,15 +40,6 @@ public class PollingListenerConfig extends ListenerConfig {
         return this;
     }
 
-    public Filter getFilter() {
-        return filter;
-    }
-
-    public PollingListenerConfig setFilter(Filter filter) {
-        this.filter = filter;
-        return this;
-    }
-
     public String getEventFieldName() {
         return eventFieldName;
     }

+ 3 - 3
dbsyncer-parser/src/main/java/org/dbsyncer/parser/model/AbstractConfigModel.java

@@ -9,7 +9,7 @@ import java.util.List;
 public abstract class AbstractConfigModel extends ConfigModel {
 
     // 过滤条件
-    private Filter filter;
+    private List<Filter> filter;
 
     // 转换配置
     private List<FieldConvert> fieldConvert;
@@ -17,11 +17,11 @@ public abstract class AbstractConfigModel extends ConfigModel {
     // 插件配置
     private Plugin plugin;
 
-    public Filter getFilter() {
+    public List<Filter> getFilter() {
         return filter;
     }
 
-    public void setFilter(Filter filter) {
+    public void setFilter(List<Filter> filter) {
         this.filter = filter;
     }
 

+ 14 - 16
dbsyncer-parser/src/main/resources/Mapping.json

@@ -6,22 +6,20 @@
   "updateTime": "2019-10-08 21:35:00",
   "sourceConnectorId": "100",
   "targetConnectorId": "666",
-  "filter": {
-    "and": [
-      {
-        "name": "AGE",
-        "operator": "gt",
-        "value": "0"
-      }
-    ],
-    "or": [
-      {
-        "name": "NAME",
-        "operator": "equal",
-        "value": "hello"
-      }
-    ]
-  },
+  "filter": [
+    {
+      "name": "AGE",
+      "operator": "and",
+      "filter": ">",
+      "value": "0"
+    },
+    {
+      "name": "NAME",
+      "operator": "or",
+      "filter": "=",
+      "value": "hello"
+    }
+  ],
   "fieldConvert": [
     {
       "name": "NAME",

+ 14 - 16
dbsyncer-parser/src/main/resources/TableGroup.json

@@ -52,22 +52,20 @@
     "QUARTZ_ALL":"select xxx",
     "QUARTZ_MAX":"select xxx"
   },
-  "filter": {
-    "and": [
-      {
-        "name": "AGE",
-        "operator": "gt",
-        "value": "0"
-      }
-    ],
-    "or": [
-      {
-        "name": "NAME",
-        "operator": "equal",
-        "value": "hello"
-      }
-    ]
-  },
+  "filter": [
+    {
+      "name": "AGE",
+      "operator": "and",
+      "filter": ">",
+      "value": "0"
+    },
+    {
+      "name": "NAME",
+      "operator": "or",
+      "filter": "=",
+      "value": "hello"
+    }
+  ],
   "fieldConvert": [
     {
       "name": "NAME",

+ 54 - 1
dbsyncer-web/src/main/resources/static/js/mapping/editMappingFilterAndConvert.js

@@ -1,3 +1,56 @@
+// 绑定条件表格点击事件
+function bindConditionListClick(){
+    var $del = $(".conditionDelete");
+    $del.unbind("click");
+    $del.bind('click', function(){
+        // 阻止tr触发click事件
+        event.cancelBubble=true;
+        $(this).parent().parent().remove();
+    });
+}
+
+// 绑定新增条件点击事件
+function bindConditionAddClick() {
+    var $conditionAdd = $("#conditionAdd");
+    $conditionAdd.unbind("click");
+    $conditionAdd.bind('click', function () {
+        var conditionOperation = $("#conditionOperation").select2("val");
+        var conditionSourceField = $("#conditionSourceField").select2("val");
+        var conditionFilter = $("#conditionFilter").select2("val");
+        var $conditionArg = $("#conditionArg");
+        var conditionArg = $conditionArg.val();
+
+        // 检查重复字段
+        var repeated = false;
+        var $conditionList = $("#conditionList");
+        $conditionList.find("tr").each(function(k,v){
+             var opr = $(this).find("td:eq(0)").text();
+             var sf = $(this).find("td:eq(1)").text();
+             var filter = $(this).find("td:eq(2)").text();
+             var arg = $(this).find("td:eq(3)").text();
+             if(repeated = (opr==conditionOperation && sf==conditionSourceField && filter==conditionFilter && arg==conditionArg)){
+                bootGrowl("过滤条件已存在.", "danger");
+                // break;
+                return false;
+             }
+        });
+        if(repeated){ return; }
+
+        var trHtml = "<tr>";
+        trHtml += "<td>" + conditionOperation + "</td>";
+        trHtml += "<td>" + conditionSourceField + "</td>";
+        trHtml += "<td>" + conditionFilter + "</td>";
+        trHtml += "<td>" + conditionArg + "</td>";
+        trHtml += "<td><a class='fa fa-remove fa-2x conditionDelete dbsyncer_pointer' title='删除' ></a></td>";
+        trHtml += "</tr>";
+        $conditionList.append(trHtml);
+        // 清空参数
+        $conditionArg.val("");
+        bindConditionListClick();
+    })
+}
+
 $(function() {
-    console.log(123);
+    bindConditionListClick();
+    bindConditionAddClick();
 });

+ 1 - 1
dbsyncer-web/src/main/resources/static/js/mapping/editMappingTableGroup.js

@@ -30,7 +30,7 @@ function bindFieldMappingAddClick(){
              var tf = $(this).find("td:eq(1)").text();
              if(repeated = (sField==sf && tField==tf)){
                 bootGrowl("映射关系已存在.", "danger");
-                return;
+                return false;
              }
         });
         if(repeated){ return; }

+ 6 - 6
dbsyncer-web/src/main/resources/templates/mapping/editMappingFilter.html

@@ -11,7 +11,7 @@
                 <label class="col-sm-3 control-label text-right">组合</label>
                 <div class="col-sm-9">
                     <select id="conditionOperation" class="form-control select-control">
-                        <option th:each="o,s:${condition?.operation}" th:value="${o?.code}" th:text="${o?.name}" />
+                        <option th:each="o,s:${condition?.operation}" th:value="${o?.name}" th:text="${o?.name}" />
                     </select>
                 </div>
             </div>
@@ -27,7 +27,7 @@
                 <label class="col-sm-3 control-label text-right">条件</label>
                 <div class="col-sm-9">
                     <select id="conditionFilter" class="form-control select-control">
-                        <option th:each="f,s:${condition?.filter}" th:value="${f?.name}" th:text="${f?.code}" />
+                        <option th:each="f,s:${condition?.filter}" th:value="${f?.name}" th:text="${f?.name}" />
                     </select>
                 </div>
             </div>
@@ -39,12 +39,12 @@
             <div class="col-md-4">
                 <label class="col-sm-3 control-label text-right">参数</label>
                 <div class="col-sm-9">
-                    <textarea id="filterArg" class="form-control" rows="2" placeholder="请输入参数"></textarea>
+                    <textarea id="conditionArg" class="form-control" rows="2" placeholder="请输入参数"></textarea>
                 </div>
             </div>
             <div class="col-md-7"></div>
             <div class="col-md-1">
-                <button id="filterAdd" type="button" class="btn btn-primary">
+                <button id="conditionAdd" type="button" class="btn btn-primary">
                     <span class="fa fa-plus"></span>添加
                 </button>
             </div>
@@ -65,13 +65,13 @@
                         <th>操作</th>
                     </tr>
                     </thead>
-                    <tbody class="filterList">
+                    <tbody id="conditionList">
                     <tr>
                         <td>and</td>
                         <td>NAME</td>
                         <td>=</td>
                         <td>张三</td>
-                        <td><a class='fa fa-remove fa-2x filterDelete dbsyncer_pointer' title='删除' ></a></td>
+                        <td><a class='fa fa-remove fa-2x conditionDelete dbsyncer_pointer' title='删除' ></a></td>
                     </tr>
                     </tbody>
                 </table>

+ 1 - 0
dbsyncer-web/src/main/resources/templates/mapping/editMappingTableGroup.html

@@ -178,4 +178,5 @@
 </div>
 
 <script th:src="@{/js/mapping/editMappingTableGroup.js}"></script>
+<script th:src="@{/js/mapping/editMappingFilterAndConvert.js}"></script>
 </html>