Repository: camel Updated Branches: refs/heads/master 3da84a6ba -> e3b86b977
Add a data structure to model the way the shard list works. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/8f5136af Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/8f5136af Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/8f5136af Branch: refs/heads/master Commit: 8f5136af0ceb93db47858b6ba96b3388ea19c0e7 Parents: 78fd81e Author: Candle <can...@candle.me.uk> Authored: Fri Dec 11 10:49:56 2015 +0000 Committer: Claus Ibsen <davscl...@apache.org> Committed: Wed Dec 16 14:19:11 2015 +0100 ---------------------------------------------------------------------- .../component/aws/ddbstream/ShardList.java | 57 ++++++++++ .../component/aws/ddbstream/ShardListTest.java | 104 +++++++++++++++++++ 2 files changed, 161 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/8f5136af/components/camel-aws/src/main/java/org/apache/camel/component/aws/ddbstream/ShardList.java ---------------------------------------------------------------------- diff --git a/components/camel-aws/src/main/java/org/apache/camel/component/aws/ddbstream/ShardList.java b/components/camel-aws/src/main/java/org/apache/camel/component/aws/ddbstream/ShardList.java new file mode 100644 index 0000000..fb188f4 --- /dev/null +++ b/components/camel-aws/src/main/java/org/apache/camel/component/aws/ddbstream/ShardList.java @@ -0,0 +1,57 @@ +package org.apache.camel.component.aws.ddbstream; + +import com.amazonaws.services.dynamodbv2.model.Shard; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +class ShardList { + + private final Map<String, Shard> shards = new HashMap<>(); + + void addAll(Collection<Shard> shards) { + for (Shard shard : shards) { + add(shard); + } + } + + void add(Shard shard) { + shards.put(shard.getShardId(), shard); + } + + Shard nextAfter(Shard previous) { + for (Shard shard : shards.values()) { + if (previous.getShardId().equals(shard.getParentShardId())) { + return shard; + } + } + throw new IllegalStateException("Unable to find the next shard for " + previous + " in " + shards); + } + + Shard first() { + for (Shard shard : shards.values()) { + if (!shards.containsKey(shard.getParentShardId())) { + return shard; + } + } + throw new IllegalStateException("Unable to find an unparented shard in " + shards); + } + + /** + * Removes shards that are older than the provided shard. + * Does not remove the provided shard. + * @param removeBefore + */ + void removeOlderThan(Shard removeBefore) { + String current = removeBefore.getParentShardId(); + + while (current != null) { + Shard s = shards.remove(current); + if (s == null) { + current = null; + } else { + current = s.getParentShardId(); + } + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/8f5136af/components/camel-aws/src/test/java/org/apache/camel/component/aws/ddbstream/ShardListTest.java ---------------------------------------------------------------------- diff --git a/components/camel-aws/src/test/java/org/apache/camel/component/aws/ddbstream/ShardListTest.java b/components/camel-aws/src/test/java/org/apache/camel/component/aws/ddbstream/ShardListTest.java new file mode 100644 index 0000000..773f4a0 --- /dev/null +++ b/components/camel-aws/src/test/java/org/apache/camel/component/aws/ddbstream/ShardListTest.java @@ -0,0 +1,104 @@ +package org.apache.camel.component.aws.ddbstream; + +import com.amazonaws.services.dynamodbv2.model.Shard; +import java.util.ArrayList; +import java.util.List; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import org.junit.Test; + +public class ShardListTest { + + @Test + public void nextReturnsShardWithParent() throws Exception { + Shard first = new Shard() + .withShardId("first_shard") + .withParentShardId("other_shard_id"); + Shard second = new Shard() + .withParentShardId("first_shard") + .withShardId("second_shard"); + + ShardList shards = new ShardList(); + shards.add(first); + shards.add(second); + + assertThat(shards.nextAfter(first), is(second)); + } + + @Test + public void nextWithNullReturnsFirstKnownShard() throws Exception { + Shard first = new Shard() + .withShardId("first_shard"); + Shard second = new Shard() + .withParentShardId("first_shard") + .withShardId("second_shard"); + + ShardList shards = new ShardList(); + shards.add(first); + shards.add(second); + + assertThat(shards.nextAfter(first), is(second)); + } + + @Test + public void reAddingEntriesMaintainsOrder() throws Exception { + Shard first = new Shard() + .withShardId("first_shard"); + Shard second = new Shard() + .withParentShardId("first_shard") + .withShardId("second_shard"); + + ShardList shards = new ShardList(); + shards.add(first); + shards.add(second); + + assertThat(shards.nextAfter(first), is(second)); + + Shard second2 = new Shard() + .withParentShardId("first_shard") + .withShardId("second_shard"); + Shard third = new Shard() + .withParentShardId("second_shard") + .withShardId("third_shard"); + shards.add(second2); + shards.add(third); + + assertThat(shards.nextAfter(first), is(second)); + assertThat(shards.nextAfter(second), is(third)); + } + + @Test + public void firstShardGetsTheFirstWithoutAParent() throws Exception { + ShardList shards = new ShardList(); + shards.addAll(createShards(null, "a", "b", "c", "d")); + + assertThat(shards.first().getShardId(), is("a")); + } + + @Test + public void firstShardGetsTheFirstWithAnUnknownParent() throws Exception { + ShardList shards = new ShardList(); + shards.addAll(createShards("a", "b", "c", "d")); + + assertThat(shards.first().getShardId(), is("b")); + } + + @Test + public void removingShards() throws Exception { + ShardList shards = new ShardList(); + shards.addAll(createShards(null, "a", "b", "c", "d")); + Shard removeBefore = new Shard().withShardId("c").withParentShardId("b"); + shards.removeOlderThan(removeBefore); + assertThat(shards.first().getShardId(), is("c")); + } + + List<Shard> createShards(String initialParent, String... shardIds) { + String previous = initialParent; + List<Shard> result = new ArrayList<>(); + for (String s : shardIds) { + result.add(new Shard().withShardId(s).withParentShardId(previous)); + previous = s; + } + return result; + } +} \ No newline at end of file