diff --git a/src/main/java/mil/dds/anet/beans/search/LocationSearchQuery.java b/src/main/java/mil/dds/anet/beans/search/LocationSearchQuery.java index d0691dfa98..9eef839cfa 100644 --- a/src/main/java/mil/dds/anet/beans/search/LocationSearchQuery.java +++ b/src/main/java/mil/dds/anet/beans/search/LocationSearchQuery.java @@ -10,6 +10,10 @@ public class LocationSearchQuery extends AbstractSearchQuery qb, LocationSearchQuery query) { switch (query.getSortBy()) { case CREATED_AT: diff --git a/src/main/java/mil/dds/anet/search/AbstractSearcher.java b/src/main/java/mil/dds/anet/search/AbstractSearcher.java index bd6beb31c5..425162dcee 100644 --- a/src/main/java/mil/dds/anet/search/AbstractSearcher.java +++ b/src/main/java/mil/dds/anet/search/AbstractSearcher.java @@ -97,6 +97,18 @@ private String getTsQuery() { return String.format("(%1$s || %2$s)", tsQueryAnet, tsQuerySimple); } + protected void addWithinPolygonMssql(String locationUuidColumn, String queryText) { + qb.addWhereClause(String.format( + "\"%1$s\" IN (SELECT \"uuid\" FROM locations WHERE \"geometry\".STWithin(geometry::STGeomFromText('%2$s', 3857)) = 1)", + locationUuidColumn, queryText)); + } + + protected void addWithinPolygonPsql(String locationUuidColumn, String queryText) { + qb.addWhereClause(String.format( + "\"%1$s\" IN (SELECT \"uuid\" FROM locations WHERE ST_Within(\"geometry\", ST_GeomFromText('%2$s', 3857)))", + locationUuidColumn, queryText)); + } + protected List getOrderBy(SortOrder sortOrder, String table, String... columns) { final List clauses = new ArrayList<>(); for (final String column : columns) { diff --git a/src/main/java/mil/dds/anet/search/mssql/MssqlLocationSearcher.java b/src/main/java/mil/dds/anet/search/mssql/MssqlLocationSearcher.java index 4fade5756a..af38aaf886 100644 --- a/src/main/java/mil/dds/anet/search/mssql/MssqlLocationSearcher.java +++ b/src/main/java/mil/dds/anet/search/mssql/MssqlLocationSearcher.java @@ -26,6 +26,11 @@ protected void addTextQuery(LocationSearchQuery query) { qb.addSqlArg("containsQuery", qb.getContainsQuery(text)); } + @Override + protected void addWithinPolygon(LocationSearchQuery query) { + addWithinPolygonMssql("uuid", query.getWithinPolygon()); + } + @Override protected void addOrderByClauses(AbstractSearchQueryBuilder qb, LocationSearchQuery query) { if (hasTextQuery(query) && !query.isSortByPresent()) { diff --git a/src/main/java/mil/dds/anet/search/pg/PostgresqlLocationSearcher.java b/src/main/java/mil/dds/anet/search/pg/PostgresqlLocationSearcher.java index e2e317bb4d..5d360adeef 100644 --- a/src/main/java/mil/dds/anet/search/pg/PostgresqlLocationSearcher.java +++ b/src/main/java/mil/dds/anet/search/pg/PostgresqlLocationSearcher.java @@ -18,6 +18,11 @@ protected void addTextQuery(LocationSearchQuery query) { addFullTextSearch("locations", query.getText(), query.isSortByPresent()); } + @Override + protected void addWithinPolygon(LocationSearchQuery query) { + addWithinPolygonPsql("uuid", query.getWithinPolygon()); + } + @Override protected void addOrderByClauses(AbstractSearchQueryBuilder qb, LocationSearchQuery query) { if (hasTextQuery(query) && !query.isSortByPresent()) {