diff --git a/src/datatypes/src/data_type.rs b/src/datatypes/src/data_type.rs index dfcaa497b8..90cb063255 100644 --- a/src/datatypes/src/data_type.rs +++ b/src/datatypes/src/data_type.rs @@ -188,8 +188,9 @@ impl ConcreteDataType { ConcreteDataType::Timestamp(TimestampType::new(TimeUnit::Millisecond)) } - pub fn geometry_datatype() -> Self { - ConcreteDataType::Geometry(GeometryType::Point) + // FIXME: specify inner type + pub fn geometry_datatype(inner_type: GeometryType) -> Self { + ConcreteDataType::Geometry(inner_type) } /// Converts from arrow timestamp unit to diff --git a/src/datatypes/src/type_id.rs b/src/datatypes/src/type_id.rs index 73c676a749..f4ab4fd110 100644 --- a/src/datatypes/src/type_id.rs +++ b/src/datatypes/src/type_id.rs @@ -1,3 +1,5 @@ +use crate::types::GeometryType; + /// Unique identifier for logical data type. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum LogicalTypeId { @@ -66,7 +68,8 @@ impl LogicalTypeId { LogicalTypeId::List => { ConcreteDataType::list_datatype(ConcreteDataType::null_datatype()) } - LogicalTypeId::Geometry => ConcreteDataType::geometry_datatype(), + // FIXME(sunng87): check if default type works + LogicalTypeId::Geometry => ConcreteDataType::geometry_datatype(GeometryType::default()), } } } diff --git a/src/datatypes/src/types/geometry.rs b/src/datatypes/src/types/geometry.rs index bcb41ce55d..4fc5d0ce58 100644 --- a/src/datatypes/src/types/geometry.rs +++ b/src/datatypes/src/types/geometry.rs @@ -10,6 +10,12 @@ pub enum GeometryType { Point, } +impl Default for GeometryType { + fn default() -> Self { + Self::Point + } +} + impl DataType for GeometryType { fn name(&self) -> &str { "Geometry" @@ -25,6 +31,7 @@ impl DataType for GeometryType { } } + // TODO: check if unreachable fn as_arrow_type(&self) -> arrow::datatypes::DataType { unreachable!() } diff --git a/src/datatypes/src/value.rs b/src/datatypes/src/value.rs index 3d5a2fedcf..21e8259a53 100644 --- a/src/datatypes/src/value.rs +++ b/src/datatypes/src/value.rs @@ -12,6 +12,7 @@ use serde::{Deserialize, Serialize}; use crate::error::{self, Result}; use crate::prelude::*; +use crate::types::GeometryType; use crate::vectors::all::GeometryVector; use crate::vectors::ListVector; @@ -76,7 +77,7 @@ impl Value { Value::Date(_) => ConcreteDataType::date_datatype(), Value::DateTime(_) => ConcreteDataType::date_datatype(), Value::Timestamp(v) => ConcreteDataType::timestamp_datatype(v.unit()), - Value::Geometry(_) => ConcreteDataType::geometry_datatype(), + Value::Geometry(geom) => ConcreteDataType::geometry_datatype(geom.subtype()), } } @@ -329,6 +330,12 @@ impl GeometryValue { pub fn to_value(self) -> Value { Value::Geometry(self) } + + pub fn subtype(&self) -> GeometryType { + match self { + Self::Point(_) => GeometryType::Point, + } + } } impl Default for GeometryValue { diff --git a/src/datatypes/src/vectors/geometry.rs b/src/datatypes/src/vectors/geometry.rs index 70281dace3..1e8d6c8aa6 100644 --- a/src/datatypes/src/vectors/geometry.rs +++ b/src/datatypes/src/vectors/geometry.rs @@ -7,6 +7,7 @@ use self::point::{PointVector, PointVectorBuilder}; use super::{MutableVector, Validity, Value, Vector}; use crate::error::SerializeSnafu; use crate::prelude::ScalarRef; +use crate::types::GeometryType; use crate::value::{GeometryValueRef, ValueRef}; use crate::vectors::{impl_try_from_arrow_array_for_vector, impl_validity_for_vector}; use crate::{ @@ -25,7 +26,11 @@ pub enum GeometryVector { impl Vector for GeometryVector { fn data_type(&self) -> crate::data_type::ConcreteDataType { - ConcreteDataType::geometry_datatype() + let subtype = match self { + Self::PointVector(_) => GeometryType::Point, + }; + + ConcreteDataType::geometry_datatype(subtype) } fn vector_type_name(&self) -> String { @@ -161,7 +166,11 @@ impl GeometryVectorBuilder { impl MutableVector for GeometryVectorBuilder { fn data_type(&self) -> crate::data_type::ConcreteDataType { - ConcreteDataType::geometry_datatype() + let subtype = match self { + Self::PointVectorBuilder(_) => GeometryType::Point, + }; + + ConcreteDataType::geometry_datatype(subtype) } fn len(&self) -> usize { @@ -276,7 +285,10 @@ mod tests { assert_eq!(vector.get(0), value.to_value()); assert_eq!(vector.get_data(0).unwrap().to_owned_scalar(), value); - assert_eq!(vector.data_type(), ConcreteDataType::geometry_datatype()); + assert_eq!( + vector.data_type(), + ConcreteDataType::geometry_datatype(GeometryType::Point) + ); let iter = vector.iter_data(); let mut cnt: usize = 0; @@ -301,11 +313,9 @@ mod tests { assert_eq!(vector.memory_size(), 32); //2 elements (f64,f64)=2*2*8 - assert_eq!( format!("{:?}",vector.serialize_to_json().unwrap()), "[Object {\"Point\": Object {\"type\": String(\"Point\"), \"coordinates\": Array [Number(2.0), Number(1.0)]}}, Null]".to_string() ) - } }