merlimat closed pull request #1982: Issue 1918: Improve message id comparison URL: https://github.com/apache/incubator-pulsar/pull/1982
This is a PR merged from a forked repository. As GitHub hides the original diff on merge, it is displayed below for the sake of provenance: As this is a foreign pull request (from a fork), the diff is supplied below (as it won't show otherwise due to GitHub magic): diff --git a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/BatchMessageIdImpl.java b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/BatchMessageIdImpl.java index d87a6ab91b..78109c490c 100644 --- a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/BatchMessageIdImpl.java +++ b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/BatchMessageIdImpl.java @@ -72,6 +72,8 @@ public int compareTo(MessageId o) { } else { return res; } + } else if (o instanceof TopicMessageIdImpl) { + return compareTo(((TopicMessageIdImpl) o).getInnerMessageId()); } else { throw new IllegalArgumentException( "expected BatchMessageIdImpl object. Got instance of " + o.getClass().getName()); diff --git a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/MessageIdImpl.java b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/MessageIdImpl.java index 4810f0c921..41cc9c9d50 100644 --- a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/MessageIdImpl.java +++ b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/MessageIdImpl.java @@ -73,6 +73,9 @@ public boolean equals(Object obj) { if (obj instanceof MessageIdImpl) { MessageIdImpl other = (MessageIdImpl) obj; return ledgerId == other.ledgerId && entryId == other.entryId && partitionIndex == other.partitionIndex; + } else if (obj instanceof BatchMessageIdImpl){ + BatchMessageIdImpl other = (BatchMessageIdImpl) obj; + return other.equals(this); } return false; } @@ -148,16 +151,18 @@ public static MessageId fromByteArray(byte[] data) throws IOException { @Override public int compareTo(MessageId o) { - if (!(o instanceof MessageIdImpl)) { + if (o instanceof MessageIdImpl) { + MessageIdImpl other = (MessageIdImpl) o; + return ComparisonChain.start() + .compare(this.ledgerId, other.ledgerId) + .compare(this.entryId, other.entryId) + .compare(this.getPartitionIndex(), other.getPartitionIndex()) + .result(); + } else if (o instanceof TopicMessageIdImpl) { + return compareTo(((TopicMessageIdImpl) o).getInnerMessageId()); + } else { throw new IllegalArgumentException( "expected MessageIdImpl object. Got instance of " + o.getClass().getName()); } - - MessageIdImpl other = (MessageIdImpl) o; - return ComparisonChain.start() - .compare(this.ledgerId, other.ledgerId) - .compare(this.entryId, other.entryId) - .compare(this.getPartitionIndex(), other.getPartitionIndex()) - .result(); } } diff --git a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/TopicMessageIdImpl.java b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/TopicMessageIdImpl.java index c7cc4536ad..071b804ffb 100644 --- a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/TopicMessageIdImpl.java +++ b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/TopicMessageIdImpl.java @@ -18,6 +18,7 @@ */ package org.apache.pulsar.client.impl; +import java.util.Objects; import org.apache.pulsar.client.api.MessageId; public class TopicMessageIdImpl implements MessageId { @@ -42,6 +43,16 @@ public MessageId getInnerMessageId() { return messageId.toByteArray(); } + @Override + public boolean equals(Object obj) { + if (!(obj instanceof TopicMessageIdImpl)) { + return false; + } + TopicMessageIdImpl other = (TopicMessageIdImpl) obj; + return Objects.equals(topicName, other.topicName) + && Objects.equals(messageId, other.messageId); + } + @Override public int compareTo(MessageId o) { return messageId.compareTo(o); diff --git a/pulsar-client/src/test/java/org/apache/pulsar/client/impl/MessageIdCompareToTest.java b/pulsar-client/src/test/java/org/apache/pulsar/client/impl/MessageIdCompareToTest.java index 690fc897c0..78af44efba 100644 --- a/pulsar-client/src/test/java/org/apache/pulsar/client/impl/MessageIdCompareToTest.java +++ b/pulsar-client/src/test/java/org/apache/pulsar/client/impl/MessageIdCompareToTest.java @@ -18,6 +18,7 @@ */ package org.apache.pulsar.client.impl; +import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; import org.testng.annotations.Test; @@ -117,4 +118,45 @@ public void testCompareDifferentType() { assertTrue(batchMessageId3.compareTo(messageIdImpl) == 0, "Expected to be equal"); } + @Test + public void testMessageIdImplCompareToTopicMessageId() { + MessageIdImpl messageIdImpl = new MessageIdImpl(123L, 345L, 567); + TopicMessageIdImpl topicMessageId1 = new TopicMessageIdImpl( + "test-topic", + new BatchMessageIdImpl(123L, 345L, 566, 789)); + TopicMessageIdImpl topicMessageId2 = new TopicMessageIdImpl( + "test-topic", + new BatchMessageIdImpl(123L, 345L, 567, 789)); + TopicMessageIdImpl topicMessageId3 = new TopicMessageIdImpl( + "test-topic", + new BatchMessageIdImpl(messageIdImpl)); + assertTrue(messageIdImpl.compareTo(topicMessageId1) > 0, "Expected to be greater than"); + assertTrue(messageIdImpl.compareTo(topicMessageId2) == 0, "Expected to be equal"); + assertTrue(messageIdImpl.compareTo(topicMessageId3) == 0, "Expected to be equal"); + assertTrue(topicMessageId1.compareTo(messageIdImpl) < 0, "Expected to be less than"); + assertTrue(topicMessageId2.compareTo(messageIdImpl) > 0, "Expected to be greater than"); + assertTrue(topicMessageId3.compareTo(messageIdImpl) == 0, "Expected to be equal"); + } + + @Test + public void testBatchMessageIdImplCompareToTopicMessageId() { + BatchMessageIdImpl messageIdImpl1 = new BatchMessageIdImpl(123L, 345L, 567, 789); + BatchMessageIdImpl messageIdImpl2 = new BatchMessageIdImpl(123L, 345L, 567, 0); + BatchMessageIdImpl messageIdImpl3 = new BatchMessageIdImpl(123L, 345L, 567, -1); + TopicMessageIdImpl topicMessageId1 = new TopicMessageIdImpl( + "test-topic", + new MessageIdImpl(123L, 345L, 566)); + TopicMessageIdImpl topicMessageId2 = new TopicMessageIdImpl( + "test-topic", + new MessageIdImpl(123L, 345L, 567)); + assertTrue(messageIdImpl1.compareTo(topicMessageId1) > 0, "Expected to be greater than"); + assertTrue(messageIdImpl1.compareTo(topicMessageId2) > 0, "Expected to be greater than"); + assertTrue(messageIdImpl2.compareTo(topicMessageId2) > 0, "Expected to be greater than"); + assertTrue(messageIdImpl3.compareTo(topicMessageId2) == 0, "Expected to be equal"); + assertTrue(topicMessageId1.compareTo(messageIdImpl1) < 0, "Expected to be less than"); + assertTrue(topicMessageId2.compareTo(messageIdImpl1) == 0, "Expected to be equal"); + assertTrue(topicMessageId2.compareTo(messageIdImpl2) == 0, "Expected to be equal"); + assertTrue(topicMessageId2.compareTo(messageIdImpl2) == 0, "Expected to be equal"); + } + } ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services