From ddce1c83dc80c923f251f41dcd0dc50767adce2c Mon Sep 17 00:00:00 2001 From: wea_ondara Date: Sun, 27 Nov 2022 08:16:48 +0100 Subject: [PATCH] improve object comparision of DbEntity and DbField --- core/src/main/java/jef/model/DbEntity.java | 19 +++++++++++++- core/src/main/java/jef/model/DbField.java | 26 ++++++++++++------- core/src/main/java/jef/util/Util.java | 20 ++++++++++++++ .../migration/creator/MigrationCreator.java | 2 +- 4 files changed, 56 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/jef/model/DbEntity.java b/core/src/main/java/jef/model/DbEntity.java index cd951a5..a94778e 100644 --- a/core/src/main/java/jef/model/DbEntity.java +++ b/core/src/main/java/jef/model/DbEntity.java @@ -12,6 +12,7 @@ import jef.model.constraints.UniqueKeyConstraint; import jef.serializable.SerializableFunction; import jef.serializable.SerializableObject; import jef.util.Check; +import jef.util.Util; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; @@ -233,11 +234,15 @@ public class DbEntity { @Override public boolean equals(Object o) { + return equals(o, DbField::equalsExceptTypeAndFieldAndSqlType); + } + + public boolean equals(Object o, Util.Equality> fieldEquality) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; DbEntity dbEntity = (DbEntity) o; return typeName.equals(dbEntity.typeName) - && fields.equals(dbEntity.fields) + && compareFields(fields, dbEntity.fields, fieldEquality) && name.equals(dbEntity.name) && Objects.equals(primaryKey, dbEntity.primaryKey) && foreignKeys.equals(dbEntity.foreignKeys) @@ -246,6 +251,18 @@ public class DbEntity { && indexes.equals(dbEntity.indexes); } + private boolean compareFields(List> thisFields, List> otherFields, Util.Equality> fieldEquality) { + if (thisFields.size() != otherFields.size()) { + return false; + } + for (int i = 0; i < thisFields.size(); i++) { + if (!fieldEquality.check(thisFields.get(i), otherFields.get(i))) { + return false; + } + } + return true; + } + @Override public int hashCode() { return Objects.hash(typeName, fields, name, primaryKey, foreignKeys, uniqueKeys, keys, indexes); diff --git a/core/src/main/java/jef/model/DbField.java b/core/src/main/java/jef/model/DbField.java index 56870f0..fa73e9f 100644 --- a/core/src/main/java/jef/model/DbField.java +++ b/core/src/main/java/jef/model/DbField.java @@ -3,6 +3,7 @@ package jef.model; import jef.model.annotations.Generated; import jef.serializable.SerializableObject; import jef.util.Check; +import jef.util.Util; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; @@ -14,6 +15,10 @@ import java.util.Objects; @Getter @Setter public class DbField { + public static final Util.NullableEquality> EQUALITY_EXACT = DbField::equals; + public static final Util.NullableEquality> EQUALITY_WITHOUT_TYPE_FIELD_NAME = DbField::equalsExceptTypeAndFieldAndName; + public static final Util.NullableEquality> EQUALITY_WITHOUT_TYPE_FIELD_SQLTYPE = DbField::equalsExceptTypeAndFieldAndSqlType; + private final DbEntity entity; private final String typeName; @Setter(value = AccessLevel.PACKAGE) @@ -94,19 +99,18 @@ public class DbField { @Override public boolean equals(Object o) { - if (!equalsCommon(o)) { - return false; - } - DbField dbField = (DbField) o; - return name.equals(dbField.name); -// && Objects.equals(field == null ? null : field.getName(), dbField.field == null ? null : dbField.field.getName()); + return equalsCommon(o, false, false, true, true); } - public boolean equalsExceptName(Object o) { - return equalsCommon(o); + public boolean equalsExceptTypeAndFieldAndName(Object o) { + return equalsCommon(o, false, false, false, true); } - private boolean equalsCommon(Object o) { + public boolean equalsExceptTypeAndFieldAndSqlType(Object o) { + return equalsCommon(o, false, false, true, false); + } + + private boolean equalsCommon(Object o, boolean compareType, boolean compareField, boolean compareName, boolean compareSqlType) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; DbField dbField = (DbField) o; @@ -115,6 +119,10 @@ public class DbField { && notNull == dbField.notNull && entity.getName().equals(dbField.entity.getName()) && typeName.equals(dbField.typeName) + && (!compareType || type == dbField.type) + && (!compareField || field == dbField.field) + && (!compareName || name.equals(dbField.name)) + && (!compareSqlType || Objects.equals(sqlType, dbField.sqlType)) && generated == dbField.generated // && Objects.equals(type, dbField.type) && Objects.equals(exposingForeignKeyOf == null ? null : exposingForeignKeyOf.getName(), diff --git a/core/src/main/java/jef/util/Util.java b/core/src/main/java/jef/util/Util.java index d74a4cc..3f5883a 100644 --- a/core/src/main/java/jef/util/Util.java +++ b/core/src/main/java/jef/util/Util.java @@ -20,8 +20,28 @@ public abstract class Util { public interface ThrowableFunction { R apply(T t) throws Throwable; } + @FunctionalInterface public interface ThrowableBiFunction { R apply(T t, U u) throws Throwable; } + + public interface Equality { + boolean check(T t1, T t2); + } + + public interface NullableEquality { + default boolean check(T t1, T t2) { + if (t1 == t2) { + return true; + } + if (t1 != null) { + return compare(t1, t2); + } else { + return compare(t2, t1); + } + } + + boolean compare(/*NonNull*/T t1, T t2); + } } diff --git a/migration-creator/src/main/java/jef/model/migration/creator/MigrationCreator.java b/migration-creator/src/main/java/jef/model/migration/creator/MigrationCreator.java index aef7578..7b515e9 100644 --- a/migration-creator/src/main/java/jef/model/migration/creator/MigrationCreator.java +++ b/migration-creator/src/main/java/jef/model/migration/creator/MigrationCreator.java @@ -507,7 +507,7 @@ public class MigrationCreator { } private int compute() { - return from.equalsExceptName(to) ? 1 : 0; + return from.equalsExceptTypeAndFieldAndName(to) ? 1 : 0; } } }