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.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);
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user