Skip to content

Commit fafbffa

Browse files
micopiiramikereiche
authored andcommitted
Automatically set readonly query option for read only queries (#1730)
Closes #1724
1 parent acc2b49 commit fafbffa

File tree

9 files changed

+34
-4
lines changed

9 files changed

+34
-4
lines changed

src/main/java/org/springframework/data/couchbase/core/ReactiveFindByQueryOperationSupport.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ public Flux<T> all() {
230230

231231
public QueryOptions buildOptions(QueryOptions options) {
232232
QueryScanConsistency qsc = scanConsistency != null ? scanConsistency : template.getConsistency();
233-
return query.buildQueryOptions(options, qsc);
233+
return query.buildQueryOptions(options, qsc).readonly(query.isReadonly());
234234
}
235235

236236
private TransactionQueryOptions buildTransactionOptions(QueryOptions options) {

src/main/java/org/springframework/data/couchbase/core/query/N1QLQuery.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ public JsonObject n1ql() {
4848
return query;
4949
}
5050

51+
@Override
52+
public boolean isReadonly() {
53+
return options.build().readonly();
54+
}
55+
5156
@Override
5257
public String toN1qlSelectString(CouchbaseConverter template, String bucketName, String scopeName,
5358
String collectionName, Class domainClass, Class returnClass, boolean isCount, String[] distinctFields,

src/main/java/org/springframework/data/couchbase/core/query/Query.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,10 @@ public Meta getMeta() {
421421
return meta;
422422
}
423423

424+
public boolean isReadonly() {
425+
return true;
426+
}
427+
424428
public boolean equals(Object o) {
425429
if (!o.getClass().isAssignableFrom(getClass())) {
426430
return false;

src/main/java/org/springframework/data/couchbase/core/query/StringQuery.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,14 @@ scopeName, collectionName, converter, typeKey, typeValue, parameterAccessor, new
134134
return sbnqp;
135135
}
136136

137+
@Override
138+
public boolean isReadonly() {
139+
if (this.queryMethod.hasN1qlAnnotation()) {
140+
return this.queryMethod.getN1qlAnnotation().readonly();
141+
}
142+
return false;
143+
}
144+
137145
/**
138146
* toN1qlRemoveString - use toN1qlSelectString
139147
*

src/main/java/org/springframework/data/couchbase/repository/Query.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,11 @@
5858
*/
5959
String value() default "";
6060

61+
/**
62+
* Mark query as readonly
63+
*
64+
* @see com.couchbase.client.java.query.QueryOptions#readonly(boolean)
65+
*/
66+
boolean readonly() default false;
67+
6168
}

src/main/java/org/springframework/data/couchbase/repository/support/BasicQuery.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,11 @@ private boolean querySettingsEquals(BasicQuery that) {
104104
return super.equals(that);
105105
}
106106

107+
@Override
108+
public boolean isReadonly() {
109+
return true;
110+
}
111+
107112
/*
108113
* (non-Javadoc)
109114
*/

src/test/java/org/springframework/data/couchbase/core/CouchbaseTemplateQueryCollectionIntegrationTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -700,7 +700,7 @@ public void findByIdOptions() { // 3
700700
@Test
701701
public void findByQueryOptions() { // 4
702702
QueryOptions options = QueryOptions.queryOptions().timeout(Duration.ofNanos(10));
703-
assertThrows(AmbiguousTimeoutException.class, () -> couchbaseTemplate.findByQuery(Airport.class)
703+
assertThrows(UnambiguousTimeoutException.class, () -> couchbaseTemplate.findByQuery(Airport.class)
704704
.withConsistency(REQUEST_PLUS).inScope(otherScope).inCollection(otherCollection).withOptions(options).all());
705705
}
706706

src/test/java/org/springframework/data/couchbase/core/query/ReactiveCouchbaseTemplateQueryCollectionIntegrationTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -693,7 +693,7 @@ public void findByIdOptions() { // 3
693693
@Test
694694
public void findByQueryOptions() { // 4
695695
QueryOptions options = QueryOptions.queryOptions().timeout(Duration.ofNanos(10));
696-
assertThrows(AmbiguousTimeoutException.class,
696+
assertThrows(UnambiguousTimeoutException.class,
697697
() -> template.findByQuery(Airport.class).withConsistency(REQUEST_PLUS).inScope(otherScope)
698698
.inCollection(otherCollection).withOptions(options).all().collectList().block());
699699
}

src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import static org.junit.jupiter.api.Assertions.assertTrue;
3131
import static org.springframework.data.couchbase.config.BeanNames.COUCHBASE_TEMPLATE;
3232

33+
import com.couchbase.client.core.error.UnambiguousTimeoutException;
3334
import jakarta.validation.ConstraintViolationException;
3435
import junit.framework.AssertionFailedError;
3536

@@ -662,7 +663,7 @@ void findBySimplePropertyWithOptions() {
662663
try {
663664
Airport saved = airportRepository.save(vie);
664665
// Duration of 1 nano-second will cause timeout
665-
assertThrows(AmbiguousTimeoutException.class,
666+
assertThrows(UnambiguousTimeoutException.class,
666667
() -> airportRepository.withOptions(queryOptions().timeout(Duration.ofNanos(1))).iata(vie.getIata()));
667668

668669
Airport airport3 = airportRepository

0 commit comments

Comments
 (0)