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);