From c47bd4cbe53e93c06f9b9f1e79c5bf4240b0c046 Mon Sep 17 00:00:00 2001
From: Christoph Strobl {
+ private static final JsonWriterSettings JSON_WRITER_SETTINGS = JsonWriterSettings.builder().outputMode(JsonMode.SHELL)
+ .build();
+
private final MongodbDocumentSerializer serializer;
private final QueryMixin
queryMixin;
@@ -195,8 +200,65 @@ Document asDocument() {
return createQuery(queryMixin.getMetadata().getWhere());
}
+ /**
+ * Returns the {@literal Mongo Shell} representation of the query.
+ * The following query
+ *
+ *
+ *
+ * where(p.lastname.eq("Matthews")).orderBy(p.firstname.asc()).offset(1).limit(5);
+ *
+ *
+ * results in
+ *
+ *
+ *
+ * find({"lastname" : "Matthews"}).sort({"firstname" : 1}).skip(1).limit(5)
+ *
+ *
+ * @return never {@literal null}.
+ */
@Override
public String toString() {
- return asDocument().toString();
+
+ Document projection = createProjection(queryMixin.getMetadata().getProjection());
+ Document sort = createSort(queryMixin.getMetadata().getOrderBy());
+
+ StringBuilder sb = new StringBuilder("find(" + asDocument().toJson(JSON_WRITER_SETTINGS));
+ if (!projection.isEmpty()) {
+ sb.append(", " + projection.toJson(JSON_WRITER_SETTINGS));
+ }
+ sb.append(")");
+ if (!sort.isEmpty()) {
+ sb.append(".sort(" + sort.toJson(JSON_WRITER_SETTINGS) + ")");
+ }
+ if (queryMixin.getMetadata().getModifiers().getOffset() != null) {
+ sb.append(".skip(" + queryMixin.getMetadata().getModifiers().getOffset() + ")");
+ }
+ if (queryMixin.getMetadata().getModifiers().getLimit() != null) {
+ sb.append(".limit(" + queryMixin.getMetadata().getModifiers().getLimit() + ")");
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Obtain the {@literal Mongo Shell} json query representation.
+ *
+ * @return never {@literal null}.
+ * @since 2.2
+ */
+ public String toJson() {
+ return toJson(JSON_WRITER_SETTINGS);
+ }
+
+ /**
+ * Obtain the json query representation applying given {@link JsonWriterSettings settings}.
+ *
+ * @param settings must not be {@literal null}.
+ * @return never {@literal null}.
+ * @since 2.2
+ */
+ public String toJson(JsonWriterSettings settings) {
+ return asDocument().toJson(settings);
}
}
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupportTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupportTests.java
index b36084729d..daa847c259 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupportTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupportTests.java
@@ -25,7 +25,6 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.annotation.Id;
@@ -39,6 +38,7 @@
import org.springframework.data.mongodb.repository.User;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.util.StringUtils;
/**
* Unit tests for {@link QuerydslRepositorySupport}.
@@ -248,6 +248,33 @@ public void shouldUseStringForValidObjectIdHexStrings() {
assertThat(inQuery.fetchOne()).isEqualTo(document);
}
+ @Test // DATAMONGO-2327
+ public void toJsonShouldRenderQuery() {
+
+ QPerson p = QPerson.person;
+ SpringDataMongodbQuery
concrete subtype * @author laimw * @author Mark Paluch @@ -184,7 +187,7 @@ protected Document createSort(List> orderSpecifiers) { /** * Get the actual {@link QueryMixin} delegate. - * + * * @return */ QueryMixin getQueryMixin() { @@ -216,6 +219,9 @@ Document asDocument() { * find({"lastname" : "Matthews"}).sort({"firstname" : 1}).skip(1).limit(5) * * + * Note that encoding to {@link String} may fail when using data types that cannot be encoded or DBRef's without an + * identifier. + * * @return never {@literal null}. */ @Override @@ -223,27 +229,28 @@ public String toString() { Document projection = createProjection(queryMixin.getMetadata().getProjection()); Document sort = createSort(queryMixin.getMetadata().getOrderBy()); + DocumentCodec codec = new DocumentCodec(MongoClientSettings.getDefaultCodecRegistry()); - StringBuilder sb = new StringBuilder("find(" + asDocument().toJson(JSON_WRITER_SETTINGS)); + StringBuilder sb = new StringBuilder("find(" + asDocument().toJson(JSON_WRITER_SETTINGS, codec)); if (!projection.isEmpty()) { - sb.append(", " + projection.toJson(JSON_WRITER_SETTINGS)); + sb.append(", ").append(projection.toJson(JSON_WRITER_SETTINGS, codec)); } sb.append(")"); if (!sort.isEmpty()) { - sb.append(".sort(" + sort.toJson(JSON_WRITER_SETTINGS) + ")"); + sb.append(".sort(").append(sort.toJson(JSON_WRITER_SETTINGS, codec)).append(")"); } if (queryMixin.getMetadata().getModifiers().getOffset() != null) { - sb.append(".skip(" + queryMixin.getMetadata().getModifiers().getOffset() + ")"); + sb.append(".skip(").append(queryMixin.getMetadata().getModifiers().getOffset()).append(")"); } if (queryMixin.getMetadata().getModifiers().getLimit() != null) { - sb.append(".limit(" + queryMixin.getMetadata().getModifiers().getLimit() + ")"); + sb.append(".limit(").append(queryMixin.getMetadata().getModifiers().getLimit()).append(")"); } return sb.toString(); } /** * Obtain the {@literal Mongo Shell} json query representation. - * + * * @return never {@literal null}. * @since 2.2 */ diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupportTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupportTests.java index daa847c259..6d908df879 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupportTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupportTests.java @@ -25,6 +25,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.DirectFieldAccessor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.annotation.Id; @@ -262,17 +263,23 @@ public void toJsonShouldRenderQuery() { public void toStringShouldRenderQuery() { QPerson p = QPerson.person; - SpringDataMongodbQueryquery = repoSupport.from(p).where(p.lastname.eq("Matthews")); + User user = new User(); + user.setId("id"); + SpringDataMongodbQuery query = repoSupport.from(p) + .where(p.lastname.eq("Matthews").and(p.coworker.eq(user))); - assertThat(StringUtils.trimAllWhitespace(query.toString())).isEqualTo("find({\"lastname\":\"Matthews\"})"); + assertThat(StringUtils.trimAllWhitespace(query.toString())) + .isEqualTo("find({\"lastname\":\"Matthews\",\"coworker\":{\"$ref\":\"user\",\"$id\":\"id\"}})"); query = query.orderBy(p.firstname.asc()); assertThat(StringUtils.trimAllWhitespace(query.toString())) - .isEqualTo("find({\"lastname\":\"Matthews\"}).sort({\"firstname\":1})"); + .isEqualTo( + "find({\"lastname\":\"Matthews\",\"coworker\":{\"$ref\":\"user\",\"$id\":\"id\"}}).sort({\"firstname\":1})"); query = query.offset(1).limit(5); assertThat(StringUtils.trimAllWhitespace(query.toString())) - .isEqualTo("find({\"lastname\":\"Matthews\"}).sort({\"firstname\":1}).skip(1).limit(5)"); + .isEqualTo( + "find({\"lastname\":\"Matthews\",\"coworker\":{\"$ref\":\"user\",\"$id\":\"id\"}}).sort({\"firstname\":1}).skip(1).limit(5)"); } @Data