Skip to content

Commit e185be2

Browse files
committed
Test: INTERSECTS and DIJOINT conditions support in GeoSearch (#3862)
1 parent 6db51a8 commit e185be2

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
@@ -420,42 +420,42 @@ public void geoShapeFilterSpherical() throws ParseException {
420420
final Polygon small = factory.createPolygon(new Coordinate[]{new Coordinate(34.9001, 29.7001),
421421
new Coordinate(34.9001, 29.7100), new Coordinate(34.9100, 29.7100),
422422
new Coordinate(34.9100, 29.7001), new Coordinate(34.9001, 29.7001)});
423-
client.hset("small", "geom", small.toString());
423+
client.hsetObject("small", "geom", small);
424424

425425
final Polygon large = factory.createPolygon(new Coordinate[]{new Coordinate(34.9001, 29.7001),
426426
new Coordinate(34.9001, 29.7200), new Coordinate(34.9200, 29.7200),
427427
new Coordinate(34.9200, 29.7001), new Coordinate(34.9001, 29.7001)});
428-
client.hset("large", "geom", large.toString());
428+
client.hsetObject("large", "geom", large);
429429

430430
// within condition
431431
final Polygon within = factory.createPolygon(new Coordinate[]{new Coordinate(34.9000, 29.7000),
432432
new Coordinate(34.9000, 29.7150), new Coordinate(34.9150, 29.7150),
433433
new Coordinate(34.9150, 29.7000), new Coordinate(34.9000, 29.7000)});
434434

435-
SearchResult res = client.ftSearch(index, "@geom:[within $poly]",
435+
SearchResult result = client.ftSearch(index, "@geom:[within $poly]",
436436
FTSearchParams.searchParams().addParam("poly", within).dialect(3));
437-
assertEquals(1, res.getTotalResults());
438-
assertEquals(1, res.getDocuments().size());
439-
assertEquals(small, reader.read(res.getDocuments().get(0).getString("geom")));
437+
assertEquals(1, result.getTotalResults());
438+
assertEquals(1, result.getDocuments().size());
439+
assertEquals(small, reader.read(result.getDocuments().get(0).getString("geom")));
440440

441441
// contains condition
442442
final Polygon contains = factory.createPolygon(new Coordinate[]{new Coordinate(34.9002, 29.7002),
443443
new Coordinate(34.9002, 29.7050), new Coordinate(34.9050, 29.7050),
444444
new Coordinate(34.9050, 29.7002), new Coordinate(34.9002, 29.7002)});
445445

446-
res = client.ftSearch(index, "@geom:[contains $poly]",
446+
result = client.ftSearch(index, "@geom:[contains $poly]",
447447
FTSearchParams.searchParams().addParam("poly", contains).dialect(3));
448-
assertEquals(2, res.getTotalResults());
449-
assertEquals(2, res.getDocuments().size());
448+
assertEquals(2, result.getTotalResults());
449+
assertEquals(2, result.getDocuments().size());
450450

451451
// point type
452452
final Point point = factory.createPoint(new Coordinate(34.9010, 29.7010));
453453
client.hset("point", "geom", point.toString());
454454

455-
res = client.ftSearch(index, "@geom:[within $poly]",
455+
result = client.ftSearch(index, "@geom:[within $poly]",
456456
FTSearchParams.searchParams().addParam("poly", within).dialect(3));
457-
assertEquals(2, res.getTotalResults());
458-
assertEquals(2, res.getDocuments().size());
457+
assertEquals(2, result.getTotalResults());
458+
assertEquals(2, result.getDocuments().size());
459459
}
460460

461461
@Test
@@ -466,41 +466,57 @@ public void geoShapeFilterFlat() throws ParseException {
466466
assertOK(client.ftCreate(index, GeoShapeField.of("geom", CoordinateSystem.FLAT)));
467467

468468
// polygon type
469-
final Polygon small = factory.createPolygon(new Coordinate[]{new Coordinate(1, 1),
470-
new Coordinate(1, 100), new Coordinate(100, 100), new Coordinate(100, 1), new Coordinate(1, 1)});
471-
client.hset("small", "geom", small.toString());
469+
final Polygon small = factory.createPolygon(new Coordinate[]{new Coordinate(20, 20),
470+
new Coordinate(20, 100), new Coordinate(100, 100), new Coordinate(100, 20), new Coordinate(20, 20)});
471+
client.hsetObject("small", "geom", small);
472472

473-
final Polygon large = factory.createPolygon(new Coordinate[]{new Coordinate(1, 1),
474-
new Coordinate(1, 200), new Coordinate(200, 200), new Coordinate(200, 1), new Coordinate(1, 1)});
475-
client.hset("large", "geom", large.toString());
473+
final Polygon large = factory.createPolygon(new Coordinate[]{new Coordinate(10, 10),
474+
new Coordinate(10, 200), new Coordinate(200, 200), new Coordinate(200, 10), new Coordinate(10, 10)});
475+
client.hsetObject("large", "geom", large);
476476

477477
// within condition
478478
final Polygon within = factory.createPolygon(new Coordinate[]{new Coordinate(0, 0),
479479
new Coordinate(0, 150), new Coordinate(150, 150), new Coordinate(150, 0), new Coordinate(0, 0)});
480480

481-
SearchResult res = client.ftSearch(index, "@geom:[within $poly]",
481+
SearchResult result = client.ftSearch(index, "@geom:[within $poly]",
482482
FTSearchParams.searchParams().addParam("poly", within).dialect(3));
483-
assertEquals(1, res.getTotalResults());
484-
assertEquals(1, res.getDocuments().size());
485-
assertEquals(small, reader.read(res.getDocuments().get(0).getString("geom")));
483+
assertEquals(1, result.getTotalResults());
484+
assertEquals(1, result.getDocuments().size());
485+
assertEquals(small, reader.read(result.getDocuments().get(0).getString("geom")));
486486

487487
// contains condition
488-
final Polygon contains = factory.createPolygon(new Coordinate[]{new Coordinate(2, 2),
489-
new Coordinate(2, 50), new Coordinate(50, 50), new Coordinate(50, 2), new Coordinate(2, 2)});
488+
final Polygon contains = factory.createPolygon(new Coordinate[]{new Coordinate(25, 25),
489+
new Coordinate(25, 50), new Coordinate(50, 50), new Coordinate(50, 25), new Coordinate(25, 25)});
490490

491-
res = client.ftSearch(index, "@geom:[contains $poly]",
491+
result = client.ftSearch(index, "@geom:[contains $poly]",
492492
FTSearchParams.searchParams().addParam("poly", contains).dialect(3));
493-
assertEquals(2, res.getTotalResults());
494-
assertEquals(2, res.getDocuments().size());
493+
assertEquals(2, result.getTotalResults());
494+
assertEquals(2, result.getDocuments().size());
495+
496+
// intersects and disjoint
497+
final Polygon disjointersect = factory.createPolygon(new Coordinate[]{new Coordinate(150, 150),
498+
new Coordinate(150, 250), new Coordinate(250, 250), new Coordinate(250, 150), new Coordinate(150, 150)});
499+
500+
result = client.ftSearch(index, "@geom:[intersects $poly]",
501+
FTSearchParams.searchParams().addParam("poly", disjointersect).dialect(3));
502+
assertEquals(1, result.getTotalResults());
503+
assertEquals(1, result.getDocuments().size());
504+
assertEquals(large, reader.read(result.getDocuments().get(0).getString("geom")));
505+
506+
result = client.ftSearch(index, "@geom:[disjoint $poly]",
507+
FTSearchParams.searchParams().addParam("poly", disjointersect).dialect(3));
508+
assertEquals(1, result.getTotalResults());
509+
assertEquals(1, result.getDocuments().size());
510+
assertEquals(small, reader.read(result.getDocuments().get(0).getString("geom")));
495511

496512
// point type
497-
final Point point = factory.createPoint(new Coordinate(10, 10));
498-
client.hset("point", "geom", point.toString());
513+
final Point point = factory.createPoint(new Coordinate(30, 30));
514+
client.hsetObject("point", "geom", point);
499515

500-
res = client.ftSearch(index, "@geom:[within $poly]",
516+
result = client.ftSearch(index, "@geom:[within $poly]",
501517
FTSearchParams.searchParams().addParam("poly", within).dialect(3));
502-
assertEquals(2, res.getTotalResults());
503-
assertEquals(2, res.getDocuments().size());
518+
assertEquals(2, result.getTotalResults());
519+
assertEquals(2, result.getDocuments().size());
504520
}
505521

506522
@Test

0 commit comments

Comments
 (0)