From 87a54b066f8a17cdf8cb746613694bceae1adafa Mon Sep 17 00:00:00 2001 From: terrymanu Date: Wed, 17 Jan 2018 17:36:02 +0800 Subject: [PATCH] fix OrderItem equals logic for #557 --- .../orderby/OrderByStreamResultSetMerger.java | 4 +-- .../parsing/parser/context/OrderItem.java | 34 +++++++++++++++++-- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/merger/orderby/OrderByStreamResultSetMerger.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/merger/orderby/OrderByStreamResultSetMerger.java index 28abcad947208..293a031311700 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/merger/orderby/OrderByStreamResultSetMerger.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/merger/orderby/OrderByStreamResultSetMerger.java @@ -33,14 +33,14 @@ * * @author zhangliang */ -@Getter(AccessLevel.PROTECTED) public class OrderByStreamResultSetMerger extends AbstractStreamResultSetMerger { - @Getter(AccessLevel.NONE) private final List orderByItems; + @Getter(AccessLevel.PROTECTED) private final Queue orderByValuesQueue; + @Getter(AccessLevel.PROTECTED) private boolean isFirstNext; public OrderByStreamResultSetMerger(final List resultSets, final List orderByItems) throws SQLException { diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/context/OrderItem.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/context/OrderItem.java index c85a00c85ac4d..9e804db7bac6f 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/context/OrderItem.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/parsing/parser/context/OrderItem.java @@ -17,12 +17,12 @@ package io.shardingjdbc.core.parsing.parser.context; -import io.shardingjdbc.core.constant.OrderType; import com.google.common.base.Optional; -import lombok.EqualsAndHashCode; +import io.shardingjdbc.core.constant.OrderType; import lombok.Getter; import lombok.Setter; import lombok.ToString; +import org.apache.commons.lang3.builder.HashCodeBuilder; /** * Order item. @@ -31,7 +31,6 @@ */ @Getter @Setter -@EqualsAndHashCode @ToString public final class OrderItem { @@ -92,4 +91,33 @@ public Optional getQualifiedName() { } return owner.isPresent() ? Optional.of(owner.get() + "." + name.get()) : name; } + + @Override + public boolean equals(final Object obj) { + if (null == obj || !(obj instanceof OrderItem)) { + return false; + } + OrderItem orderItem = (OrderItem) obj; + return type == orderItem.getType() && (columnLabelEquals(orderItem) || qualifiedNameEquals(orderItem) || indexEquals(orderItem)); + } + + private boolean qualifiedNameEquals(final OrderItem orderItem) { + Optional thisQualifiedName = getQualifiedName(); + Optional thatQualifiedName = orderItem.getQualifiedName(); + return thisQualifiedName.isPresent() && thatQualifiedName.isPresent() && thisQualifiedName.get().equalsIgnoreCase(thatQualifiedName.get()); + } + + private boolean columnLabelEquals(final OrderItem orderItem) { + String columnLabel = getColumnLabel(); + return null != columnLabel && columnLabel.equalsIgnoreCase(orderItem.getColumnLabel()); + } + + private boolean indexEquals(final OrderItem orderItem) { + return -1 != index && index == orderItem.getIndex(); + } + + @Override + public int hashCode() { + return HashCodeBuilder.reflectionHashCode(this); + } }