From 20fcc7819a4b14c3bd503b7287e34da816b94fd7 Mon Sep 17 00:00:00 2001 From: Ning Sun Date: Tue, 1 Nov 2022 16:03:33 +0800 Subject: [PATCH] feat: implement postgres read/write for geo data --- .vscode/launch.json | 14 -------------- src/datatypes/src/value.rs | 2 +- src/servers/src/mysql/writer.rs | 2 +- src/servers/src/postgres/handler.rs | 17 ++++++++++++++--- 4 files changed, 16 insertions(+), 19 deletions(-) delete mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index e678396f08..0000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - // 使用 IntelliSense 了解相关属性。 - // 悬停以查看现有属性的描述。 - // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "lldb", - "request": "attach", - "name": "Attach", - "pid": "${command:pickMyProcess}" // use ${command:pickProcess} to pick other users' processes - }, - ] -} \ No newline at end of file diff --git a/src/datatypes/src/value.rs b/src/datatypes/src/value.rs index 86fd49b18d..af9450eb9e 100644 --- a/src/datatypes/src/value.rs +++ b/src/datatypes/src/value.rs @@ -353,7 +353,7 @@ impl GeometryValue { } } - pub fn to_wkb(&self) -> String { + pub fn to_wkt(&self) -> String { match self { GeometryValue::Point(p) => p.wkt_string(), } diff --git a/src/servers/src/mysql/writer.rs b/src/servers/src/mysql/writer.rs index 713fd6843f..01fe370a2b 100644 --- a/src/servers/src/mysql/writer.rs +++ b/src/servers/src/mysql/writer.rs @@ -118,7 +118,7 @@ impl<'a, W: io::Write> MysqlResultWriter<'a, W> { }) } Value::Geometry(v) => { - row_writer.write_col(v.to_wkb())?; + row_writer.write_col(v.to_wkt())?; } } } diff --git a/src/servers/src/postgres/handler.rs b/src/servers/src/postgres/handler.rs index 4b9c1d2429..6986e2c2b1 100644 --- a/src/servers/src/postgres/handler.rs +++ b/src/servers/src/postgres/handler.rs @@ -6,6 +6,7 @@ use common_recordbatch::{util, RecordBatch}; use common_time::timestamp::TimeUnit; use datatypes::prelude::{ConcreteDataType, Value}; use datatypes::schema::SchemaRef; +use datatypes::types::GeometryType; use pgwire::api::portal::Portal; use pgwire::api::query::{ExtendedQueryHandler, SimpleQueryHandler}; use pgwire::api::results::{FieldInfo, Response, Tag, TextQueryResponseBuilder}; @@ -120,7 +121,7 @@ fn encode_value(value: &Value, builder: &mut TextQueryResponseBuilder) -> PgWire &value ), }))), - Value::Geometry(_) => todo!(), + Value::Geometry(v) => builder.append_field(Some(v.to_wkt())), } } @@ -143,7 +144,9 @@ fn type_translate(origin: &ConcreteDataType) -> Result { err_msg: format!("not implemented for column datatype {:?}", origin), } .fail(), - &ConcreteDataType::Geometry(_) => todo!(), + ConcreteDataType::Geometry(geom_type) => match geom_type { + GeometryType::Point => Ok(Type::POINT), + }, } } @@ -162,7 +165,7 @@ mod test { use std::sync::Arc; use datatypes::schema::{ColumnSchema, Schema}; - use datatypes::value::ListValue; + use datatypes::value::{GeometryValue, ListValue}; use pgwire::api::results::FieldInfo; use pgwire::api::Type; @@ -191,6 +194,11 @@ mod test { true, ), ColumnSchema::new("dates", ConcreteDataType::date_datatype(), true), + ColumnSchema::new( + "loc", + ConcreteDataType::geometry_datatype(GeometryType::Point), + true, + ), ]; let pg_field_info = vec![ FieldInfo::new("nulls".into(), None, None, Type::UNKNOWN), @@ -209,6 +217,7 @@ mod test { FieldInfo::new("strings".into(), None, None, Type::VARCHAR), FieldInfo::new("timestamps".into(), None, None, Type::TIMESTAMP), FieldInfo::new("dates".into(), None, None, Type::DATE), + FieldInfo::new("loc".into(), None, None, Type::POINT), ]; let schema = Arc::new(Schema::new(column_schemas)); let fs = schema_to_pg(schema).unwrap(); @@ -243,6 +252,7 @@ mod test { FieldInfo::new("dates".into(), None, None, Type::DATE), FieldInfo::new("datetimes".into(), None, None, Type::TIMESTAMP), FieldInfo::new("timestamps".into(), None, None, Type::TIMESTAMP), + FieldInfo::new("loc".into(), None, None, Type::POINT), ]; let values = vec![ @@ -271,6 +281,7 @@ mod test { Value::Date(1001i32.into()), Value::DateTime(1000001i64.into()), Value::Timestamp(1000001i64.into()), + Value::Geometry(GeometryValue::new_point(1f64, 2f64)), ]; let mut builder = TextQueryResponseBuilder::new(schema); for i in values {