Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 9 additions & 21 deletions src/main/java/net/spy/memcached/ArcusClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -2625,7 +2625,7 @@ public SMGetFuture<List<SMGetElement<Object>>> asyncBopSortMergeGet(
int count, boolean unique) {
KeyValidator.validateBKey(from, to);
keyValidator.validateKey(keyList);
checkDupKey(keyList);
keyValidator.checkDupKey(keyList);
if (count < 1) {
throw new IllegalArgumentException("Count must be larger than 0.");
}
Expand All @@ -2652,7 +2652,7 @@ public SMGetFuture<List<SMGetElement<Object>>> asyncBopSortMergeGet(
List<String> keyList, long from, long to, ElementFlagFilter eFlagFilter,
int count, boolean unique) {
keyValidator.validateKey(keyList);
checkDupKey(keyList);
keyValidator.checkDupKey(keyList);
if (count < 1) {
throw new IllegalArgumentException("Count must be larger than 0.");
}
Expand Down Expand Up @@ -2687,7 +2687,7 @@ public <T> Future<Map<String, CollectionOperationStatus>> asyncBopInsertBulk(

KeyValidator.validateBKey(bkey);
keyValidator.validateKey(keyList);
checkDupKey(keyList);
keyValidator.checkDupKey(keyList);
Collection<Entry<MemcachedNode, List<String>>> arrangedKey =
groupingKeys(keyList, NON_PIPED_BULK_INSERT_CHUNK_SIZE, APIType.BOP_INSERT);

Expand Down Expand Up @@ -2721,7 +2721,7 @@ public <T> Future<Map<String, CollectionOperationStatus>> asyncBopInsertBulk(

KeyValidator.validateBKey(bkey);
keyValidator.validateKey(keyList);
checkDupKey(keyList);
keyValidator.checkDupKey(keyList);
Collection<Entry<MemcachedNode, List<String>>> arrangedKey =
groupingKeys(keyList, NON_PIPED_BULK_INSERT_CHUNK_SIZE, APIType.BOP_INSERT);
List<CollectionBulkInsert<T>> insertList = new ArrayList<>(
Expand Down Expand Up @@ -2753,7 +2753,7 @@ public <T> Future<Map<String, CollectionOperationStatus>> asyncMopInsertBulk(

keyValidator.validateMKey(mkey);
keyValidator.validateKey(keyList);
checkDupKey(keyList);
keyValidator.checkDupKey(keyList);
Collection<Entry<MemcachedNode, List<String>>> arrangedKey =
groupingKeys(keyList, NON_PIPED_BULK_INSERT_CHUNK_SIZE, APIType.MOP_INSERT);

Expand Down Expand Up @@ -2783,7 +2783,7 @@ public <T> Future<Map<String, CollectionOperationStatus>> asyncSopInsertBulk(
List<String> keyList, T value,
CollectionAttributes attributesForCreate, Transcoder<T> tc) {
keyValidator.validateKey(keyList);
checkDupKey(keyList);
keyValidator.checkDupKey(keyList);

Collection<Entry<MemcachedNode, List<String>>> arrangedKey =
groupingKeys(keyList, NON_PIPED_BULK_INSERT_CHUNK_SIZE, APIType.SOP_INSERT);
Expand Down Expand Up @@ -2813,7 +2813,7 @@ public <T> Future<Map<String, CollectionOperationStatus>> asyncLopInsertBulk(
List<String> keyList, int index, T value,
CollectionAttributes attributesForCreate, Transcoder<T> tc) {
keyValidator.validateKey(keyList);
checkDupKey(keyList);
keyValidator.checkDupKey(keyList);

Collection<Entry<MemcachedNode, List<String>>> arrangedKey =
groupingKeys(keyList, NON_PIPED_BULK_INSERT_CHUNK_SIZE, APIType.LOP_INSERT);
Expand Down Expand Up @@ -2881,7 +2881,7 @@ public <T> CollectionGetBulkFuture<Map<String, BTreeGetResult<Long, T>>> asyncBo
ElementFlagFilter eFlagFilter, int offset, int count, Transcoder<T> tc) {
KeyValidator.validateBKey(from, to);
keyValidator.validateKey(keyList);
checkDupKey(keyList);
keyValidator.checkDupKey(keyList);
if (offset < 0) {
throw new IllegalArgumentException("Offset must be 0 or positive integer.");
}
Expand Down Expand Up @@ -2920,7 +2920,7 @@ public <T> CollectionGetBulkFuture<Map<String, BTreeGetResult<ByteArrayBKey, T>>
Transcoder<T> tc) {
KeyValidator.validateBKey(from, to);
keyValidator.validateKey(keyList);
checkDupKey(keyList);
keyValidator.checkDupKey(keyList);

if (offset < 0) {
throw new IllegalArgumentException("Offset must be 0 or positive integer.");
Expand Down Expand Up @@ -3178,18 +3178,6 @@ public void complete() {
return rv;
}

private void checkDupKey(Collection<String> keyList) {
/*
* Dup Check -> insure elements sequentially added to keyList
* */
HashSet<String> keySet = new HashSet<>();
for (String key : keyList) {
if (!keySet.add(key)) {
throw new IllegalArgumentException("Duplicate keys exist in key list.");
}
}
}

private CollectionOperationStatus toCollectionOperationStatus(OperationStatus status) {
if (status instanceof CollectionOperationStatus) {
return (CollectionOperationStatus) status;
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/net/spy/memcached/KeyValidator.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package net.spy.memcached;

import java.util.Collection;
import java.util.HashSet;

/**
* Validator for memcached keys.
Expand Down Expand Up @@ -177,4 +178,16 @@ public static void validateBKey(long... bkeys) {
}
}
}

/**
* Check duplicate keys in keyList.
*/
public void checkDupKey(Collection<String> keyList) {
HashSet<String> keySet = new HashSet<>();
for (String key : keyList) {
if (!keySet.add(key)) {
throw new IllegalArgumentException("Duplicate keys exist in key list.");
}
}
}
}