feat: diff result can show removed items

This commit is contained in:
vran 2022-05-27 13:13:23 +08:00
parent 3cd8707659
commit 25cd496395
2 changed files with 118 additions and 80 deletions

View File

@ -0,0 +1,108 @@
package com.databasir.core.domain.document.diff;
import com.databasir.core.diff.data.DiffType;
import com.databasir.core.domain.document.comparator.DiffResult;
import com.databasir.core.domain.document.comparator.TableDiffResult;
import com.databasir.core.domain.document.data.DiffAble;
import com.databasir.core.domain.document.data.TableDocumentResponse;
import com.databasir.core.domain.document.data.TableDocumentResponse.ForeignKeyDocumentResponse;
import java.util.Collection;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import static java.util.Collections.emptyList;
public class DiffTypeFills {
public static TableDocumentResponse fillRemoved(TableDocumentResponse data) {
data.setDiffType(DiffType.REMOVED);
data.getColumns().forEach(col -> col.setDiffType(DiffType.REMOVED));
data.getForeignKeys().forEach(col -> col.setDiffType(DiffType.REMOVED));
data.getIndexes().forEach(col -> col.setDiffType(DiffType.REMOVED));
data.getTriggers().forEach(col -> col.setDiffType(DiffType.REMOVED));
return data;
}
public static TableDocumentResponse fillAdded(TableDocumentResponse data, TableDiffResult diff) {
data.setDiffType(DiffType.ADDED);
var cols =
diff(diff.getColumnDiffResults(), emptyList(), data.getColumns(), i -> i.getName());
data.setColumns(cols);
var indexes =
diff(diff.getIndexDiffResults(), emptyList(), data.getIndexes(), i -> i.getName());
data.setIndexes(indexes);
var foreignKeys = foreignKeyDiff(diff.getForeignKeyDiffResults(),
emptyList(), data.getForeignKeys());
data.setForeignKeys(foreignKeys);
var triggers =
diff(diff.getTriggerDiffResults(), emptyList(), data.getTriggers(), t -> t.getName());
data.setTriggers(triggers);
return data;
}
public static TableDocumentResponse fillModified(TableDocumentResponse current,
TableDocumentResponse original,
TableDiffResult diff) {
current.setDiffType(DiffType.MODIFIED);
current.setOriginal(original);
var cols =
diff(diff.getColumnDiffResults(), original.getColumns(), current.getColumns(),
col -> col.getName());
current.setColumns(cols);
var indexes =
diff(diff.getIndexDiffResults(), original.getIndexes(), current.getIndexes(), i -> i.getName());
current.setIndexes(indexes);
var foreignKeys = foreignKeyDiff(diff.getForeignKeyDiffResults(),
original.getForeignKeys(), current.getForeignKeys());
current.setForeignKeys(foreignKeys);
var triggers =
diff(diff.getTriggerDiffResults(), original.getTriggers(), current.getTriggers(),
t -> t.getName());
current.setTriggers(triggers);
return current;
}
public static <T extends DiffAble> List<T> diff(Collection<DiffResult> diffs,
Collection<T> original,
Collection<T> current,
Function<T, String> idMapping) {
var currentMapByName = current.stream()
.collect(Collectors.toMap(idMapping, Function.identity(), (a, b) -> a));
var originalMapByName = original.stream()
.collect(Collectors.toMap(idMapping, Function.identity(), (a, b) -> a));
return diffs.stream().map(diff -> {
if (diff.getDiffType() == DiffType.ADDED) {
var t = currentMapByName.get(diff.getId());
t.setDiffType(DiffType.ADDED);
return t;
}
if (diff.getDiffType() == DiffType.REMOVED) {
var t = originalMapByName.get(diff.getId());
t.setDiffType(DiffType.REMOVED);
return t;
}
if (diff.getDiffType() == DiffType.MODIFIED) {
var c = currentMapByName.get(diff.getId());
var o = originalMapByName.get(diff.getId());
c.setDiffType(DiffType.MODIFIED);
c.setOriginal(o);
return c;
}
var t = currentMapByName.get(diff.getId());
t.setDiffType(DiffType.NONE);
return t;
})
.collect(Collectors.toList());
}
public static List<ForeignKeyDocumentResponse> foreignKeyDiff(Collection<DiffResult> diffs,
Collection<ForeignKeyDocumentResponse> original,
Collection<ForeignKeyDocumentResponse> current) {
Function<ForeignKeyDocumentResponse, String> idMapping = fk -> {
return fk.getFkTableName() + "." + fk.getFkColumnName() + "." + fk.getKeySeq();
};
return diff(diffs, original, current, idMapping);
}
}

View File

@ -7,12 +7,11 @@ import com.databasir.core.diff.Diffs;
import com.databasir.core.diff.data.DiffType; import com.databasir.core.diff.data.DiffType;
import com.databasir.core.diff.data.RootDiff; import com.databasir.core.diff.data.RootDiff;
import com.databasir.core.domain.DomainErrors; import com.databasir.core.domain.DomainErrors;
import com.databasir.core.domain.document.comparator.DiffResult;
import com.databasir.core.domain.document.comparator.DocumentDiffs; import com.databasir.core.domain.document.comparator.DocumentDiffs;
import com.databasir.core.domain.document.comparator.TableDiffResult; import com.databasir.core.domain.document.comparator.TableDiffResult;
import com.databasir.core.domain.document.converter.*; import com.databasir.core.domain.document.converter.*;
import com.databasir.core.domain.document.data.*; import com.databasir.core.domain.document.data.*;
import com.databasir.core.domain.document.data.TableDocumentResponse.ForeignKeyDocumentResponse; import com.databasir.core.domain.document.diff.DiffTypeFills;
import com.databasir.core.domain.document.diff.DiffTypePredictor; import com.databasir.core.domain.document.diff.DiffTypePredictor;
import com.databasir.core.domain.document.event.DocumentUpdated; import com.databasir.core.domain.document.event.DocumentUpdated;
import com.databasir.core.domain.document.generator.DocumentFileGenerator; import com.databasir.core.domain.document.generator.DocumentFileGenerator;
@ -28,13 +27,13 @@ import com.databasir.dao.tables.pojos.*;
import com.databasir.dao.value.DocumentDiscussionCountPojo; import com.databasir.dao.value.DocumentDiscussionCountPojo;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.jooq.tools.StringUtils; import org.jooq.tools.StringUtils;
import org.springframework.dao.DuplicateKeyException; import org.springframework.dao.DuplicateKeyException;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.io.OutputStream; import java.io.OutputStream;
import java.sql.Connection; import java.sql.Connection;
@ -238,7 +237,7 @@ public class DocumentService {
descriptionMapByTableName descriptionMapByTableName
); );
// if original version is not null mean version diff enabled // if original version is not null means version diff enabled
if (originalVersion != null) { if (originalVersion != null) {
var originalDocument = var originalDocument =
databaseDocumentDao.selectOptionalByProjectIdAndVersion(projectId, originalVersion) databaseDocumentDao.selectOptionalByProjectIdAndVersion(projectId, originalVersion)
@ -444,6 +443,8 @@ public class DocumentService {
return emptyList(); return emptyList();
} }
var current = this.getTableDetails(projectId, databaseDocumentId, request.getTableIds()); var current = this.getTableDetails(projectId, databaseDocumentId, request.getTableIds());
List<Integer> currentTableIds = current.stream().map(t -> t.getId()).collect(Collectors.toList());
var missedIds = CollectionUtils.disjunction(currentTableIds, request.getTableIds());
if (request.getOriginalVersion() != null) { if (request.getOriginalVersion() != null) {
DatabaseDocumentPojo doc = DatabaseDocumentPojo doc =
databaseDocumentDao.selectOptionalByProjectIdAndVersion(projectId, request.getOriginalVersion()) databaseDocumentDao.selectOptionalByProjectIdAndVersion(projectId, request.getOriginalVersion())
@ -451,7 +452,8 @@ public class DocumentService {
List<String> tableNames = current.stream().map(t -> t.getName()).distinct().collect(Collectors.toList()); List<String> tableNames = current.stream().map(t -> t.getName()).distinct().collect(Collectors.toList());
List<Integer> originalTableIds = List<Integer> originalTableIds =
tableDocumentDao.selectTableIdsByDatabaseDocumentIdAndTableNameIn(doc.getId(), tableNames); tableDocumentDao.selectTableIdsByDatabaseDocumentIdAndTableNameIn(doc.getId(), tableNames);
var original = this.getTableDetails(projectId, doc.getId(), originalTableIds); var allOriginalTableIds = CollectionUtils.union(missedIds, originalTableIds);
var original = this.getTableDetails(projectId, doc.getId(), allOriginalTableIds);
Map<String, TableDocumentResponse> currentMapByName = current.stream() Map<String, TableDocumentResponse> currentMapByName = current.stream()
.collect(Collectors.toMap(TableDocumentResponse::getName, Function.identity(), (a, b) -> a)); .collect(Collectors.toMap(TableDocumentResponse::getName, Function.identity(), (a, b) -> a));
Map<String, TableDocumentResponse> originalMapByName = original.stream() Map<String, TableDocumentResponse> originalMapByName = original.stream()
@ -463,46 +465,16 @@ public class DocumentService {
.map(diff -> { .map(diff -> {
if (diff.getDiffType() == DiffType.ADDED) { if (diff.getDiffType() == DiffType.ADDED) {
TableDocumentResponse c = currentMapByName.get(diff.getId()); TableDocumentResponse c = currentMapByName.get(diff.getId());
c.setDiffType(DiffType.ADDED); return DiffTypeFills.fillAdded(c, diff);
var cols =
diff(diff.getColumnDiffResults(), emptyList(), c.getColumns(), i -> i.getName());
c.setColumns(cols);
var indexes =
diff(diff.getIndexDiffResults(), emptyList(), c.getIndexes(), i -> i.getName());
c.setIndexes(indexes);
var foreignKeys = foreignKeyDiff(diff.getForeignKeyDiffResults(),
emptyList(), c.getForeignKeys());
c.setForeignKeys(foreignKeys);
var triggers =
diff(diff.getTriggerDiffResults(), emptyList(), c.getTriggers(), t -> t.getName());
c.setTriggers(triggers);
return c;
} }
if (diff.getDiffType() == DiffType.REMOVED) { if (diff.getDiffType() == DiffType.REMOVED) {
TableDocumentResponse t = originalMapByName.get(diff.getId()); TableDocumentResponse t = originalMapByName.get(diff.getId());
t.setDiffType(DiffType.REMOVED); return DiffTypeFills.fillRemoved(t);
return t;
} }
if (diff.getDiffType() == DiffType.MODIFIED) { if (diff.getDiffType() == DiffType.MODIFIED) {
TableDocumentResponse c = currentMapByName.get(diff.getId()); TableDocumentResponse c = currentMapByName.get(diff.getId());
TableDocumentResponse o = originalMapByName.get(diff.getId()); TableDocumentResponse o = originalMapByName.get(diff.getId());
c.setDiffType(DiffType.MODIFIED); return DiffTypeFills.fillModified(c, o, diff);
c.setOriginal(o);
var cols =
diff(diff.getColumnDiffResults(), o.getColumns(), c.getColumns(),
col -> col.getName());
c.setColumns(cols);
var indexes =
diff(diff.getIndexDiffResults(), o.getIndexes(), c.getIndexes(), i -> i.getName());
c.setIndexes(indexes);
var foreignKeys = foreignKeyDiff(diff.getForeignKeyDiffResults(),
o.getForeignKeys(), c.getForeignKeys());
c.setForeignKeys(foreignKeys);
var triggers =
diff(diff.getTriggerDiffResults(), o.getTriggers(), c.getTriggers(),
t -> t.getName());
c.setTriggers(triggers);
return c;
} }
TableDocumentResponse t = currentMapByName.get(diff.getId()); TableDocumentResponse t = currentMapByName.get(diff.getId());
t.setDiffType(DiffType.NONE); t.setDiffType(DiffType.NONE);
@ -567,46 +539,4 @@ public class DocumentService {
return tableResponseConverter.from(tables, columnMapByTableId); return tableResponseConverter.from(tables, columnMapByTableId);
} }
} }
private <T extends DiffAble> List<T> diff(Collection<DiffResult> diffs,
Collection<T> original,
Collection<T> current,
Function<T, String> idMapping) {
var currentMapByName = current.stream()
.collect(Collectors.toMap(idMapping, Function.identity(), (a, b) -> a));
var originalMapByName = original.stream()
.collect(Collectors.toMap(idMapping, Function.identity(), (a, b) -> a));
return diffs.stream().map(diff -> {
if (diff.getDiffType() == DiffType.ADDED) {
var t = currentMapByName.get(diff.getId());
t.setDiffType(DiffType.ADDED);
return t;
}
if (diff.getDiffType() == DiffType.REMOVED) {
var t = originalMapByName.get(diff.getId());
t.setDiffType(DiffType.REMOVED);
return t;
}
if (diff.getDiffType() == DiffType.MODIFIED) {
var c = currentMapByName.get(diff.getId());
var o = originalMapByName.get(diff.getId());
c.setDiffType(DiffType.MODIFIED);
c.setOriginal(o);
return c;
}
var t = currentMapByName.get(diff.getId());
t.setDiffType(DiffType.NONE);
return t;
})
.collect(Collectors.toList());
}
private List<ForeignKeyDocumentResponse> foreignKeyDiff(Collection<DiffResult> diffs,
Collection<ForeignKeyDocumentResponse> original,
Collection<ForeignKeyDocumentResponse> current) {
Function<ForeignKeyDocumentResponse, String> idMapping = fk -> {
return fk.getFkTableName() + "." + fk.getFkColumnName() + "." + fk.getKeySeq();
};
return diff(diffs, original, current, idMapping);
}
} }