Datacouch 1599 add rangescan support (#1738)

* Add RangeScan to Template.

Closes #1599.

* Add RangeScan support.

Closes #1599.
This commit is contained in:
Michael Reiche
2023-05-12 14:00:52 -07:00
committed by GitHub
parent cdf0b4c713
commit cf9bdde6ef
15 changed files with 1113 additions and 19 deletions

View File

@@ -27,11 +27,16 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.time.Duration;
import java.util.*;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Stream;
import com.couchbase.client.core.error.TimeoutException;
import com.couchbase.client.core.msg.kv.DurabilityLevel;
import com.couchbase.client.core.retry.RetryReason;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
@@ -41,8 +46,26 @@ import org.springframework.dao.OptimisticLockingFailureException;
import org.springframework.data.couchbase.core.ExecutableFindByIdOperation.ExecutableFindById;
import org.springframework.data.couchbase.core.ExecutableRemoveByIdOperation.ExecutableRemoveById;
import org.springframework.data.couchbase.core.ExecutableReplaceByIdOperation.ExecutableReplaceById;
import org.springframework.data.couchbase.core.support.*;
import org.springframework.data.couchbase.domain.*;
import org.springframework.data.couchbase.core.support.OneAndAllEntity;
import org.springframework.data.couchbase.core.support.OneAndAllId;
import org.springframework.data.couchbase.core.support.WithDurability;
import org.springframework.data.couchbase.core.support.WithExpiry;
import org.springframework.data.couchbase.domain.Address;
import org.springframework.data.couchbase.domain.Config;
import org.springframework.data.couchbase.domain.MutableUser;
import org.springframework.data.couchbase.domain.NaiveAuditorAware;
import org.springframework.data.couchbase.domain.PersonValue;
import org.springframework.data.couchbase.domain.Submission;
import org.springframework.data.couchbase.domain.User;
import org.springframework.data.couchbase.domain.UserAnnotated;
import org.springframework.data.couchbase.domain.UserAnnotated2;
import org.springframework.data.couchbase.domain.UserAnnotated3;
import org.springframework.data.couchbase.domain.UserAnnotatedDurability;
import org.springframework.data.couchbase.domain.UserAnnotatedDurabilityExpression;
import org.springframework.data.couchbase.domain.UserAnnotatedPersistTo;
import org.springframework.data.couchbase.domain.UserAnnotatedReplicateTo;
import org.springframework.data.couchbase.domain.UserAnnotatedTouchOnRead;
import org.springframework.data.couchbase.domain.UserSubmission;
import org.springframework.data.couchbase.util.ClusterType;
import org.springframework.data.couchbase.util.IgnoreWhen;
import org.springframework.data.couchbase.util.JavaIntegrationTests;
@@ -50,6 +73,12 @@ import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import com.couchbase.client.core.error.CouchbaseException;
import com.couchbase.client.core.error.TimeoutException;
import com.couchbase.client.core.msg.kv.DurabilityLevel;
import com.couchbase.client.core.msg.kv.MutationToken;
import com.couchbase.client.core.retry.RetryReason;
import com.couchbase.client.java.json.JsonObject;
import com.couchbase.client.java.kv.MutationState;
import com.couchbase.client.java.kv.PersistTo;
import com.couchbase.client.java.kv.ReplicateTo;
import com.couchbase.client.java.query.QueryOptions;
@@ -1051,11 +1080,6 @@ class CouchbaseTemplateKeyValueIntegrationTests extends JavaIntegrationTests {
assertEquals(user, inserted);
User found = couchbaseTemplate.findById(User.class).one(user.getId());
assertEquals(inserted, found);
System.err.println("inserted: "+inserted);
System.err.println("found: "+found);
System.err.println("found:jsonNode "+found.jsonNode.toPrettyString());
System.err.println("found:jsonObject "+found.jsonObject.toString());
System.err.println("found:jsonArray "+found.jsonArray.toString());
assertThrows(DuplicateKeyException.class, () -> couchbaseTemplate.insertById(User.class).one(user));
couchbaseTemplate.removeById(User.class).one(user.getId());
}
@@ -1209,6 +1233,111 @@ class CouchbaseTemplateKeyValueIntegrationTests extends JavaIntegrationTests {
couchbaseTemplate.removeById(PersonValue.class).one(replaced.getId());
}
@Test
void rangeScan() {
String id = "A";
String lower = null;
String upper = null;
for (int i = 0; i < 10; i++) {
if (lower == null) {
lower = "" + i;
}
User inserted = couchbaseTemplate.insertById(User.class).one(new User("" + i, "fn_" + i, "ln_" + i));
upper = "" + i;
}
MutationToken mt = couchbaseTemplate.getCouchbaseClientFactory().getDefaultCollection()
.upsert(id, JsonObject.create().put("id", id)).mutationToken().get();
Stream<User> users = couchbaseTemplate.rangeScan(User.class).consistentWith(MutationState.from(mt))
/*.withSort(ScanSort.ASCENDING)*/.rangeScan(lower, upper);
for (User u : users.toList()) {
System.err.print(u);
System.err.println(",");
assertTrue(u.getId().compareTo(lower) >= 0 && u.getId().compareTo(upper) <= 0);
couchbaseTemplate.removeById(User.class).one(u.getId());
}
couchbaseTemplate.getCouchbaseClientFactory().getDefaultCollection().remove(id);
}
@Test
void rangeScanId() {
String id = "A";
String lower = null;
String upper = null;
for (int i = 0; i < 10; i++) {
if (lower == null) {
lower = "" + i;
}
User inserted = couchbaseTemplate.insertById(User.class).one(new User("" + i, "fn_" + i, "ln_" + i));
upper = "" + i;
}
MutationToken mt = couchbaseTemplate.getCouchbaseClientFactory().getDefaultCollection()
.upsert(id, JsonObject.create().put("id", id)).mutationToken().get();
Stream<String> userIds = couchbaseTemplate.rangeScan(User.class).consistentWith(MutationState.from(mt))
/*.withSort(ScanSort.ASCENDING)*/.rangeScanIds(lower, upper);
for (String userId : userIds.toList()) {
System.err.print(userId);
System.err.println(",");
assertTrue(userId.compareTo(lower) >= 0 && userId.compareTo(upper) <= 0);
couchbaseTemplate.removeById(User.class).one(userId);
}
couchbaseTemplate.getCouchbaseClientFactory().getDefaultCollection().remove(id);
}
@Test
void sampleScan() {
String id = "A";
String lower = null;
String upper = null;
for (int i = 0; i < 10; i++) {
if (lower == null) {
lower = "" + i;
}
User inserted = couchbaseTemplate.insertById(User.class).one(new User("" + i, "fn_" + i, "ln_" + i));
upper = "" + i;
}
MutationToken mt = couchbaseTemplate.getCouchbaseClientFactory().getDefaultCollection()
.upsert(id, JsonObject.create().put("id", id)).mutationToken().get();
Stream<User> users = couchbaseTemplate.rangeScan(User.class).consistentWith(MutationState.from(mt))
/*.withSort(ScanSort.ASCENDING)*/.samplingScan(5l, null);
List<User> usersList = users.toList();
assertEquals(5, usersList.size(), "number in sample");
for (User u : usersList) {
System.err.print(u);
System.err.println(",");
// assertTrue(u.getId().compareTo(lower) >= 0 && u.getId().compareTo(upper) <= 0);
//couchbaseTemplate.removeById(User.class).one(u.getId());
}
couchbaseTemplate.getCouchbaseClientFactory().getDefaultCollection().remove(id);
}
@Test
void sampleScanId() {
String id = "A";
String lower = null;
String upper = null;
for (int i = 0; i < 10; i++) {
if (lower == null) {
lower = "" + i;
}
User inserted = couchbaseTemplate.insertById(User.class).one(new User("" + i, "fn_" + i, "ln_" + i));
upper = "" + i;
}
MutationToken mt = couchbaseTemplate.getCouchbaseClientFactory().getDefaultCollection()
.upsert(id, JsonObject.create().put("id", id)).mutationToken().get();
Stream<String> userIds = couchbaseTemplate.rangeScan(User.class).consistentWith(MutationState.from(mt))
/*.withSort(ScanSort.ASCENDING)*/.samplingScanIds(5l);
for (String userId : userIds.toList()) {
System.err.print(userId);
System.err.println(",");
//assertTrue(userId.compareTo(lower) >= 0 && userId.compareTo(upper) <= 0);
//couchbaseTemplate.removeById(User.class).one(userId);
}
couchbaseTemplate.getCouchbaseClientFactory().getDefaultCollection().remove(id);
}
private void sleepSecs(int i) {
try {
Thread.sleep(i * 1000);