diff --git a/pom.xml b/pom.xml index 75830c6c..2de21486 100644 --- a/pom.xml +++ b/pom.xml @@ -21,8 +21,8 @@ DATACOUCH - 2.2.7 - 2.2.7 + 2.2.8 + 2.2.8 1.13.0.BUILD-SNAPSHOT 1.0.0.GA diff --git a/src/integration/java/org/springframework/data/couchbase/core/CouchbaseTemplateTests.java b/src/integration/java/org/springframework/data/couchbase/core/CouchbaseTemplateTests.java index 9668a851..df532d6b 100644 --- a/src/integration/java/org/springframework/data/couchbase/core/CouchbaseTemplateTests.java +++ b/src/integration/java/org/springframework/data/couchbase/core/CouchbaseTemplateTests.java @@ -17,17 +17,13 @@ package org.springframework.data.couchbase.core; import static com.couchbase.client.java.query.Select.select; -import static com.couchbase.client.java.query.dsl.Expression.i; -import static com.couchbase.client.java.query.dsl.Expression.s; -import static com.couchbase.client.java.query.dsl.Expression.x; +import static com.couchbase.client.java.query.dsl.Expression.*; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.*; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.LinkedList; @@ -35,10 +31,6 @@ import java.util.List; import java.util.Map; import java.util.Random; import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import com.couchbase.client.java.Bucket; @@ -48,6 +40,7 @@ import com.couchbase.client.java.query.N1qlParams; import com.couchbase.client.java.query.N1qlQuery; import com.couchbase.client.java.query.N1qlQueryResult; import com.couchbase.client.java.query.consistency.ScanConsistency; +import com.couchbase.client.java.repository.annotation.Field; import com.couchbase.client.java.view.Stale; import com.couchbase.client.java.view.ViewQuery; import com.fasterxml.jackson.core.type.TypeReference; @@ -64,7 +57,6 @@ import org.springframework.data.annotation.Version; import org.springframework.data.couchbase.IntegrationTestApplicationConfig; import org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter; import org.springframework.data.couchbase.core.mapping.Document; -import com.couchbase.client.java.repository.annotation.Field; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestExecutionListeners; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -499,6 +491,27 @@ public class CouchbaseTemplateTests { assertNull(template.findById(id, DocumentWithTouchOnRead.class)); } + /** + * @see DATACOUCH-227 + */ + @Test + public void shouldRetainOrderWhenQueryingViewOrdered() { + ViewQuery q = ViewQuery.from("test_beers", "by_name"); + q.descending().includeDocsOrdered(true); + + String prev = null; + List beers = template.findByView(q, Beer.class); + assertTrue(q.isIncludeDocs()); + assertTrue(q.isOrderRetained()); + assertEquals(RawJsonDocument.class, q.includeDocsTarget()); + for (Beer beer : beers) { + if (prev != null) { + assertThat(beer.getName() + " not alphabetically < to " + prev, beer.getName().compareTo(prev) < 0); + } + prev = beer.getName(); + } + } + /** * A sample document with just an id and property. */ diff --git a/src/main/java/org/springframework/data/couchbase/core/CouchbaseTemplate.java b/src/main/java/org/springframework/data/couchbase/core/CouchbaseTemplate.java index 61804711..0441cd5f 100644 --- a/src/main/java/org/springframework/data/couchbase/core/CouchbaseTemplate.java +++ b/src/main/java/org/springframework/data/couchbase/core/CouchbaseTemplate.java @@ -304,9 +304,12 @@ public class CouchbaseTemplate implements CouchbaseOperations, ApplicationEventP public List findByView(ViewQuery query, final Class entityClass) { //we'll always need to get documents, as a RawJsonDocument, so we should force that target class //so that the caller doesn't set a bad target class unintentionally, pre-loading with a bad type. - //TODO DATACOUCH-227 reproduce retainOrder parameter if (!query.isIncludeDocs() || !query.includeDocsTarget().equals(RawJsonDocument.class)) { - query.includeDocs(RawJsonDocument.class); + if (query.isOrderRetained()) { + query.includeDocsOrdered(RawJsonDocument.class); + } else { + query.includeDocs(RawJsonDocument.class); + } } //we'll always map the document to the entity, hence reduce never makes sense. query.reduce(false);