Skip to content

Commit b54dfca

Browse files
committed
DATACOUCH-605 - Support ScanConsistency in n1ql queries
Also fixes expiry bug
1 parent 7026a39 commit b54dfca

17 files changed

+117
-28
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ interface FindByQueryConsistentWith<T> extends FindByQueryWithQuery<T> {
126126
*
127127
* @param scanConsistency the custom scan consistency to use for this query.
128128
*/
129-
FindByQueryWithQuery<T> consistentWith(QueryScanConsistency scanConsistency);
129+
FindByQueryConsistentWith<T> consistentWith(QueryScanConsistency scanConsistency);
130130

131131
}
132132

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.springframework.data.couchbase.core.query.Query;
2222

2323
import com.couchbase.client.java.query.QueryScanConsistency;
24+
import org.springframework.data.couchbase.core.ReactiveFindByQueryOperationSupport.ReactiveFindByQuerySupport;
2425

2526
public class ExecutableFindByQueryOperationSupport implements ExecutableFindByQueryOperation {
2627

@@ -50,8 +51,7 @@ static class ExecutableFindByQuerySupport<T> implements ExecutableFindByQuery<T>
5051
this.template = template;
5152
this.domainType = domainType;
5253
this.query = query;
53-
this.reactiveSupport = new ReactiveFindByQueryOperationSupport.ReactiveFindByQuerySupport<T>(
54-
template.reactive(), domainType, query, scanConsistency);
54+
this.reactiveSupport = new ReactiveFindByQuerySupport<T>(template.reactive(), domainType, query, scanConsistency);
5555
this.scanConsistency = scanConsistency;
5656
}
5757

@@ -72,11 +72,17 @@ public List<T> all() {
7272

7373
@Override
7474
public TerminatingFindByQuery<T> matching(final Query query) {
75-
return new ExecutableFindByQuerySupport<>(template, domainType, query, scanConsistency);
75+
QueryScanConsistency scanCons;
76+
if (query.getScanConsistency() != null) {
77+
scanCons = query.getScanConsistency();
78+
} else {
79+
scanCons = scanConsistency;
80+
}
81+
return new ExecutableFindByQuerySupport<>(template, domainType, query, scanCons);
7682
}
7783

7884
@Override
79-
public FindByQueryWithQuery<T> consistentWith(final QueryScanConsistency scanConsistency) {
85+
public FindByQueryConsistentWith<T> consistentWith(final QueryScanConsistency scanConsistency) {
8086
return new ExecutableFindByQuerySupport<>(template, domainType, query, scanConsistency);
8187
}
8288

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ interface FindByQueryConsistentWith<T> extends FindByQueryWithQuery<T> {
100100
*
101101
* @param scanConsistency the custom scan consistency to use for this query.
102102
*/
103-
FindByQueryWithQuery<T> consistentWith(QueryScanConsistency scanConsistency);
103+
FindByQueryConsistentWith<T> consistentWith(QueryScanConsistency scanConsistency);
104104

105105
}
106106

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,17 @@ static class ReactiveFindByQuerySupport<T> implements ReactiveFindByQuery<T> {
6060

6161
@Override
6262
public TerminatingFindByQuery<T> matching(Query query) {
63-
return new ReactiveFindByQuerySupport<>(template, domainType, query, scanConsistency);
63+
QueryScanConsistency scanCons;
64+
if (query.getScanConsistency() != null) {
65+
scanCons = query.getScanConsistency();
66+
} else {
67+
scanCons = scanConsistency;
68+
}
69+
return new ReactiveFindByQuerySupport<>(template, domainType, query, scanCons);
6470
}
6571

6672
@Override
67-
public FindByQueryWithQuery<T> consistentWith(QueryScanConsistency scanConsistency) {
73+
public FindByQueryConsistentWith<T> consistentWith(QueryScanConsistency scanConsistency) {
6874
return new ReactiveFindByQuerySupport<>(template, domainType, query, scanConsistency);
6975
}
7076

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
package org.springframework.data.couchbase.core;
1717

18-
import com.couchbase.client.java.kv.UpsertOptions;
1918
import org.springframework.data.couchbase.core.mapping.Document;
2019
import reactor.core.publisher.Flux;
2120
import reactor.core.publisher.Mono;
@@ -98,7 +97,7 @@ private InsertOptions buildInsertOptions() {
9897
} else if (durabilityLevel != DurabilityLevel.NONE) {
9998
options.durability(durabilityLevel);
10099
}
101-
if (expiry != null) {
100+
if (expiry != null && ! expiry.isZero()) {
102101
options.expiry(expiry);
103102
} else if (domainType.isAnnotationPresent(Document.class)) {
104103
Document documentAnn = domainType.getAnnotation(Document.class);

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
package org.springframework.data.couchbase.core;
1717

18-
import com.couchbase.client.java.kv.Expiry;
1918
import org.springframework.data.couchbase.core.mapping.Document;
2019
import reactor.core.publisher.Flux;
2120
import reactor.core.publisher.Mono;
@@ -98,7 +97,7 @@ private UpsertOptions buildUpsertOptions() {
9897
} else if (durabilityLevel != DurabilityLevel.NONE) {
9998
options.durability(durabilityLevel);
10099
}
101-
if (expiry != null) {
100+
if (expiry != null && !expiry.isZero()) {
102101
options.expiry(expiry);
103102
} else if (domainType.isAnnotationPresent(Document.class)) {
104103
Document documentAnn = domainType.getAnnotation(Document.class);

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public class Query {
4747
private long skip;
4848
private int limit;
4949
private Sort sort = Sort.unsorted();
50+
private QueryScanConsistency queryScanConsistency;
5051

5152
static private final Pattern WHERE_PATTERN = Pattern.compile("\\sWHERE\\s");
5253

@@ -127,6 +128,27 @@ public Query with(final Pageable pageable) {
127128
return with(pageable.getSort());
128129
}
129130

131+
/**
132+
* queryScanConsistency
133+
*
134+
* @return queryScanConsistency
135+
*/
136+
public QueryScanConsistency getScanConsistency() {
137+
return queryScanConsistency;
138+
}
139+
140+
141+
/**
142+
* Sets the given scan consistency on the {@link Query} instance.
143+
*
144+
* @param queryScanConsistency
145+
* @return this
146+
*/
147+
public Query scanConsistency(final QueryScanConsistency queryScanConsistency) {
148+
this.queryScanConsistency = queryScanConsistency;
149+
return this;
150+
}
151+
130152
/**
131153
* Adds a {@link Sort} to the {@link Query} instance.
132154
*
@@ -280,7 +302,7 @@ StringBasedN1qlQueryParser.N1qlSpelValues getN1qlSpelValues(ReactiveCouchbaseTem
280302
}
281303

282304
/**
283-
* build QueryOptions forom parameters and scanConsistency
305+
* build QueryOptions from parameters and scanConsistency
284306
*
285307
* @param scanConsistency
286308
* @return QueryOptions

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.util.List;
2020

21+
import com.couchbase.client.java.query.QueryScanConsistency;
2122
import org.springframework.data.domain.Sort;
2223
import org.springframework.data.repository.NoRepositoryBean;
2324
import org.springframework.data.repository.PagingAndSortingRepository;
@@ -34,6 +35,8 @@ public interface CouchbaseRepository<T, ID> extends PagingAndSortingRepository<T
3435
@Override
3536
List<T> findAll(Sort sort);
3637

38+
List<T> findAll(QueryScanConsistency queryScanConsistency);
39+
3740
@Override
3841
List<T> findAll();
3942

src/main/java/org/springframework/data/couchbase/repository/query/CouchbaseQueryMethod.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.springframework.data.couchbase.core.query.View;
2626
import org.springframework.data.couchbase.core.query.WithConsistency;
2727
import org.springframework.data.couchbase.repository.Query;
28+
import org.springframework.data.couchbase.repository.ScanConsistency;
2829
import org.springframework.data.mapping.context.MappingContext;
2930
import org.springframework.data.projection.ProjectionFactory;
3031
import org.springframework.data.repository.core.RepositoryMetadata;
@@ -152,6 +153,24 @@ public WithConsistency getConsistencyAnnotation() {
152153
return method.getAnnotation(WithConsistency.class);
153154
}
154155

156+
/**
157+
* If the method has a @ScanConsistency annotation
158+
*
159+
* @return true if this has the @ScanConsistency annotation
160+
*/
161+
public boolean hasScanConsistencyAnnotation() {
162+
return getScanConsistencyAnnotation() != null;
163+
}
164+
165+
/**
166+
* ScanConsistency annotation
167+
*
168+
* @return the @ScanConsistency annotation
169+
*/
170+
public ScanConsistency getScanConsistencyAnnotation() {
171+
return method.getAnnotation(ScanConsistency.class);
172+
}
173+
155174
/**
156175
* Returns the query string declared in a {@link Query} annotation or {@literal null} if neither the annotation found
157176
* nor the attribute was specified.

src/main/java/org/springframework/data/couchbase/repository/query/N1qlRepositoryQueryExecutor.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@
1515
*/
1616
package org.springframework.data.couchbase.repository.query;
1717

18-
import java.util.ArrayList;
19-
import java.util.List;
20-
18+
import com.couchbase.client.java.query.QueryScanConsistency;
2119
import org.springframework.data.couchbase.core.CouchbaseOperations;
2220
import org.springframework.data.couchbase.core.ExecutableFindByQueryOperation;
2321
import org.springframework.data.couchbase.core.query.Query;
@@ -65,7 +63,8 @@ public Object execute(final Object[] parameters) {
6563
final PartTree tree = new PartTree(queryMethod.getName(), domainClass);
6664
query = new N1qlQueryCreator(tree, accessor, queryMethod, operations.getConverter()).createQuery();
6765
}
68-
q = (ExecutableFindByQueryOperation.ExecutableFindByQuery) operations.findByQuery(domainClass).matching(query);
66+
q = (ExecutableFindByQueryOperation.ExecutableFindByQuery) operations.findByQuery(domainClass)
67+
.consistentWith(buildQueryScanConsistency()).matching(query);
6968
if (queryMethod.isCountQuery()) {
7069
return q.count();
7170
} else if (queryMethod.isCollectionQuery()) {
@@ -76,4 +75,14 @@ public Object execute(final Object[] parameters) {
7675

7776
}
7877

78+
private QueryScanConsistency buildQueryScanConsistency() {
79+
QueryScanConsistency scanConsistency = QueryScanConsistency.NOT_BOUNDED;
80+
if (queryMethod.hasConsistencyAnnotation()) {
81+
scanConsistency = queryMethod.getConsistencyAnnotation().value();
82+
} else if (queryMethod.hasScanConsistencyAnnotation()) {
83+
scanConsistency = queryMethod.getScanConsistencyAnnotation().query();
84+
}
85+
return scanConsistency;
86+
}
87+
7988
}

0 commit comments

Comments
 (0)