Picker.java 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package org.dbsyncer.parser.model;
  2. import org.dbsyncer.common.util.CollectionUtils;
  3. import org.dbsyncer.common.util.DateFormatUtil;
  4. import org.dbsyncer.common.util.StringUtil;
  5. import org.dbsyncer.sdk.enums.FilterEnum;
  6. import org.dbsyncer.sdk.enums.OperationEnum;
  7. import org.dbsyncer.sdk.filter.CompareFilter;
  8. import org.dbsyncer.sdk.model.Field;
  9. import org.dbsyncer.sdk.model.Filter;
  10. import java.sql.Date;
  11. import java.sql.Timestamp;
  12. import java.util.*;
  13. import java.util.stream.Collectors;
  14. public class Picker {
  15. private final List<Field> sourceFields = new ArrayList<>();
  16. private final List<Field> targetFields = new ArrayList<>();
  17. private final int sFieldSize;
  18. private final int tFieldSize;
  19. private final TableGroup tableGroup;
  20. private final boolean enabledFilter;
  21. private List<Filter> add;
  22. private List<Filter> or;
  23. public Picker(TableGroup tableGroup) {
  24. this.tableGroup = tableGroup;
  25. if (!CollectionUtils.isEmpty(tableGroup.getFieldMapping())) {
  26. tableGroup.getFieldMapping().forEach(m -> {
  27. sourceFields.add(m.getSource());
  28. targetFields.add(m.getTarget());
  29. });
  30. }
  31. this.sFieldSize = sourceFields.size();
  32. this.tFieldSize = targetFields.size();
  33. // 解析过滤条件
  34. List<Filter> filter = tableGroup.getFilter();
  35. enabledFilter = !CollectionUtils.isEmpty(filter);
  36. if (enabledFilter) {
  37. add = filter.stream().filter(f -> StringUtil.equals(f.getOperation(), OperationEnum.AND.getName())).collect(Collectors.toList());
  38. or = filter.stream().filter(f -> StringUtil.equals(f.getOperation(), OperationEnum.OR.getName())).collect(Collectors.toList());
  39. }
  40. }
  41. public List<Map> pickTargetData(List<Map> source) {
  42. List<Map> targetMapList = new ArrayList<>();
  43. if (!CollectionUtils.isEmpty(source)) {
  44. Map<String, Object> target = null;
  45. for (Map row : source) {
  46. target = new HashMap<>();
  47. exchange(sFieldSize, tFieldSize, sourceFields, targetFields, row, target);
  48. targetMapList.add(target);
  49. }
  50. }
  51. return targetMapList;
  52. }
  53. public List<Map> pickTargetData(List<List<Object>> rows, List<Map> sourceMapList) {
  54. List<Map> targetMapList = new ArrayList<>();
  55. if (CollectionUtils.isEmpty(rows)) {
  56. return targetMapList;
  57. }
  58. Map<String, Object> source = null;
  59. Map<String, Object> target = null;
  60. for (List<Object> row : rows) {
  61. // 排除下标不一致的数据
  62. if (row.size() != getOriginalFields().size()) {
  63. continue;
  64. }
  65. source = new HashMap<>();
  66. for (int j = 0; j < getOriginalFields().size(); j++) {
  67. source.put(getOriginalFields().get(j).getName(), row.get(j));
  68. }
  69. target = new HashMap<>();
  70. exchange(sFieldSize, tFieldSize, sourceFields, targetFields, source, target);
  71. // 根据条件过滤数据
  72. if (filter(target)) {
  73. sourceMapList.add(source);
  74. targetMapList.add(target);
  75. }
  76. }
  77. return targetMapList;
  78. }
  79. public List<Object> pickSourceData(Map target) {
  80. Map<String, Object> source = new HashMap<>();
  81. if (!CollectionUtils.isEmpty(target)) {
  82. exchange(tFieldSize, sFieldSize, targetFields, sourceFields, target, source);
  83. }
  84. return getFields(sourceFields).stream().map(field -> source.get(field.getName())).collect(Collectors.toList());
  85. }
  86. public List<Field> getSourceFields() {
  87. return getFields(sourceFields);
  88. }
  89. public List<Field> getTargetFields() {
  90. return getFields(targetFields);
  91. }
  92. public Map<String, Field> getTargetFieldMap() {
  93. return targetFields.stream().filter(Objects::nonNull).collect(Collectors.toMap(Field::getName, f -> f, (k1, k2) -> k1));
  94. }
  95. private boolean filter(Map<String, Object> row) {
  96. if (!enabledFilter) {
  97. return true;
  98. }
  99. // where (id > 1 and id < 100) or (id = 100 or id =101)
  100. // 或 关系(成立任意条件)
  101. Object value = null;
  102. for (Filter f : or) {
  103. value = row.get(f.getName());
  104. if (null == value) {
  105. continue;
  106. }
  107. if (compareValueWithFilter(f, value)) {
  108. return true;
  109. }
  110. }
  111. boolean pass = false;
  112. // 并 关系(成立所有条件)
  113. for (Filter f : add) {
  114. value = row.get(f.getName());
  115. if (null == value) {
  116. continue;
  117. }
  118. if (!compareValueWithFilter(f, value)) {
  119. return false;
  120. }
  121. pass = true;
  122. }
  123. return pass;
  124. }
  125. /**
  126. * 比较值是否满足过滤条件
  127. *
  128. * @param filter 过滤器
  129. * @param comparedValue 比较值
  130. * @return
  131. */
  132. private boolean compareValueWithFilter(Filter filter, Object comparedValue) {
  133. CompareFilter compareFilter = FilterEnum.getCompareFilter(filter.getFilter());
  134. // 支持时间比较
  135. if (comparedValue instanceof Timestamp) {
  136. Timestamp comparedTimestamp = (Timestamp) comparedValue;
  137. Timestamp filterTimestamp = DateFormatUtil.stringToTimestamp(filter.getValue());
  138. return compareFilter.compare(String.valueOf(comparedTimestamp.getTime()), String.valueOf(filterTimestamp.getTime()));
  139. }
  140. if (comparedValue instanceof java.sql.Date) {
  141. java.sql.Date comparedDate = (java.sql.Date) comparedValue;
  142. Date filterDate = DateFormatUtil.stringToDate(filter.getValue());
  143. return compareFilter.compare(String.valueOf(comparedDate.getTime()), String.valueOf(filterDate.getTime()));
  144. }
  145. return compareFilter.compare(String.valueOf(comparedValue), filter.getValue());
  146. }
  147. private void exchange(int sFieldSize, int tFieldSize, List<Field> sFields, List<Field> tFields, Map<String, Object> source, Map<String, Object> target) {
  148. Field sField = null;
  149. Field tField = null;
  150. Object v = null;
  151. String tFieldName = null;
  152. for (int k = 0; k < sFieldSize; k++) {
  153. sField = sFields.get(k);
  154. if (k < tFieldSize) {
  155. tField = tFields.get(k);
  156. }
  157. if (null != sField && null != tField) {
  158. v = source.get(sField.getName());
  159. tFieldName = tField.getName();
  160. // 映射值
  161. if (!target.containsKey(tFieldName)) {
  162. target.put(tFieldName, v);
  163. continue;
  164. }
  165. // 合并值
  166. target.put(tFieldName, StringUtil.toString(target.get(tFieldName)) + StringUtil.toString(v));
  167. }
  168. }
  169. }
  170. private List<Field> getFields(List<Field> list) {
  171. List<Field> fields = new ArrayList<>();
  172. Set<String> keys = new HashSet<>();
  173. list.forEach(f -> {
  174. if (f != null && !keys.contains(f.getName())) {
  175. fields.add(f);
  176. keys.add(f.getName());
  177. }
  178. });
  179. keys.clear();
  180. return Collections.unmodifiableList(fields);
  181. }
  182. private List<Field> getOriginalFields() {
  183. return tableGroup.getSourceTable().getColumn();
  184. }
  185. }