Skip to content

Commit 856804a

Browse files
committed
Test: INTERSECTS and DIJOINT conditions support in GeoSearch (#3862)
1 parent ec0e4d0 commit 856804a

File tree

2 files changed

+64
-45
lines changed

2 files changed

+64
-45
lines changed

Diff for: src/test/java/redis/clients/jedis/examples/GeoShapeFieldsUsageInRediSearch.java

+16-13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package redis.clients.jedis.examples;
22

3-
import java.util.Collections;
43
import org.junit.Assert;
54

65
import org.locationtech.jts.geom.Coordinate;
@@ -14,16 +13,21 @@
1413
import redis.clients.jedis.JedisPooled;
1514
import redis.clients.jedis.UnifiedJedis;
1615
import redis.clients.jedis.search.FTSearchParams;
17-
import redis.clients.jedis.search.RediSearchUtil;
1816
import redis.clients.jedis.search.SearchResult;
1917
import redis.clients.jedis.search.schemafields.GeoShapeField;
2018

2119
/**
2220
* As of RediSearch 2.8.4, advanced GEO querying with GEOSHAPE fields is supported.
21+
* <p>
22+
* Notes:
23+
* <ul>
24+
* <li>As of RediSearch 2.8.4, only POLYGON and POINT objects are supported.</li>
25+
* <li>As of RediSearch 2.8.4, only WITHIN and CONTAINS conditions are supported.</li>
26+
* <li>As of RedisStack 7.4.0, support for INTERSECTS and DISJOINT conditions are added.</li>
27+
* </ul>
2328
*
24-
* Any object/library producing a
25-
* <a href="https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry"> well-known
26-
* text (WKT)</a> in {@code toString()} method can be used.
29+
* Any object/library producing a <a href="https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry">
30+
* well-known text (WKT)</a> in {@code toString()} method can be used.
2731
*
2832
* This example uses the <a href="https://github.com/locationtech/jts">JTS</a> library.
2933
* <pre>
@@ -65,7 +69,8 @@ public static void main(String[] args) {
6569
);
6670

6771
// client.hset("small", RediSearchUtil.toStringMap(Collections.singletonMap("geometry", small))); // setting data
68-
client.hset("small", "geometry", small.toString()); // simplified setting data
72+
// client.hset("small", "geometry", small.toString()); // simplified setting data
73+
client.hsetObject("small", "geometry", small); // more simplified setting data
6974

7075
final Polygon large = factory.createPolygon(
7176
new Coordinate[]{new Coordinate(34.9001, 29.7001),
@@ -74,7 +79,8 @@ public static void main(String[] args) {
7479
);
7580

7681
// client.hset("large", RediSearchUtil.toStringMap(Collections.singletonMap("geometry", large))); // setting data
77-
client.hset("large", "geometry", large.toString()); // simplified setting data
82+
// client.hset("large", "geometry", large.toString()); // simplified setting data
83+
client.hsetObject("large", "geometry", large); // more simplified setting data
7884

7985
// searching
8086
final Polygon within = factory.createPolygon(
@@ -84,11 +90,10 @@ public static void main(String[] args) {
8490
);
8591

8692
SearchResult res = client.ftSearch("geometry-index",
87-
"@geometry:[within $poly]", // querying 'within' condition.
88-
// RediSearch also supports 'contains' condition.
93+
"@geometry:[within $poly]", // query string
8994
FTSearchParams.searchParams()
9095
.addParam("poly", within)
91-
.dialect(3) // DIALECT '3' is required for this query
96+
.dialect(3) // DIALECT '3' is required for this query
9297
);
9398
Assert.assertEquals(1, res.getTotalResults());
9499
Assert.assertEquals(1, res.getDocuments().size());
@@ -98,10 +103,8 @@ public static void main(String[] args) {
98103
final WKTReader reader = new WKTReader();
99104
Geometry object = reader.read(res.getDocuments().get(0).getString("geometry"));
100105
Assert.assertEquals(small, object);
101-
} catch (ParseException ex) {
106+
} catch (ParseException ex) { // WKTReader#read throws ParseException
102107
ex.printStackTrace(System.err);
103108
}
104109
}
105-
106-
// Note: As of RediSearch 2.8.4, only POLYGON and POINT objects are supported.
107110
}

Diff for: src/test/java/redis/clients/jedis/modules/search/SearchWithParamsTest.java

+48-32
Original file line numberDiff line numberDiff line change
@@ -428,42 +428,42 @@ public void geoShapeFilterSpherical() throws ParseException {
428428
final Polygon small = factory.createPolygon(new Coordinate[]{new Coordinate(34.9001, 29.7001),
429429
new Coordinate(34.9001, 29.7100), new Coordinate(34.9100, 29.7100),
430430
new Coordinate(34.9100, 29.7001), new Coordinate(34.9001, 29.7001)});
431-
client.hset("small", "geom", small.toString());
431+
client.hsetObject("small", "geom", small);
432432

433433
final Polygon large = factory.createPolygon(new Coordinate[]{new Coordinate(34.9001, 29.7001),
434434
new Coordinate(34.9001, 29.7200), new Coordinate(34.9200, 29.7200),
435435
new Coordinate(34.9200, 29.7001), new Coordinate(34.9001, 29.7001)});
436-
client.hset("large", "geom", large.toString());
436+
client.hsetObject("large", "geom", large);
437437

438438
// within condition
439439
final Polygon within = factory.createPolygon(new Coordinate[]{new Coordinate(34.9000, 29.7000),
440440
new Coordinate(34.9000, 29.7150), new Coordinate(34.9150, 29.7150),
441441
new Coordinate(34.9150, 29.7000), new Coordinate(34.9000, 29.7000)});
442442

443-
SearchResult res = client.ftSearch(index, "@geom:[within $poly]",
443+
SearchResult result = client.ftSearch(index, "@geom:[within $poly]",
444444
FTSearchParams.searchParams().addParam("poly", within).dialect(3));
445-
assertEquals(1, res.getTotalResults());
446-
assertEquals(1, res.getDocuments().size());
447-
assertEquals(small, reader.read(res.getDocuments().get(0).getString("geom")));
445+
assertEquals(1, result.getTotalResults());
446+
assertEquals(1, result.getDocuments().size());
447+
assertEquals(small, reader.read(result.getDocuments().get(0).getString("geom")));
448448

449449
// contains condition
450450
final Polygon contains = factory.createPolygon(new Coordinate[]{new Coordinate(34.9002, 29.7002),
451451
new Coordinate(34.9002, 29.7050), new Coordinate(34.9050, 29.7050),
452452
new Coordinate(34.9050, 29.7002), new Coordinate(34.9002, 29.7002)});
453453

454-
res = client.ftSearch(index, "@geom:[contains $poly]",
454+
result = client.ftSearch(index, "@geom:[contains $poly]",
455455
FTSearchParams.searchParams().addParam("poly", contains).dialect(3));
456-
assertEquals(2, res.getTotalResults());
457-
assertEquals(2, res.getDocuments().size());
456+
assertEquals(2, result.getTotalResults());
457+
assertEquals(2, result.getDocuments().size());
458458

459459
// point type
460460
final Point point = factory.createPoint(new Coordinate(34.9010, 29.7010));
461461
client.hset("point", "geom", point.toString());
462462

463-
res = client.ftSearch(index, "@geom:[within $poly]",
463+
result = client.ftSearch(index, "@geom:[within $poly]",
464464
FTSearchParams.searchParams().addParam("poly", within).dialect(3));
465-
assertEquals(2, res.getTotalResults());
466-
assertEquals(2, res.getDocuments().size());
465+
assertEquals(2, result.getTotalResults());
466+
assertEquals(2, result.getDocuments().size());
467467
}
468468

469469
@Test
@@ -474,41 +474,57 @@ public void geoShapeFilterFlat() throws ParseException {
474474
assertOK(client.ftCreate(index, GeoShapeField.of("geom", CoordinateSystem.FLAT)));
475475

476476
// polygon type
477-
final Polygon small = factory.createPolygon(new Coordinate[]{new Coordinate(1, 1),
478-
new Coordinate(1, 100), new Coordinate(100, 100), new Coordinate(100, 1), new Coordinate(1, 1)});
479-
client.hset("small", "geom", small.toString());
477+
final Polygon small = factory.createPolygon(new Coordinate[]{new Coordinate(20, 20),
478+
new Coordinate(20, 100), new Coordinate(100, 100), new Coordinate(100, 20), new Coordinate(20, 20)});
479+
client.hsetObject("small", "geom", small);
480480

481-
final Polygon large = factory.createPolygon(new Coordinate[]{new Coordinate(1, 1),
482-
new Coordinate(1, 200), new Coordinate(200, 200), new Coordinate(200, 1), new Coordinate(1, 1)});
483-
client.hset("large", "geom", large.toString());
481+
final Polygon large = factory.createPolygon(new Coordinate[]{new Coordinate(10, 10),
482+
new Coordinate(10, 200), new Coordinate(200, 200), new Coordinate(200, 10), new Coordinate(10, 10)});
483+
client.hsetObject("large", "geom", large);
484484

485485
// within condition
486486
final Polygon within = factory.createPolygon(new Coordinate[]{new Coordinate(0, 0),
487487
new Coordinate(0, 150), new Coordinate(150, 150), new Coordinate(150, 0), new Coordinate(0, 0)});
488488

489-
SearchResult res = client.ftSearch(index, "@geom:[within $poly]",
489+
SearchResult result = client.ftSearch(index, "@geom:[within $poly]",
490490
FTSearchParams.searchParams().addParam("poly", within).dialect(3));
491-
assertEquals(1, res.getTotalResults());
492-
assertEquals(1, res.getDocuments().size());
493-
assertEquals(small, reader.read(res.getDocuments().get(0).getString("geom")));
491+
assertEquals(1, result.getTotalResults());
492+
assertEquals(1, result.getDocuments().size());
493+
assertEquals(small, reader.read(result.getDocuments().get(0).getString("geom")));
494494

495495
// contains condition
496-
final Polygon contains = factory.createPolygon(new Coordinate[]{new Coordinate(2, 2),
497-
new Coordinate(2, 50), new Coordinate(50, 50), new Coordinate(50, 2), new Coordinate(2, 2)});
496+
final Polygon contains = factory.createPolygon(new Coordinate[]{new Coordinate(25, 25),
497+
new Coordinate(25, 50), new Coordinate(50, 50), new Coordinate(50, 25), new Coordinate(25, 25)});
498498

499-
res = client.ftSearch(index, "@geom:[contains $poly]",
499+
result = client.ftSearch(index, "@geom:[contains $poly]",
500500
FTSearchParams.searchParams().addParam("poly", contains).dialect(3));
501-
assertEquals(2, res.getTotalResults());
502-
assertEquals(2, res.getDocuments().size());
501+
assertEquals(2, result.getTotalResults());
502+
assertEquals(2, result.getDocuments().size());
503+
504+
// intersects and disjoint
505+
final Polygon disjointersect = factory.createPolygon(new Coordinate[]{new Coordinate(150, 150),
506+
new Coordinate(150, 250), new Coordinate(250, 250), new Coordinate(250, 150), new Coordinate(150, 150)});
507+
508+
result = client.ftSearch(index, "@geom:[intersects $poly]",
509+
FTSearchParams.searchParams().addParam("poly", disjointersect).dialect(3));
510+
assertEquals(1, result.getTotalResults());
511+
assertEquals(1, result.getDocuments().size());
512+
assertEquals(large, reader.read(result.getDocuments().get(0).getString("geom")));
513+
514+
result = client.ftSearch(index, "@geom:[disjoint $poly]",
515+
FTSearchParams.searchParams().addParam("poly", disjointersect).dialect(3));
516+
assertEquals(1, result.getTotalResults());
517+
assertEquals(1, result.getDocuments().size());
518+
assertEquals(small, reader.read(result.getDocuments().get(0).getString("geom")));
503519

504520
// point type
505-
final Point point = factory.createPoint(new Coordinate(10, 10));
506-
client.hset("point", "geom", point.toString());
521+
final Point point = factory.createPoint(new Coordinate(30, 30));
522+
client.hsetObject("point", "geom", point);
507523

508-
res = client.ftSearch(index, "@geom:[within $poly]",
524+
result = client.ftSearch(index, "@geom:[within $poly]",
509525
FTSearchParams.searchParams().addParam("poly", within).dialect(3));
510-
assertEquals(2, res.getTotalResults());
511-
assertEquals(2, res.getDocuments().size());
526+
assertEquals(2, result.getTotalResults());
527+
assertEquals(2, result.getDocuments().size());
512528
}
513529

514530
@Test

0 commit comments

Comments
 (0)