Skip to content

Commit ef79d54

Browse files
authored
Test: INTERSECTS and DIJOINT conditions support in GeoSearch (#3862)
1 parent 7c898b8 commit ef79d54

File tree

2 files changed

+64
-45
lines changed

2 files changed

+64
-45
lines changed

src/test/java/redis/clients/jedis/examples/GeoShapeFieldsUsageInRediSearch.java

Lines changed: 16 additions & 13 deletions
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
}

src/test/java/redis/clients/jedis/modules/search/SearchWithParamsTest.java

Lines changed: 48 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -360,42 +360,42 @@ public void geoShapeFilterSpherical() throws ParseException {
360360
final Polygon small = factory.createPolygon(new Coordinate[]{new Coordinate(34.9001, 29.7001),
361361
new Coordinate(34.9001, 29.7100), new Coordinate(34.9100, 29.7100),
362362
new Coordinate(34.9100, 29.7001), new Coordinate(34.9001, 29.7001)});
363-
client.hset("small", "geom", small.toString());
363+
client.hsetObject("small", "geom", small);
364364

365365
final Polygon large = factory.createPolygon(new Coordinate[]{new Coordinate(34.9001, 29.7001),
366366
new Coordinate(34.9001, 29.7200), new Coordinate(34.9200, 29.7200),
367367
new Coordinate(34.9200, 29.7001), new Coordinate(34.9001, 29.7001)});
368-
client.hset("large", "geom", large.toString());
368+
client.hsetObject("large", "geom", large);
369369

370370
// within condition
371371
final Polygon within = factory.createPolygon(new Coordinate[]{new Coordinate(34.9000, 29.7000),
372372
new Coordinate(34.9000, 29.7150), new Coordinate(34.9150, 29.7150),
373373
new Coordinate(34.9150, 29.7000), new Coordinate(34.9000, 29.7000)});
374374

375-
SearchResult res = client.ftSearch(index, "@geom:[within $poly]",
375+
SearchResult result = client.ftSearch(index, "@geom:[within $poly]",
376376
FTSearchParams.searchParams().addParam("poly", within).dialect(3));
377-
assertEquals(1, res.getTotalResults());
378-
assertEquals(1, res.getDocuments().size());
379-
assertEquals(small, reader.read(res.getDocuments().get(0).getString("geom")));
377+
assertEquals(1, result.getTotalResults());
378+
assertEquals(1, result.getDocuments().size());
379+
assertEquals(small, reader.read(result.getDocuments().get(0).getString("geom")));
380380

381381
// contains condition
382382
final Polygon contains = factory.createPolygon(new Coordinate[]{new Coordinate(34.9002, 29.7002),
383383
new Coordinate(34.9002, 29.7050), new Coordinate(34.9050, 29.7050),
384384
new Coordinate(34.9050, 29.7002), new Coordinate(34.9002, 29.7002)});
385385

386-
res = client.ftSearch(index, "@geom:[contains $poly]",
386+
result = client.ftSearch(index, "@geom:[contains $poly]",
387387
FTSearchParams.searchParams().addParam("poly", contains).dialect(3));
388-
assertEquals(2, res.getTotalResults());
389-
assertEquals(2, res.getDocuments().size());
388+
assertEquals(2, result.getTotalResults());
389+
assertEquals(2, result.getDocuments().size());
390390

391391
// point type
392392
final Point point = factory.createPoint(new Coordinate(34.9010, 29.7010));
393393
client.hset("point", "geom", point.toString());
394394

395-
res = client.ftSearch(index, "@geom:[within $poly]",
395+
result = client.ftSearch(index, "@geom:[within $poly]",
396396
FTSearchParams.searchParams().addParam("poly", within).dialect(3));
397-
assertEquals(2, res.getTotalResults());
398-
assertEquals(2, res.getDocuments().size());
397+
assertEquals(2, result.getTotalResults());
398+
assertEquals(2, result.getDocuments().size());
399399
}
400400

401401
@Test
@@ -406,41 +406,57 @@ public void geoShapeFilterFlat() throws ParseException {
406406
assertOK(client.ftCreate(index, GeoShapeField.of("geom", GeoShapeField.CoordinateSystem.FLAT)));
407407

408408
// polygon type
409-
final Polygon small = factory.createPolygon(new Coordinate[]{new Coordinate(1, 1),
410-
new Coordinate(1, 100), new Coordinate(100, 100), new Coordinate(100, 1), new Coordinate(1, 1)});
411-
client.hset("small", "geom", small.toString());
409+
final Polygon small = factory.createPolygon(new Coordinate[]{new Coordinate(20, 20),
410+
new Coordinate(20, 100), new Coordinate(100, 100), new Coordinate(100, 20), new Coordinate(20, 20)});
411+
client.hsetObject("small", "geom", small);
412412

413-
final Polygon large = factory.createPolygon(new Coordinate[]{new Coordinate(1, 1),
414-
new Coordinate(1, 200), new Coordinate(200, 200), new Coordinate(200, 1), new Coordinate(1, 1)});
415-
client.hset("large", "geom", large.toString());
413+
final Polygon large = factory.createPolygon(new Coordinate[]{new Coordinate(10, 10),
414+
new Coordinate(10, 200), new Coordinate(200, 200), new Coordinate(200, 10), new Coordinate(10, 10)});
415+
client.hsetObject("large", "geom", large);
416416

417417
// within condition
418418
final Polygon within = factory.createPolygon(new Coordinate[]{new Coordinate(0, 0),
419419
new Coordinate(0, 150), new Coordinate(150, 150), new Coordinate(150, 0), new Coordinate(0, 0)});
420420

421-
SearchResult res = client.ftSearch(index, "@geom:[within $poly]",
421+
SearchResult result = client.ftSearch(index, "@geom:[within $poly]",
422422
FTSearchParams.searchParams().addParam("poly", within).dialect(3));
423-
assertEquals(1, res.getTotalResults());
424-
assertEquals(1, res.getDocuments().size());
425-
assertEquals(small, reader.read(res.getDocuments().get(0).getString("geom")));
423+
assertEquals(1, result.getTotalResults());
424+
assertEquals(1, result.getDocuments().size());
425+
assertEquals(small, reader.read(result.getDocuments().get(0).getString("geom")));
426426

427427
// contains condition
428-
final Polygon contains = factory.createPolygon(new Coordinate[]{new Coordinate(2, 2),
429-
new Coordinate(2, 50), new Coordinate(50, 50), new Coordinate(50, 2), new Coordinate(2, 2)});
428+
final Polygon contains = factory.createPolygon(new Coordinate[]{new Coordinate(25, 25),
429+
new Coordinate(25, 50), new Coordinate(50, 50), new Coordinate(50, 25), new Coordinate(25, 25)});
430430

431-
res = client.ftSearch(index, "@geom:[contains $poly]",
431+
result = client.ftSearch(index, "@geom:[contains $poly]",
432432
FTSearchParams.searchParams().addParam("poly", contains).dialect(3));
433-
assertEquals(2, res.getTotalResults());
434-
assertEquals(2, res.getDocuments().size());
433+
assertEquals(2, result.getTotalResults());
434+
assertEquals(2, result.getDocuments().size());
435+
436+
// intersects and disjoint
437+
final Polygon disjointersect = factory.createPolygon(new Coordinate[]{new Coordinate(150, 150),
438+
new Coordinate(150, 250), new Coordinate(250, 250), new Coordinate(250, 150), new Coordinate(150, 150)});
439+
440+
result = client.ftSearch(index, "@geom:[intersects $poly]",
441+
FTSearchParams.searchParams().addParam("poly", disjointersect).dialect(3));
442+
assertEquals(1, result.getTotalResults());
443+
assertEquals(1, result.getDocuments().size());
444+
assertEquals(large, reader.read(result.getDocuments().get(0).getString("geom")));
445+
446+
result = client.ftSearch(index, "@geom:[disjoint $poly]",
447+
FTSearchParams.searchParams().addParam("poly", disjointersect).dialect(3));
448+
assertEquals(1, result.getTotalResults());
449+
assertEquals(1, result.getDocuments().size());
450+
assertEquals(small, reader.read(result.getDocuments().get(0).getString("geom")));
435451

436452
// point type
437-
final Point point = factory.createPoint(new Coordinate(10, 10));
438-
client.hset("point", "geom", point.toString());
453+
final Point point = factory.createPoint(new Coordinate(30, 30));
454+
client.hsetObject("point", "geom", point);
439455

440-
res = client.ftSearch(index, "@geom:[within $poly]",
456+
result = client.ftSearch(index, "@geom:[within $poly]",
441457
FTSearchParams.searchParams().addParam("poly", within).dialect(3));
442-
assertEquals(2, res.getTotalResults());
443-
assertEquals(2, res.getDocuments().size());
458+
assertEquals(2, result.getTotalResults());
459+
assertEquals(2, result.getDocuments().size());
444460
}
445461

446462
@Test

0 commit comments

Comments
 (0)