improve object comparision of DbEntity and DbField
This commit is contained in:
@@ -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<T extends SerializableObject> {
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
return equals(o, DbField::equalsExceptTypeAndFieldAndSqlType);
|
||||
}
|
||||
|
||||
public boolean equals(Object o, Util.Equality<DbField<?>> 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<T extends SerializableObject> {
|
||||
&& indexes.equals(dbEntity.indexes);
|
||||
}
|
||||
|
||||
private boolean compareFields(List<DbField<?>> thisFields, List<DbField<?>> otherFields, Util.Equality<DbField<?>> 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);
|
||||
|
||||
@@ -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<T> {
|
||||
public static final Util.NullableEquality<DbField<?>> EQUALITY_EXACT = DbField::equals;
|
||||
public static final Util.NullableEquality<DbField<?>> EQUALITY_WITHOUT_TYPE_FIELD_NAME = DbField::equalsExceptTypeAndFieldAndName;
|
||||
public static final Util.NullableEquality<DbField<?>> EQUALITY_WITHOUT_TYPE_FIELD_SQLTYPE = DbField::equalsExceptTypeAndFieldAndSqlType;
|
||||
|
||||
private final DbEntity<? extends SerializableObject> entity;
|
||||
private final String typeName;
|
||||
@Setter(value = AccessLevel.PACKAGE)
|
||||
@@ -94,19 +99,18 @@ public class DbField<T> {
|
||||
|
||||
@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<T> {
|
||||
&& 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(),
|
||||
|
||||
@@ -20,8 +20,28 @@ public abstract class Util {
|
||||
public interface ThrowableFunction<T, R> {
|
||||
R apply(T t) throws Throwable;
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
public interface ThrowableBiFunction<T, U, R> {
|
||||
R apply(T t, U u) throws Throwable;
|
||||
}
|
||||
|
||||
public interface Equality<T> {
|
||||
boolean check(T t1, T t2);
|
||||
}
|
||||
|
||||
public interface NullableEquality<T> {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -507,7 +507,7 @@ public class MigrationCreator {
|
||||
}
|
||||
|
||||
private int compute() {
|
||||
return from.equalsExceptName(to) ? 1 : 0;
|
||||
return from.equalsExceptTypeAndFieldAndName(to) ? 1 : 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user