TableGroupContextImpl.java 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /**
  2. * DBSyncer Copyright 2020-2025 All Rights Reserved.
  3. */
  4. package org.dbsyncer.parser.impl;
  5. import org.dbsyncer.parser.TableGroupContext;
  6. import org.dbsyncer.parser.model.Mapping;
  7. import org.dbsyncer.parser.model.TableGroup;
  8. import org.dbsyncer.parser.model.TableGroupPicker;
  9. import org.dbsyncer.parser.util.PickerUtil;
  10. import org.springframework.stereotype.Component;
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. import java.util.Map;
  14. import java.util.concurrent.ConcurrentHashMap;
  15. /**
  16. * @Author 穿云
  17. * @Version 1.0.0
  18. * @Date 2025-01-16 23:34
  19. */
  20. @Component
  21. public final class TableGroupContextImpl implements TableGroupContext {
  22. /**
  23. * 驱动表映射关系
  24. */
  25. private final Map<String, InnerMapping> tableGroupMap = new ConcurrentHashMap<>();
  26. @Override
  27. public void put(Mapping mapping, List<TableGroup> tableGroups) {
  28. tableGroupMap.computeIfAbsent(mapping.getMetaId(), k -> {
  29. InnerMapping innerMap = new InnerMapping();
  30. tableGroups.forEach(tableGroup -> {
  31. String sourceTableName = tableGroup.getSourceTable().getName();
  32. innerMap.add(sourceTableName, PickerUtil.mergeTableGroupConfig(mapping, tableGroup));
  33. });
  34. return innerMap;
  35. });
  36. }
  37. @Override
  38. public void update(Mapping mapping, List<TableGroup> tableGroups) {
  39. tableGroupMap.computeIfPresent(mapping.getMetaId(), (k, innerMap) -> {
  40. // 先清空表映射关系,再更新表映射关系
  41. tableGroups.stream().findFirst().ifPresent(tableGroup -> innerMap.remove(tableGroup.getSourceTable().getName()));
  42. tableGroups.forEach(tableGroup -> {
  43. String sourceTableName = tableGroup.getSourceTable().getName();
  44. innerMap.add(sourceTableName, PickerUtil.mergeTableGroupConfig(mapping, tableGroup));
  45. });
  46. return innerMap;
  47. });
  48. }
  49. @Override
  50. public List<TableGroupPicker> getTableGroupPickers(String metaId, String tableName) {
  51. List<TableGroupPicker> list = new ArrayList<>();
  52. tableGroupMap.computeIfPresent(metaId, (k, innerMapping) -> {
  53. innerMapping.pickerMap.computeIfPresent(tableName, (x, pickers) -> {
  54. list.addAll(pickers);
  55. return pickers;
  56. });
  57. return innerMapping;
  58. });
  59. return list;
  60. }
  61. @Override
  62. public void clear(String metaId) {
  63. tableGroupMap.remove(metaId);
  64. }
  65. static final class InnerMapping {
  66. Map<String, List<TableGroupPicker>> pickerMap = new ConcurrentHashMap<>();
  67. public void add(String tableName, TableGroup tableGroup) {
  68. pickerMap.computeIfAbsent(tableName, k -> new ArrayList<>()).add(new TableGroupPicker(tableGroup));
  69. }
  70. public void remove(String tableName) {
  71. pickerMap.remove(tableName);
  72. }
  73. }
  74. }