improve object comparision of DbEntity and DbField

This commit is contained in:
wea_ondara
2022-11-27 08:16:48 +01:00
parent 195f3d0148
commit ddce1c83dc
4 changed files with 56 additions and 11 deletions

View File

@@ -12,6 +12,7 @@ import jef.model.constraints.UniqueKeyConstraint;
import jef.serializable.SerializableFunction; import jef.serializable.SerializableFunction;
import jef.serializable.SerializableObject; import jef.serializable.SerializableObject;
import jef.util.Check; import jef.util.Check;
import jef.util.Util;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -233,11 +234,15 @@ public class DbEntity<T extends SerializableObject> {
@Override @Override
public boolean equals(Object o) { 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 (this == o) return true;
if (o == null || getClass() != o.getClass()) return false; if (o == null || getClass() != o.getClass()) return false;
DbEntity<?> dbEntity = (DbEntity<?>) o; DbEntity<?> dbEntity = (DbEntity<?>) o;
return typeName.equals(dbEntity.typeName) return typeName.equals(dbEntity.typeName)
&& fields.equals(dbEntity.fields) && compareFields(fields, dbEntity.fields, fieldEquality)
&& name.equals(dbEntity.name) && name.equals(dbEntity.name)
&& Objects.equals(primaryKey, dbEntity.primaryKey) && Objects.equals(primaryKey, dbEntity.primaryKey)
&& foreignKeys.equals(dbEntity.foreignKeys) && foreignKeys.equals(dbEntity.foreignKeys)
@@ -246,6 +251,18 @@ public class DbEntity<T extends SerializableObject> {
&& indexes.equals(dbEntity.indexes); && 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 @Override
public int hashCode() { public int hashCode() {
return Objects.hash(typeName, fields, name, primaryKey, foreignKeys, uniqueKeys, keys, indexes); return Objects.hash(typeName, fields, name, primaryKey, foreignKeys, uniqueKeys, keys, indexes);

View File

@@ -3,6 +3,7 @@ package jef.model;
import jef.model.annotations.Generated; import jef.model.annotations.Generated;
import jef.serializable.SerializableObject; import jef.serializable.SerializableObject;
import jef.util.Check; import jef.util.Check;
import jef.util.Util;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -14,6 +15,10 @@ import java.util.Objects;
@Getter @Getter
@Setter @Setter
public class DbField<T> { 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 DbEntity<? extends SerializableObject> entity;
private final String typeName; private final String typeName;
@Setter(value = AccessLevel.PACKAGE) @Setter(value = AccessLevel.PACKAGE)
@@ -94,19 +99,18 @@ public class DbField<T> {
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (!equalsCommon(o)) { return equalsCommon(o, false, false, true, true);
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());
} }
public boolean equalsExceptName(Object o) { public boolean equalsExceptTypeAndFieldAndName(Object o) {
return equalsCommon(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 (this == o) return true;
if (o == null || getClass() != o.getClass()) return false; if (o == null || getClass() != o.getClass()) return false;
DbField<?> dbField = (DbField<?>) o; DbField<?> dbField = (DbField<?>) o;
@@ -115,6 +119,10 @@ public class DbField<T> {
&& notNull == dbField.notNull && notNull == dbField.notNull
&& entity.getName().equals(dbField.entity.getName()) && entity.getName().equals(dbField.entity.getName())
&& typeName.equals(dbField.typeName) && 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 && generated == dbField.generated
// && Objects.equals(type, dbField.type) // && Objects.equals(type, dbField.type)
&& Objects.equals(exposingForeignKeyOf == null ? null : exposingForeignKeyOf.getName(), && Objects.equals(exposingForeignKeyOf == null ? null : exposingForeignKeyOf.getName(),

View File

@@ -20,8 +20,28 @@ public abstract class Util {
public interface ThrowableFunction<T, R> { public interface ThrowableFunction<T, R> {
R apply(T t) throws Throwable; R apply(T t) throws Throwable;
} }
@FunctionalInterface @FunctionalInterface
public interface ThrowableBiFunction<T, U, R> { public interface ThrowableBiFunction<T, U, R> {
R apply(T t, U u) throws Throwable; 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);
}
} }

View File

@@ -507,7 +507,7 @@ public class MigrationCreator {
} }
private int compute() { private int compute() {
return from.equalsExceptName(to) ? 1 : 0; return from.equalsExceptTypeAndFieldAndName(to) ? 1 : 0;
} }
} }
} }