Quellcode durchsuchen

支持增量同步根据过滤时间条件筛选

AE86 vor 2 Jahren
Ursprung
Commit
ec6970414b

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

@@ -25,19 +25,19 @@ public enum FilterEnum {
     /**
      * 大于
      */
-    GT(">", (value, filterValue) -> NumberUtil.toInt(value) > NumberUtil.toInt(filterValue)),
+    GT(">", (value, filterValue) -> NumberUtil.toLong(value) > NumberUtil.toLong(filterValue)),
     /**
      * 小于
      */
-    LT("<", (value, filterValue) -> NumberUtil.toInt(value) < NumberUtil.toInt(filterValue)),
+    LT("<", (value, filterValue) -> NumberUtil.toLong(value) < NumberUtil.toLong(filterValue)),
     /**
      * 大于等于
      */
-    GT_AND_EQUAL(">=", (value, filterValue) -> NumberUtil.toInt(value) >= NumberUtil.toInt(filterValue)),
+    GT_AND_EQUAL(">=", (value, filterValue) -> NumberUtil.toLong(value) >= NumberUtil.toLong(filterValue)),
     /**
      * 小于等于
      */
-    LT_AND_EQUAL("<=", (value, filterValue) -> NumberUtil.toInt(value) <= NumberUtil.toInt(filterValue)),
+    LT_AND_EQUAL("<=", (value, filterValue) -> NumberUtil.toLong(value) <= NumberUtil.toLong(filterValue)),
     /**
      * 模糊匹配
      */

+ 33 - 5
dbsyncer-manager/src/main/java/org/dbsyncer/manager/model/FieldPicker.java

@@ -1,6 +1,7 @@
 package org.dbsyncer.manager.model;
 
 import org.dbsyncer.common.util.CollectionUtils;
+import org.dbsyncer.common.util.DateFormatUtil;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.connector.CompareFilter;
 import org.dbsyncer.connector.enums.FilterEnum;
@@ -11,6 +12,8 @@ import org.dbsyncer.parser.model.FieldMapping;
 import org.dbsyncer.parser.model.TableGroup;
 import org.springframework.util.Assert;
 
+import java.sql.Date;
+import java.sql.Timestamp;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -60,15 +63,13 @@ public class FieldPicker {
         }
         // where (id > 1 and id < 100) or (id = 100 or id =101)
         // 或 关系(成立任意条件)
-        CompareFilter filter = null;
         Object value = null;
         for (Filter f : or) {
             value = row.get(f.getName());
             if (null == value) {
                 continue;
             }
-            filter = FilterEnum.getCompareFilter(f.getFilter());
-            if (filter.compare(String.valueOf(value), f.getValue())) {
+            if (compareValueWithFilter(f, value)) {
                 return true;
             }
         }
@@ -80,8 +81,7 @@ public class FieldPicker {
             if (null == value) {
                 continue;
             }
-            filter = FilterEnum.getCompareFilter(f.getFilter());
-            if (!filter.compare(String.valueOf(value), f.getValue())) {
+            if (!compareValueWithFilter(f, value)) {
                 return false;
             }
             pass = true;
@@ -90,6 +90,34 @@ public class FieldPicker {
         return pass;
     }
 
+    /**
+     * 比较值是否满足过滤条件
+     *
+     * @param filter        过滤器
+     * @param comparedValue 比较值
+     * @return
+     */
+    private boolean compareValueWithFilter(Filter filter, Object comparedValue) {
+        CompareFilter compareFilter = FilterEnum.getCompareFilter(filter.getFilter());
+        if (null == filter) {
+            return false;
+        }
+
+        // 支持时间比较
+        if (comparedValue instanceof Timestamp) {
+            Timestamp comparedTimestamp = (Timestamp) comparedValue;
+            Timestamp filterTimestamp = DateFormatUtil.stringToTimestamp(filter.getValue());
+            return compareFilter.compare(String.valueOf(comparedTimestamp.getTime()), String.valueOf(filterTimestamp.getTime()));
+        }
+        if (comparedValue instanceof Date) {
+            Date comparedDate = (Date) comparedValue;
+            Date filterDate = DateFormatUtil.stringToDate(filter.getValue());
+            return compareFilter.compare(String.valueOf(comparedDate.getTime()), String.valueOf(filterDate.getTime()));
+        }
+
+        return compareFilter.compare(String.valueOf(comparedValue), filter.getValue());
+    }
+
     private void init(List<Filter> filter, List<Field> column, List<FieldMapping> fieldMapping) {
         // column  => [1, 86, 0, 中文, 2020-05-15T12:17:22.000+0800, 备注信息]
         Assert.notEmpty(column, "读取字段不能为空.");