|
@@ -1,9 +1,16 @@
|
|
|
package org.dbsyncer.parser.model;
|
|
|
|
|
|
import org.dbsyncer.common.util.CollectionUtils;
|
|
|
+import org.dbsyncer.common.util.DateFormatUtil;
|
|
|
import org.dbsyncer.common.util.StringUtil;
|
|
|
+import org.dbsyncer.sdk.enums.FilterEnum;
|
|
|
+import org.dbsyncer.sdk.enums.OperationEnum;
|
|
|
+import org.dbsyncer.sdk.filter.CompareFilter;
|
|
|
import org.dbsyncer.sdk.model.Field;
|
|
|
+import org.dbsyncer.sdk.model.Filter;
|
|
|
|
|
|
+import java.sql.Date;
|
|
|
+import java.sql.Timestamp;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
@@ -11,21 +18,35 @@ public class Picker {
|
|
|
|
|
|
private final List<Field> sourceFields = new ArrayList<>();
|
|
|
private final List<Field> targetFields = new ArrayList<>();
|
|
|
+ private final int sFieldSize;
|
|
|
+ private final int tFieldSize;
|
|
|
+ private final TableGroup tableGroup;
|
|
|
+ private final boolean enabledFilter;
|
|
|
+ private List<Filter> add;
|
|
|
+ private List<Filter> or;
|
|
|
|
|
|
- public Picker(List<FieldMapping> fieldMapping) {
|
|
|
- if (!CollectionUtils.isEmpty(fieldMapping)) {
|
|
|
- fieldMapping.forEach(m -> {
|
|
|
+ public Picker(TableGroup tableGroup) {
|
|
|
+ this.tableGroup = tableGroup;
|
|
|
+ if (!CollectionUtils.isEmpty(tableGroup.getFieldMapping())) {
|
|
|
+ tableGroup.getFieldMapping().forEach(m -> {
|
|
|
sourceFields.add(m.getSource());
|
|
|
targetFields.add(m.getTarget());
|
|
|
});
|
|
|
}
|
|
|
+ this.sFieldSize = sourceFields.size();
|
|
|
+ this.tFieldSize = targetFields.size();
|
|
|
+ // 解析过滤条件
|
|
|
+ List<Filter> filter = tableGroup.getFilter();
|
|
|
+ enabledFilter = !CollectionUtils.isEmpty(filter);
|
|
|
+ if (enabledFilter) {
|
|
|
+ add = filter.stream().filter(f -> StringUtil.equals(f.getOperation(), OperationEnum.AND.getName())).collect(Collectors.toList());
|
|
|
+ or = filter.stream().filter(f -> StringUtil.equals(f.getOperation(), OperationEnum.OR.getName())).collect(Collectors.toList());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public List<Map> pickTargetData(List<Map> source) {
|
|
|
List<Map> targetMapList = new ArrayList<>();
|
|
|
if (!CollectionUtils.isEmpty(source)) {
|
|
|
- final int sFieldSize = sourceFields.size();
|
|
|
- final int tFieldSize = targetFields.size();
|
|
|
Map<String, Object> target = null;
|
|
|
for (Map row : source) {
|
|
|
target = new HashMap<>();
|
|
@@ -38,21 +59,24 @@ public class Picker {
|
|
|
|
|
|
public List<Map> pickTargetData(List<List<Object>> rows, List<Map> sourceMapList) {
|
|
|
List<Map> targetMapList = new ArrayList<>();
|
|
|
- if (!CollectionUtils.isEmpty(rows)) {
|
|
|
- final int sFieldSize = sourceFields.size();
|
|
|
- final int tFieldSize = targetFields.size();
|
|
|
- Map<String, Object> source = null;
|
|
|
- Map<String, Object> target = null;
|
|
|
- List<Object> row = null;
|
|
|
- List<Field> sFields = getFields(sourceFields);
|
|
|
- for (int i = 0; i < rows.size(); i++) {
|
|
|
- source = new HashMap<>();
|
|
|
- target = new HashMap<>();
|
|
|
- row = rows.get(i);
|
|
|
- for (int j = 0; j < row.size(); j++) {
|
|
|
- source.put(sFields.get(j).getName(), row.get(j));
|
|
|
- }
|
|
|
- exchange(sFieldSize, tFieldSize, sourceFields, targetFields, source, target);
|
|
|
+ if (CollectionUtils.isEmpty(rows)) {
|
|
|
+ return targetMapList;
|
|
|
+ }
|
|
|
+ Map<String, Object> source = null;
|
|
|
+ Map<String, Object> target = null;
|
|
|
+ for (List<Object> row : rows) {
|
|
|
+ // 排除下标不一致的数据
|
|
|
+ if (row.size() != getOriginalFields().size()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ source = new HashMap<>();
|
|
|
+ for (int j = 0; j < getOriginalFields().size(); j++) {
|
|
|
+ source.put(getOriginalFields().get(j).getName(), row.get(j));
|
|
|
+ }
|
|
|
+ target = new HashMap<>();
|
|
|
+ exchange(sFieldSize, tFieldSize, sourceFields, targetFields, source, target);
|
|
|
+ // 根据条件过滤数据
|
|
|
+ if (filter(target)) {
|
|
|
sourceMapList.add(source);
|
|
|
targetMapList.add(target);
|
|
|
}
|
|
@@ -63,7 +87,7 @@ public class Picker {
|
|
|
public List<Object> pickSourceData(Map target) {
|
|
|
Map<String, Object> source = new HashMap<>();
|
|
|
if (!CollectionUtils.isEmpty(target)) {
|
|
|
- exchange(targetFields.size(), sourceFields.size(), targetFields, sourceFields, target, source);
|
|
|
+ exchange(tFieldSize, sFieldSize, targetFields, sourceFields, target, source);
|
|
|
}
|
|
|
|
|
|
return getFields(sourceFields).stream().map(field -> source.get(field.getName())).collect(Collectors.toList());
|
|
@@ -81,6 +105,64 @@ public class Picker {
|
|
|
return targetFields.stream().filter(Objects::nonNull).collect(Collectors.toMap(Field::getName, f -> f, (k1, k2) -> k1));
|
|
|
}
|
|
|
|
|
|
+ private boolean filter(Map<String, Object> row) {
|
|
|
+ if (!enabledFilter) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ // where (id > 1 and id < 100) or (id = 100 or id =101)
|
|
|
+ // 或 关系(成立任意条件)
|
|
|
+ Object value = null;
|
|
|
+ for (Filter f : or) {
|
|
|
+ value = row.get(f.getName());
|
|
|
+ if (null == value) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (compareValueWithFilter(f, value)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ boolean pass = false;
|
|
|
+ // 并 关系(成立所有条件)
|
|
|
+ for (Filter f : add) {
|
|
|
+ value = row.get(f.getName());
|
|
|
+ if (null == value) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (!compareValueWithFilter(f, value)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ pass = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ return pass;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 比较值是否满足过滤条件
|
|
|
+ *
|
|
|
+ * @param filter 过滤器
|
|
|
+ * @param comparedValue 比较值
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean compareValueWithFilter(Filter filter, Object comparedValue) {
|
|
|
+ CompareFilter compareFilter = FilterEnum.getCompareFilter(filter.getFilter());
|
|
|
+
|
|
|
+ // 支持时间比较
|
|
|
+ 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 java.sql.Date) {
|
|
|
+ java.sql.Date comparedDate = (java.sql.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 exchange(int sFieldSize, int tFieldSize, List<Field> sFields, List<Field> tFields, Map<String, Object> source, Map<String, Object> target) {
|
|
|
Field sField = null;
|
|
|
Field tField = null;
|
|
@@ -92,7 +174,7 @@ public class Picker {
|
|
|
tField = tFields.get(k);
|
|
|
}
|
|
|
if (null != sField && null != tField) {
|
|
|
- v = source.get(sField.isUnmodifiabled() ? sField.getLabelName() : sField.getName());
|
|
|
+ v = source.get(sField.getName());
|
|
|
tFieldName = tField.getName();
|
|
|
// 映射值
|
|
|
if (!target.containsKey(tFieldName)) {
|
|
@@ -118,4 +200,8 @@ public class Picker {
|
|
|
return Collections.unmodifiableList(fields);
|
|
|
}
|
|
|
|
|
|
+ private List<Field> getOriginalFields() {
|
|
|
+ return tableGroup.getSourceTable().getColumn();
|
|
|
+ }
|
|
|
+
|
|
|
}
|