• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

brick / geo / 14085541468

26 Mar 2025 02:15PM UTC coverage: 63.783% (+0.4%) from 63.411%
14085541468

push

github

BenMorel
Move docker compose to postgis image

1939 of 3040 relevant lines covered (63.78%)

1906.06 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

93.33
/src/Engine/Database/Internal/AbstractDatabaseWkbEngine.php
1
<?php
2

3
declare(strict_types=1);
4

5
namespace Brick\Geo\Engine\Database\Internal;
6

7
use Brick\Geo\Engine\Database\Driver\DatabaseDriver;
8
use Brick\Geo\Engine\Database\Query\BinaryValue;
9
use Brick\Geo\Engine\Database\Query\ScalarValue;
10
use Brick\Geo\Engine\Database\Result\Row;
11
use Brick\Geo\Exception\GeometryEngineException;
12
use Brick\Geo\Geometry;
13
use Brick\Geo\Io\WkbReader;
14
use Brick\Geo\Io\WkbWriter;
15
use Brick\Geo\Point;
16
use Override;
17

18
/**
19
 * Base class for database engines with standard support for WKB, but no support for EWKB.
20
 *
21
 * @internal
22
 */
23
abstract readonly class AbstractDatabaseWkbEngine extends AbstractDatabaseEngine
24
{
25
    private WkbReader $wkbReader;
26
    private WkbWriter $wkbWriter;
27

28
    final public function __construct(
29
        protected DatabaseDriver $driver,
30
    ) {
31
        $this->wkbReader = new WkbReader();
×
32
        $this->wkbWriter = new WkbWriter();
×
33
    }
34

35
    /**
36
     * Builds and executes a SQL query for a GIS function.
37
     *
38
     * @param string              $function        The SQL GIS function to execute.
39
     * @param (Geometry|scalar)[] $parameters      The Geometry objects or scalar values to pass as parameters.
40
     * @param bool                $returnsGeometry Whether the GIS function returns a Geometry.
41
     *
42
     * @throws GeometryEngineException
43
     */
44
    private function query(string $function, array $parameters, bool $returnsGeometry) : Row
45
    {
46
        $query = ['SELECT '];
1,466✔
47

48
        if ($returnsGeometry) {
1,466✔
49
            $query[] = 'ST_AsBinary(g), ST_SRID(g) FROM (SELECT ';
603✔
50
        }
51

52
        $query[] = $function . '(';
1,466✔
53

54
        $first = true;
1,466✔
55
        foreach ($parameters as $parameter) {
1,466✔
56
            if ($first) {
1,466✔
57
                $first = false;
1,466✔
58
            } else {
59
                $query[] = ',';
872✔
60
            }
61

62
            if ($parameter instanceof Geometry) {
1,466✔
63
                if ($parameter instanceof Point && $parameter->isEmpty()) {
1,466✔
64
                    // WKB does not support empty points, and currently all concrete engines under this base class
65
                    // (MySQL, MariaDB, SpatiaLite) do not support them either.
66
                    throw new GeometryEngineException(static::class . ' does not support empty points');
8✔
67
                }
68
                $query[] = 'ST_GeomFromWKB(';
1,458✔
69
                $query[] = new BinaryValue($this->wkbWriter->write($parameter));
1,458✔
70
                $query[] = ',';
1,458✔
71
                $query[] = new ScalarValue($parameter->srid());
1,458✔
72
                $query[] = ')';
1,458✔
73
            } else {
74
                $query[] = new ScalarValue($parameter);
399✔
75
            }
76
        }
77

78
        $query[] = ')';
1,458✔
79

80
        if ($returnsGeometry) {
1,458✔
81
            $query[] = ' AS g) AS q';
595✔
82
        }
83

84
        return $this->driver->executeQuery(...$query);
1,458✔
85
    }
86

87
    /**
88
     * Queries a GIS function returning a boolean value.
89
     *
90
     * @param string          $function      The SQL GIS function to execute.
91
     * @param Geometry|scalar ...$parameters The Geometry objects or scalar values to pass as parameters.
92
     *
93
     * @throws GeometryEngineException
94
     */
95
    #[Override]
96
    final protected function queryBool(string $function, Geometry|string|float|int|bool ...$parameters) : bool
97
    {
98
        return $this->query($function, $parameters, false)->get(0)->asBool();
755✔
99
    }
100

101
    /**
102
     * Queries a GIS function returning a floating point value.
103
     *
104
     * @param string          $function      The SQL GIS function to execute.
105
     * @param Geometry|scalar ...$parameters The Geometry objects or scalar values to pass as parameters.
106
     *
107
     * @throws GeometryEngineException
108
     */
109
    #[Override]
110
    final protected function queryFloat(string $function, Geometry|string|float|int|bool ...$parameters) : float
111
    {
112
        return $this->query($function, $parameters, false)->get(0)->asFloat();
204✔
113
    }
114

115
    /**
116
     * Queries a GIS function returning a Geometry object.
117
     *
118
     * @param string             $function   The SQL GIS function to execute.
119
     * @param Geometry|scalar ...$parameters The Geometry objects or scalar values to pass as parameters.
120
     *
121
     * @throws GeometryEngineException
122
     */
123
    #[Override]
124
    final protected function queryGeometry(string $function, Geometry|string|float|int|bool ...$parameters) : Geometry
125
    {
126
        $row = $this->query($function, $parameters, true);
603✔
127

128
        $wkb = $row->get(0)->asBinary();
326✔
129
        $srid = $row->get(1)->asInt();
311✔
130

131
        return $this->wkbReader->read($wkb, $srid);
311✔
132
    }
133
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc