Fix cache.clear() to use collection. (#1371)

Closes #1369.

Co-authored-by: Michael Reiche <michael.reiche@couchbase.com>
This commit is contained in:
Michael Reiche
2022-03-15 20:13:07 -07:00
committed by Michael Reiche
parent 6bd27f429e
commit 0ff7558ea1
4 changed files with 21 additions and 18 deletions

View File

@@ -138,12 +138,12 @@ public class CouchbaseCache extends AbstractValueAdaptingCache {
@Override
public boolean invalidate() {
return cacheWriter.clear(cacheConfig.getKeyPrefixFor(name)) > 0;
return cacheWriter.clear(cacheConfig.getCollectionName(), cacheConfig.getKeyPrefixFor(name)) > 0;
}
@Override
public void clear() {
cacheWriter.clear(cacheConfig.getKeyPrefixFor(name));
cacheWriter.clear( cacheConfig.getCollectionName(), cacheConfig.getKeyPrefixFor(name));
}
/**

View File

@@ -74,6 +74,6 @@ public interface CouchbaseCacheWriter {
* @param pattern the pattern to clear.
* @return the number of cleared items.
*/
long clear(String pattern);
long clear(String collectionName, String pattern);
}

View File

@@ -20,6 +20,7 @@ import static com.couchbase.client.java.kv.GetOptions.*;
import static com.couchbase.client.java.kv.InsertOptions.*;
import static com.couchbase.client.java.kv.UpsertOptions.*;
import static com.couchbase.client.java.query.QueryOptions.*;
import static com.couchbase.client.java.query.QueryScanConsistency.REQUEST_PLUS;
import java.time.Duration;
@@ -102,10 +103,10 @@ public class DefaultCouchbaseCacheWriter implements CouchbaseCacheWriter {
}
@Override
public long clear(final String pattern) {
QueryResult result = clientFactory.getCluster().query(
"DELETE FROM `" + clientFactory.getBucket().name() + "` where meta().id LIKE $pattern",
queryOptions().metrics(true).parameters(JsonObject.create().put("pattern", pattern + "%")));
public long clear(final String collectionName, final String pattern) {
QueryResult result = clientFactory.getScope().query(
"DELETE FROM `" + collectionName + "` where meta().id LIKE $pattern",
queryOptions().scanConsistency(REQUEST_PLUS).metrics(true).parameters(JsonObject.create().put("pattern", pattern + "%")));
return result.metaData().metrics().map(QueryMetrics::mutationCount).orElse(0L);
}

View File

@@ -16,7 +16,6 @@
package org.springframework.data.couchbase.cache;
import com.couchbase.client.java.query.QueryOptions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.data.couchbase.util.Capabilities;
@@ -26,7 +25,6 @@ import org.springframework.data.couchbase.util.IgnoreWhen;
import java.util.UUID;
import static com.couchbase.client.java.query.QueryScanConsistency.REQUEST_PLUS;
import static org.junit.Assert.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
@@ -47,15 +45,7 @@ class CouchbaseCacheCollectionIntegrationTests extends CollectionAwareIntegratio
super.beforeEach();
cache = CouchbaseCacheManager.create(couchbaseTemplate.getCouchbaseClientFactory()).createCouchbaseCache("myCache",
CouchbaseCacheConfiguration.defaultCacheConfig().collection("my_collection"));
clear(cache);
}
private void clear(CouchbaseCache c) {
couchbaseTemplate.getCouchbaseClientFactory().getCluster().query("SELECT count(*) from `" + bucketName() + "`",
QueryOptions.queryOptions().scanConsistency(REQUEST_PLUS));
c.clear();
couchbaseTemplate.getCouchbaseClientFactory().getCluster().query("SELECT count(*) from `" + bucketName() + "`",
QueryOptions.queryOptions().scanConsistency(REQUEST_PLUS));
cache.clear();
}
@Test
@@ -76,9 +66,21 @@ class CouchbaseCacheCollectionIntegrationTests extends CollectionAwareIntegratio
cache.put(user1.getId(), user1); // put user1
cache.put(user2.getId(), user2); // put user2
cache.evict(user1.getId()); // evict user1
assertNull(cache.get(user1.getId())); // get user1 -> not present
assertEquals(user2, cache.get(user2.getId()).get()); // get user2 -> present
}
@Test
void cacheClear() {
CacheUser user1 = new CacheUser(UUID.randomUUID().toString(), "first1", "last1");
CacheUser user2 = new CacheUser(UUID.randomUUID().toString(), "first2", "last2");
cache.put(user1.getId(), user1); // put user1
cache.put(user2.getId(), user2); // put user2
cache.clear();
assertNull(cache.get(user1.getId())); // get user1 -> not present
assertNull(cache.get(user2.getId())); // get user2 -> not present
}
@Test
void cacheHitMiss() {
CacheUser user1 = new CacheUser(UUID.randomUUID().toString(), "first1", "last1");