Skip to content

Commit ec1d2e0

Browse files
added distance greater and distance less queries
1 parent b398d8d commit ec1d2e0

6 files changed

Lines changed: 461 additions & 23 deletions

File tree

src/Database/Adapter/MariaDB.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1719,6 +1719,30 @@ protected function handleSpatialQueries(Query $query, array &$binds, string $att
17191719
$binds[":{$placeholder}_1"] = $distanceParams[1];
17201720
return "ST_Distance({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0)) > :{$placeholder}_1";
17211721

1722+
case Query::TYPE_DISTANCE_GREATER_THAN:
1723+
$distanceParams = $query->getValues()[0];
1724+
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($distanceParams[0]);
1725+
$binds[":{$placeholder}_1"] = $distanceParams[1];
1726+
return "ST_Distance({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0)) > :{$placeholder}_1";
1727+
1728+
case Query::TYPE_DISTANCE_LESS_THAN:
1729+
$distanceParams = $query->getValues()[0];
1730+
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($distanceParams[0]);
1731+
$binds[":{$placeholder}_1"] = $distanceParams[1];
1732+
return "ST_Distance({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0)) < :{$placeholder}_1";
1733+
1734+
case Query::TYPE_NOT_DISTANCE_GREATER_THAN:
1735+
$distanceParams = $query->getValues()[0];
1736+
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($distanceParams[0]);
1737+
$binds[":{$placeholder}_1"] = $distanceParams[1];
1738+
return "NOT (ST_Distance({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0)) > :{$placeholder}_1)";
1739+
1740+
case Query::TYPE_NOT_DISTANCE_LESS_THAN:
1741+
$distanceParams = $query->getValues()[0];
1742+
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($distanceParams[0]);
1743+
$binds[":{$placeholder}_1"] = $distanceParams[1];
1744+
return "NOT (ST_Distance({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0)) < :{$placeholder}_1)";
1745+
17221746
case Query::TYPE_INTERSECTS:
17231747
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($query->getValues()[0]);
17241748
return "ST_Intersects({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0))";

src/Database/Adapter/Postgres.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1816,6 +1816,30 @@ protected function handleSpatialQueries(Query $query, array &$binds, string $att
18161816
$binds[":{$placeholder}_1"] = $distanceParams[1];
18171817
return "NOT ST_DWithin({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0), :{$placeholder}_1)";
18181818

1819+
case Query::TYPE_DISTANCE_GREATER_THAN:
1820+
$distanceParams = $query->getValues()[0];
1821+
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($distanceParams[0]);
1822+
$binds[":{$placeholder}_1"] = $distanceParams[1];
1823+
return "ST_Distance({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0)) > :{$placeholder}_1";
1824+
1825+
case Query::TYPE_DISTANCE_LESS_THAN:
1826+
$distanceParams = $query->getValues()[0];
1827+
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($distanceParams[0]);
1828+
$binds[":{$placeholder}_1"] = $distanceParams[1];
1829+
return "ST_Distance({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0)) < :{$placeholder}_1";
1830+
1831+
case Query::TYPE_NOT_DISTANCE_GREATER_THAN:
1832+
$distanceParams = $query->getValues()[0];
1833+
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($distanceParams[0]);
1834+
$binds[":{$placeholder}_1"] = $distanceParams[1];
1835+
return "NOT (ST_Distance({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0)) > :{$placeholder}_1)";
1836+
1837+
case Query::TYPE_NOT_DISTANCE_LESS_THAN:
1838+
$distanceParams = $query->getValues()[0];
1839+
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($distanceParams[0]);
1840+
$binds[":{$placeholder}_1"] = $distanceParams[1];
1841+
return "NOT (ST_Distance({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0)) < :{$placeholder}_1)";
1842+
18191843
case Query::TYPE_EQUAL:
18201844
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($query->getValues()[0]);
18211845
return "ST_Equals({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0))";

src/Database/Query.php

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ class Query
3232
public const TYPE_NOT_CROSSES = 'notCrosses';
3333
public const TYPE_DISTANCE = 'distance';
3434
public const TYPE_NOT_DISTANCE = 'notDistance';
35+
public const TYPE_DISTANCE_GREATER_THAN = 'distanceGreaterThan';
36+
public const TYPE_DISTANCE_LESS_THAN = 'distanceLessThan';
37+
public const TYPE_NOT_DISTANCE_GREATER_THAN = 'notDistanceGreaterThan';
38+
public const TYPE_NOT_DISTANCE_LESS_THAN = 'notDistanceLessThan';
3539
public const TYPE_INTERSECTS = 'intersects';
3640
public const TYPE_NOT_INTERSECTS = 'notIntersects';
3741
public const TYPE_OVERLAPS = 'overlaps';
@@ -80,6 +84,10 @@ class Query
8084
self::TYPE_NOT_CROSSES,
8185
self::TYPE_DISTANCE,
8286
self::TYPE_NOT_DISTANCE,
87+
self::TYPE_DISTANCE_GREATER_THAN,
88+
self::TYPE_DISTANCE_LESS_THAN,
89+
self::TYPE_NOT_DISTANCE_GREATER_THAN,
90+
self::TYPE_NOT_DISTANCE_LESS_THAN,
8391
self::TYPE_INTERSECTS,
8492
self::TYPE_NOT_INTERSECTS,
8593
self::TYPE_OVERLAPS,
@@ -283,6 +291,10 @@ public function isSpatialQuery(): bool
283291
self::TYPE_NOT_CROSSES,
284292
self::TYPE_DISTANCE,
285293
self::TYPE_NOT_DISTANCE,
294+
self::TYPE_DISTANCE_GREATER_THAN,
295+
self::TYPE_DISTANCE_LESS_THAN,
296+
self::TYPE_NOT_DISTANCE_GREATER_THAN,
297+
self::TYPE_NOT_DISTANCE_LESS_THAN,
286298
self::TYPE_INTERSECTS,
287299
self::TYPE_NOT_INTERSECTS,
288300
self::TYPE_OVERLAPS,
@@ -913,6 +925,54 @@ public static function notDistance(string $attribute, array $values): self
913925
return new self(self::TYPE_NOT_DISTANCE, $attribute, $values);
914926
}
915927

928+
/**
929+
* Helper method to create Query with distanceGreaterThan method
930+
*
931+
* @param string $attribute
932+
* @param array<mixed> $values
933+
* @return Query
934+
*/
935+
public static function distanceGreaterThan(string $attribute, array $values): self
936+
{
937+
return new self(self::TYPE_DISTANCE_GREATER_THAN, $attribute, $values);
938+
}
939+
940+
/**
941+
* Helper method to create Query with distanceLessThan method
942+
*
943+
* @param string $attribute
944+
* @param array<mixed> $values
945+
* @return Query
946+
*/
947+
public static function distanceLessThan(string $attribute, array $values): self
948+
{
949+
return new self(self::TYPE_DISTANCE_LESS_THAN, $attribute, $values);
950+
}
951+
952+
/**
953+
* Helper method to create Query with notDistanceGreaterThan method
954+
*
955+
* @param string $attribute
956+
* @param array<mixed> $values
957+
* @return Query
958+
*/
959+
public static function notDistanceGreaterThan(string $attribute, array $values): self
960+
{
961+
return new self(self::TYPE_NOT_DISTANCE_GREATER_THAN, $attribute, $values);
962+
}
963+
964+
/**
965+
* Helper method to create Query with notDistanceLessThan method
966+
*
967+
* @param string $attribute
968+
* @param array<mixed> $values
969+
* @return Query
970+
*/
971+
public static function notDistanceLessThan(string $attribute, array $values): self
972+
{
973+
return new self(self::TYPE_NOT_DISTANCE_LESS_THAN, $attribute, $values);
974+
}
975+
916976
/**
917977
* Helper method to create Query with intersects method
918978
*

src/Database/Validator/Queries.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,10 @@ public function isValid($value): bool
110110
Query::TYPE_NOT_CROSSES,
111111
Query::TYPE_DISTANCE,
112112
Query::TYPE_NOT_DISTANCE,
113+
Query::TYPE_DISTANCE_GREATER_THAN,
114+
Query::TYPE_DISTANCE_LESS_THAN,
115+
Query::TYPE_NOT_DISTANCE_GREATER_THAN,
116+
Query::TYPE_NOT_DISTANCE_LESS_THAN,
113117
Query::TYPE_INTERSECTS,
114118
Query::TYPE_NOT_INTERSECTS,
115119
Query::TYPE_OVERLAPS,

src/Database/Validator/Query/Filter.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,8 @@ public function isValid($value): bool
261261

262262
case Query::TYPE_DISTANCE:
263263
case Query::TYPE_NOT_DISTANCE:
264+
case Query::TYPE_DISTANCE_GREATER_THAN:
265+
case Query::TYPE_DISTANCE_LESS_THAN:
264266
if (count($value->getValues()) !== 1 || !is_array($value->getValues()[0]) || count($value->getValues()[0]) !== 2) {
265267
$this->message = 'Distance query requires [[geometry, distance]] parameters';
266268
return false;

0 commit comments

Comments
 (0)