Skip to content

Commit ce031db

Browse files
authored
feat(query): implement ST_YMAX/ST_XMIN/ST_YMIN (#15594)
ST_YMAX/ST_XMIN/ST_YMIN Signed-off-by: Fan Yang <[email protected]>
1 parent 5b0d2a1 commit ce031db

File tree

12 files changed

+696
-411
lines changed

12 files changed

+696
-411
lines changed

Cargo.lock

+22-14
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ ethnum = { version = "1.5.0" }
162162
feature-set = { version = "0.1.1" }
163163
geo = { version = "0.27.0", features = ["use-serde"] }
164164
geos = { version = "8.3", features = ["static", "geo", "geo-types"] }
165-
geozero = { version = "0.12.0", features = ["default", "with-wkb", "with-geos", "with-geojson"] }
165+
geozero = { version = "0.13.0", features = ["default", "with-wkb", "with-geos", "with-geojson"] }
166166
itertools = "0.10.5"
167167
match-template = "0.0.1"
168168
mysql_async = { version = "0.34", default-features = false, features = ["rustls-tls"] }

src/common/io/Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ lexical-core = "0.8.5"
3030
micromarshal = "0.5.0"
3131
ordered-float = { workspace = true }
3232
roaring = { version = "0.10.1", features = ["serde"] }
33-
scroll = "0.12.0"
3433
serde = { workspace = true }
3534
wkt = "0.10.3"
3635

src/common/io/src/geometry.rs

+12-21
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313
// limitations under the License.
1414

1515
use std::fmt::Display;
16-
use std::io;
17-
use std::io::Read;
1816
use std::str::FromStr;
1917

2018
use databend_common_exception::ErrorCode;
@@ -26,14 +24,10 @@ use geozero::GeozeroGeometry;
2624
use geozero::ToJson;
2725
use geozero::ToWkb;
2826
use geozero::ToWkt;
29-
use scroll::Endian;
30-
use scroll::IOread;
3127
use serde::Deserialize;
3228
use serde::Serialize;
3329
use wkt::TryFromWkt;
3430

35-
const GEO_TYPE_ID_MASK: u32 = 0x2000_0000;
36-
3731
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
3832
pub enum GeometryDataType {
3933
WKB,
@@ -44,6 +38,18 @@ pub enum GeometryDataType {
4438
GEOJSON,
4539
}
4640

41+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
42+
pub enum Axis {
43+
X,
44+
Y,
45+
}
46+
47+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
48+
pub enum Extremum {
49+
Max,
50+
Min,
51+
}
52+
4753
impl FromStr for GeometryDataType {
4854
type Err = ErrorCode;
4955

@@ -168,21 +174,6 @@ pub fn parse_to_subtype(buf: &[u8]) -> Result<GeometryDataType> {
168174
}
169175
}
170176
}
171-
172-
pub fn read_ewkb_srid<R: Read>(raw: &mut R) -> std::result::Result<Option<i32>, io::Error> {
173-
let byte_order = raw.ioread::<u8>()?;
174-
let is_little_endian = byte_order != 0;
175-
let endian = Endian::from(is_little_endian);
176-
let type_id = raw.ioread_with::<u32>(endian)?;
177-
let srid = if type_id & GEO_TYPE_ID_MASK == GEO_TYPE_ID_MASK {
178-
Some(raw.ioread_with::<i32>(endian)?)
179-
} else {
180-
None
181-
};
182-
183-
Ok(srid)
184-
}
185-
186177
pub trait GeometryFormatOutput {
187178
fn format(self, data_type: GeometryDataType) -> Result<String>;
188179
}

src/common/io/src/lib.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -50,5 +50,6 @@ pub use escape::escape_string_with_quote;
5050
pub use geometry::geometry_format;
5151
pub use geometry::parse_to_ewkb;
5252
pub use geometry::parse_to_subtype;
53-
pub use geometry::read_ewkb_srid;
53+
pub use geometry::Axis;
54+
pub use geometry::Extremum;
5455
pub use geometry::GeometryDataType;

src/query/expression/src/utils/display.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@
1515
use std::fmt::Debug;
1616
use std::fmt::Display;
1717
use std::fmt::Formatter;
18-
use std::io;
1918

2019
use chrono_tz::Tz;
2120
use comfy_table::Cell;
2221
use comfy_table::Table;
2322
use databend_common_io::display_decimal_128;
2423
use databend_common_io::display_decimal_256;
25-
use databend_common_io::read_ewkb_srid;
2624
use geozero::wkb::Ewkb;
25+
use geozero::GeozeroGeometry;
26+
use geozero::ToGeos;
2727
use geozero::ToWkt;
2828
use itertools::Itertools;
2929
use num_traits::FromPrimitive;
@@ -167,9 +167,9 @@ impl<'a> Debug for ScalarRef<'a> {
167167
Ok(())
168168
}
169169
ScalarRef::Geometry(s) => {
170-
let geom = Ewkb(s.to_vec())
171-
.to_ewkt(read_ewkb_srid(&mut io::Cursor::new(s)).unwrap())
172-
.unwrap();
170+
let ewkb = Ewkb(s.to_vec());
171+
let geos = ewkb.to_geos().unwrap();
172+
let geom = geos.to_ewkt(geos.srid()).unwrap();
173173
write!(f, "{geom:?}")
174174
}
175175
}
@@ -258,9 +258,9 @@ impl<'a> Display for ScalarRef<'a> {
258258
write!(f, "'{value}'")
259259
}
260260
ScalarRef::Geometry(s) => {
261-
let geom = Ewkb(s.to_vec())
262-
.to_ewkt(read_ewkb_srid(&mut io::Cursor::new(s)).unwrap())
263-
.unwrap();
261+
let ewkb = Ewkb(s.to_vec());
262+
let geos = ewkb.to_geos().unwrap();
263+
let geom = geos.to_ewkt(geos.srid()).unwrap();
264264
write!(f, "'{geom}'")
265265
}
266266
}

src/query/formats/src/field_encoder/values.rs

+7-8
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
use std::io;
16-
1715
use bstr::ByteSlice;
1816
use chrono_tz::Tz;
1917
use databend_common_arrow::arrow::bitmap::Bitmap;
@@ -35,10 +33,11 @@ use databend_common_io::constants::NAN_BYTES_LOWER;
3533
use databend_common_io::constants::NAN_BYTES_SNAKE;
3634
use databend_common_io::constants::NULL_BYTES_UPPER;
3735
use databend_common_io::constants::TRUE_BYTES_NUM;
38-
use databend_common_io::read_ewkb_srid;
3936
use databend_common_io::GeometryDataType;
4037
use geozero::wkb::Ewkb;
4138
use geozero::CoordDimensions;
39+
use geozero::GeozeroGeometry;
40+
use geozero::ToGeos;
4241
use geozero::ToJson;
4342
use geozero::ToWkb;
4443
use geozero::ToWkt;
@@ -318,11 +317,11 @@ impl FieldEncoderValues {
318317
.to_vec(),
319318
GeometryDataType::WKT => Ewkb(v.to_vec()).to_wkt().unwrap().as_bytes().to_vec(),
320319
GeometryDataType::EWKB => hex::encode_upper(v).as_bytes().to_vec(),
321-
GeometryDataType::EWKT => Ewkb(v.to_vec())
322-
.to_ewkt(read_ewkb_srid(&mut io::Cursor::new(&v)).unwrap())
323-
.unwrap()
324-
.as_bytes()
325-
.to_vec(),
320+
GeometryDataType::EWKT => {
321+
let ewkb = Ewkb(v.to_vec());
322+
let geos = ewkb.to_geos().unwrap();
323+
geos.to_ewkt(geos.srid()).unwrap().as_bytes().to_vec()
324+
}
326325
GeometryDataType::GEOJSON => Ewkb(v.to_vec()).to_json().unwrap().as_bytes().to_vec(),
327326
};
328327

0 commit comments

Comments
 (0)