Skip to content

Commit a0dd23e

Browse files
tmp save
1 parent 529a9ce commit a0dd23e

File tree

6 files changed

+101
-39
lines changed

6 files changed

+101
-39
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/AotQueryCreator.java

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
import java.util.ArrayList;
1919
import java.util.Iterator;
2020
import java.util.List;
21-
import java.util.stream.Collectors;
22-
import java.util.stream.IntStream;
2321

2422
import org.bson.conversions.Bson;
2523
import org.jspecify.annotations.NullUnmarked;
@@ -30,8 +28,11 @@
3028
import org.springframework.data.domain.ScrollPosition;
3129
import org.springframework.data.domain.Sort;
3230
import org.springframework.data.domain.Vector;
31+
import org.springframework.data.geo.Circle;
3332
import org.springframework.data.geo.Distance;
33+
import org.springframework.data.geo.Metrics;
3434
import org.springframework.data.geo.Point;
35+
import org.springframework.data.geo.Shape;
3536
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
3637
import org.springframework.data.mongodb.core.convert.MongoWriter;
3738
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
@@ -43,7 +44,6 @@
4344
import org.springframework.data.mongodb.core.query.UpdateDefinition;
4445
import org.springframework.data.mongodb.repository.query.ConvertingParameterAccessor;
4546
import org.springframework.data.mongodb.repository.query.MongoParameterAccessor;
46-
import org.springframework.data.mongodb.repository.query.MongoParameters;
4747
import org.springframework.data.mongodb.repository.query.MongoQueryCreator;
4848
import org.springframework.data.repository.query.Parameter;
4949
import org.springframework.data.repository.query.Parameters;
@@ -132,8 +132,12 @@ public PlaceholderParameterAccessor(QueryMethod queryMethod) {
132132
Parameters<?, ?> parameters = queryMethod.getParameters();
133133
for(Parameter parameter : parameters.toList()) {
134134
if(ClassUtils.isAssignable(Point.class, parameter.getType())) {
135-
placeholders.add(parameter.getIndex(), new GeoPlaceholder(parameter.getIndex()));
136-
} else {
135+
placeholders.add(parameter.getIndex(), new PointPlaceholder(parameter.getIndex()));
136+
} else if(ClassUtils.isAssignable(Circle.class, parameter.getType())) {
137+
placeholders.add(parameter.getIndex(), new CirclePlaceholder(parameter.getIndex()));
138+
}
139+
140+
else {
137141
placeholders.add(parameter.getIndex(), Placeholder.indexed(parameter.getIndex()));
138142
}
139143
}
@@ -222,11 +226,30 @@ public Iterator<Object> iterator() {
222226
}
223227
}
224228

225-
static class GeoPlaceholder extends Point implements Placeholder {
229+
static class CirclePlaceholder extends Circle implements Placeholder {
230+
231+
int index;
232+
public CirclePlaceholder(int index) {
233+
super(new PointPlaceholder(index), Distance.of(1, Metrics.NEUTRAL)); //
234+
this.index = index;
235+
}
236+
237+
@Override
238+
public Object getValue() {
239+
return "?%s".formatted(index);
240+
}
241+
242+
@Override
243+
public String toString() {
244+
return getValue().toString();
245+
}
246+
}
247+
248+
static class PointPlaceholder extends Point implements Placeholder {
226249

227250
int index;
228251

229-
public GeoPlaceholder(int index) {
252+
public PointPlaceholder(int index) {
230253
super(Double.NaN, Double.NaN);
231254
this.index = index;
232255
}

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/BsonUtils.java

Lines changed: 43 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -64,19 +64,19 @@
6464
import org.bson.codecs.configuration.CodecRegistries;
6565
import org.bson.codecs.configuration.CodecRegistry;
6666
import org.bson.conversions.Bson;
67-
import org.bson.internal.ProvidersCodecRegistry;
6867
import org.bson.json.JsonParseException;
6968
import org.bson.types.Binary;
7069
import org.bson.types.Decimal128;
7170
import org.bson.types.ObjectId;
7271
import org.jspecify.annotations.NullUnmarked;
7372
import org.jspecify.annotations.Nullable;
7473
import org.springframework.core.convert.converter.Converter;
74+
import org.springframework.data.geo.Circle;
7575
import org.springframework.data.mongodb.CodecRegistryProvider;
7676
import org.springframework.data.mongodb.core.mapping.FieldName;
7777
import org.springframework.data.mongodb.core.mapping.FieldName.Type;
7878
import org.springframework.data.mongodb.core.query.CriteriaDefinition.Placeholder;
79-
import org.springframework.data.mongodb.core.query.CriteriaDefinition.PlaceholderImpl;
79+
import org.springframework.data.mongodb.core.query.GeoCommand;
8080
import org.springframework.lang.Contract;
8181
import org.springframework.util.Assert;
8282
import org.springframework.util.ClassUtils;
@@ -1038,15 +1038,21 @@ public void flush() {
10381038
public static class PlaceholderCodecProvider implements CodecProvider {
10391039

10401040
PlaceholderCodec placeholderCodec = new PlaceholderCodec();
1041+
GeoCommandCodec geoCommandCodec = new GeoCommandCodec();
10411042

10421043
@Override
10431044
public <T> Codec<T> get(Class<T> clazz, CodecRegistry registry) {
1044-
if(!ClassUtils.isAssignable(Placeholder.class, clazz)) {
1045-
return null;
1045+
if (ClassUtils.isAssignable(Placeholder.class, clazz)) {
1046+
return (Codec<T>) placeholderCodec;
1047+
}
1048+
if (ClassUtils.isAssignable(GeoCommand.class, clazz)) {
1049+
return (Codec<T>) geoCommandCodec;
10461050
}
1047-
return (Codec<T>) placeholderCodec;
1051+
return null;
1052+
10481053
}
10491054
}
1055+
10501056
/**
10511057
* Internal {@link Codec} implementation to write
10521058
* {@link org.springframework.data.mongodb.core.query.CriteriaDefinition.Placeholder placeholders}.
@@ -1077,25 +1083,36 @@ public Class<Placeholder> getEncoderClass() {
10771083
}
10781084
}
10791085

1080-
// @NullUnmarked
1081-
// static class PlaceholderImplCodec implements Codec<PlaceholderImpl> {
1082-
//
1083-
// PlaceholderCodec delegate = new PlaceholderCodec();
1084-
//
1085-
// @Override
1086-
// public PlaceholderImpl decode(BsonReader reader, DecoderContext decoderContext) {
1087-
// return null;
1088-
// }
1089-
//
1090-
// @Override
1091-
// public void encode(BsonWriter writer, PlaceholderImpl value, EncoderContext encoderContext) {
1092-
// delegate.encode(writer, value, encoderContext);
1093-
//
1094-
// }
1095-
//
1096-
// @Override
1097-
// public Class<PlaceholderImpl> getEncoderClass() {
1098-
// return PlaceholderImpl.class;
1099-
// }
1100-
// }
1086+
static class GeoCommandCodec implements Codec<GeoCommand> {
1087+
1088+
@Override
1089+
public GeoCommand decode(BsonReader reader, DecoderContext decoderContext) {
1090+
return null;
1091+
}
1092+
1093+
@Override
1094+
public void encode(BsonWriter writer, GeoCommand value, EncoderContext encoderContext) {
1095+
1096+
if (writer instanceof SpringJsonWriter sjw) {
1097+
writer.writeStartDocument();
1098+
writer.writeName(value.getCommand());
1099+
if (value.getShape() instanceof Placeholder p) { // maybe we should wrap input to use geo command object
1100+
sjw.writePlaceholder(p.toString());
1101+
// Circle c = null;
1102+
// List.of(c.getCenter(), c.getRadius())
1103+
// ;
1104+
1105+
// createQuery("{'location.coordinates':{'$geoWithin':{'$center':?0}}}", new Object[]{ List.of(circle.getCenter(), circle.getRadius()))
1106+
}
1107+
writer.writeEndDocument();
1108+
} else {
1109+
writer.writeString(value.getCommand(), value.getShape().toString());
1110+
}
1111+
}
1112+
1113+
@Override
1114+
public Class<GeoCommand> getEncoderClass() {
1115+
return null;
1116+
}
1117+
}
11011118
}

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/SpringJsonWriter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ public void writePlaceholder(String placeholder) {
463463
write(placeholder);
464464
}
465465

466-
private void write(String str) {
466+
public void write(String str) {
467467
buffer.append(str);
468468
}
469469

spring-data-mongodb/src/test/java/example/aot/UserRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@
3232
import org.springframework.data.domain.Slice;
3333
import org.springframework.data.domain.Sort;
3434
import org.springframework.data.domain.Window;
35+
import org.springframework.data.geo.Circle;
3536
import org.springframework.data.geo.Point;
3637
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
3738
import org.springframework.data.mongodb.repository.Aggregation;
3839
import org.springframework.data.mongodb.repository.Hint;
40+
import org.springframework.data.mongodb.repository.Person;
3941
import org.springframework.data.mongodb.repository.Query;
4042
import org.springframework.data.mongodb.repository.ReadPreference;
4143
import org.springframework.data.mongodb.repository.Update;
@@ -106,6 +108,8 @@ public interface UserRepository extends CrudRepository<User, String> {
106108

107109
List<User> findByLocationCoordinatesNear(Point location);
108110

111+
List<User> findByLocationCoordinatesWithin(Circle circle);
112+
109113
// TODO: GeoQueries
110114
// TODO: TextSearch
111115

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/aot/MongoRepositoryContributorTests.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,12 @@
4545
import org.springframework.data.domain.Slice;
4646
import org.springframework.data.domain.Sort;
4747
import org.springframework.data.domain.Window;
48+
import org.springframework.data.geo.Circle;
4849
import org.springframework.data.geo.Point;
4950
import org.springframework.data.mongodb.core.MongoOperations;
5051
import org.springframework.data.mongodb.core.MongoTemplate;
5152
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
53+
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
5254
import org.springframework.data.mongodb.test.util.Client;
5355
import org.springframework.data.mongodb.test.util.MongoClientExtension;
5456
import org.springframework.data.mongodb.test.util.MongoTestUtils;
@@ -88,10 +90,8 @@ MongoOperations mongoOperations() {
8890

8991
@BeforeAll
9092
static void beforeAll() {
91-
String idx = client.getDatabase(DB_NAME).getCollection("user").createIndex(new Document("location.coordinates", "2d"),
92-
// String idx = client.getDatabase(DB_NAME).getCollection("user").createIndex(new Document("location.coordinates", "2dsphere"),
93+
client.getDatabase(DB_NAME).getCollection("user").createIndex(new Document("location.coordinates", "2d"),
9394
new IndexOptions());
94-
System.out.println("idx: " + idx);
9595
}
9696

9797
@BeforeEach
@@ -605,11 +605,28 @@ void testAggregationWithCollation() {
605605
}
606606

607607
@Test
608-
void testGeoNear() {
608+
void testNear() {
609+
609610
List<User> users = fragment.findByLocationCoordinatesNear(new Point(-73.99171, 40.738868));
610611
assertThat(users).extracting(User::getUsername).containsExactly("leia");
611612
}
612613

614+
@Test
615+
void testNearWithGeoJson() {
616+
617+
List<User> users = fragment.findByLocationCoordinatesNear(new GeoJsonPoint(-73.99171, 40.738868));
618+
assertThat(users).extracting(User::getUsername).containsExactly("leia");
619+
}
620+
621+
@Test
622+
void testGeoWithin() {
623+
624+
List<User> users = fragment.findByLocationCoordinatesWithin(new Circle(-78.99171, 45.738868, 170));
625+
assertThat(users).extracting(User::getUsername).containsExactly("leia");
626+
}
627+
628+
//List<Person> result = repository.findByLocationWithin();
629+
613630
private static void initUsers() {
614631

615632
Document luke = Document.parse("""

spring-data-mongodb/src/test/resources/logback.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@
2020
<logger name="org.springframework.data.mongodb.test.util" level="info"/>
2121

2222
<!-- AOT Code Generation -->
23-
<logger name="org.springframework.data.repository.aot.generate.RepositoryContributor" level="warn" />
23+
<logger name="org.springframework.data.repository.aot.generate.RepositoryContributor" level="trace" />
2424

25+
<logger name="org.springframework.data.mongodb.core.MongoTemplate" level="debug"/>
2526
<root level="error">
2627
<appender-ref ref="console" />
2728
</root>

0 commit comments

Comments
 (0)