From 530f7396fa90fc01bc9b20e5176cbaf94ed57d5d Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 20 Jan 2016 13:10:50 +0100 Subject: [PATCH] =?UTF-8?q?DATAMONGO-1360=20-=20Query=20instances=20contai?= =?UTF-8?q?ned=20in=20a=20Near=20Query=20now=20get=20mapped=20during=20geo?= =?UTF-8?q?Near(=E2=80=A6)=20execution.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A Query instance which might be part of a NearQuery definition is now passed through the QueryMapper to make sure complex types contained in it or even in more general types that have custom conversions registered are mapped correctly before the near command is actually executed. --- .../data/mongodb/core/MongoTemplate.java | 9 ++++++++- .../springframework/data/mongodb/core/Venue.java | 13 +++++++++++-- .../mongodb/core/geo/AbstractGeoSpatialTests.java | 13 ++++++++++++- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index 034fbb726..18e7d2411 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -630,8 +630,15 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { } String collection = StringUtils.hasText(collectionName) ? collectionName : determineCollectionName(entityClass); + DBObject nearDbObject = near.toDBObject(); + BasicDBObject command = new BasicDBObject("geoNear", collection); - command.putAll(near.toDBObject()); + command.putAll(nearDbObject); + + if (nearDbObject.containsField("query")) { + DBObject query = (DBObject) nearDbObject.get("query"); + command.put("query", queryMapper.getMappedObject(query, getPersistentEntity(entityClass))); + } CommandResult commandResult = executeCommand(command, this.readPreference); List results = (List) commandResult.get("results"); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/Venue.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/Venue.java index 2e46fa30a..0759c0b18 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/Venue.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/Venue.java @@ -17,6 +17,7 @@ package org.springframework.data.mongodb.core; import java.util.Arrays; +import org.joda.time.LocalDate; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.PersistenceConstructor; import org.springframework.data.mongodb.core.mapping.Document; @@ -24,10 +25,10 @@ import org.springframework.data.mongodb.core.mapping.Document; @Document(collection = "newyork") public class Venue { - @Id - private String id; + @Id private String id; private String name; private double[] location; + private LocalDate openingDate; @PersistenceConstructor Venue(String name, double[] location) { @@ -50,6 +51,14 @@ public class Venue { return location; } + public LocalDate getOpeningDate() { + return openingDate; + } + + public void setOpeningDate(LocalDate openingDate) { + this.openingDate = openingDate; + } + @Override public String toString() { return "Venue [id=" + id + ", name=" + name + ", location=" + Arrays.toString(location) + "]"; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/AbstractGeoSpatialTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/AbstractGeoSpatialTests.java index 15ba5b74c..9b756bf01 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/AbstractGeoSpatialTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/geo/AbstractGeoSpatialTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2015 the original author or authors. + * Copyright 2015-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ import static org.springframework.data.mongodb.core.query.Query.*; import java.util.List; +import org.joda.time.LocalDate; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -49,6 +50,7 @@ import com.mongodb.WriteConcern; /** * @author Christoph Strobl + * @author Oliver Gierke */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration @@ -173,4 +175,13 @@ public abstract class AbstractGeoSpatialTests { assertThat(venues.size(), is(11)); } + /** + * @see DATAMONGO-1360 + */ + @Test + public void mapsQueryContainedInNearQuery() { + + Query query = query(where("openingDate").lt(LocalDate.now())); + template.geoNear(NearQuery.near(1.5, 1.7).query(query), Venue.class); + } }