Copilot commented on code in PR #285:
URL: https://github.com/apache/sedona-db/pull/285#discussion_r2506865098


##########
rust/sedona-geometry/src/types.rs:
##########
@@ -292,6 +292,178 @@ impl FromStr for GeometryTypeAndDimensions {
     }
 }
 
+/// A set containing [`GeometryTypeAndDimensions`] values
+#[derive(Clone, Debug, Default, PartialEq, Eq)]
+pub struct GeometryTypeAndDimensionsSet {
+    /// Bitset encoding geometry types and dimensions.
+    ///
+    /// Uses bits 0-31 where each geometry type's WKB ID (0-7) is encoded
+    /// at different offsets based on dimensions:
+    /// - XY: bits 0-7
+    /// - XYZ: bits 8-15
+    /// - XYM: bits 16-23
+    /// - XYZM: bits 24-31
+    types: u32,
+}
+
+impl GeometryTypeAndDimensionsSet {
+    #[inline]
+    pub fn new() -> Self {
+        Self { types: 0 }
+    }
+
+    #[inline]
+    pub fn insert(
+        &mut self,
+        type_and_dim: &GeometryTypeAndDimensions,
+    ) -> Result<(), SedonaGeometryError> {
+        if let Dimensions::Unknown(n) = type_and_dim.dimensions() {
+            return Err(SedonaGeometryError::Invalid(format!(
+                "Unknown dimensions {} in GeometryTypeSet::insert",
+                n
+            )));
+        }
+        self.insert_or_ignore(type_and_dim);
+        Ok(())
+    }
+
+    #[inline]
+    pub fn insert_or_ignore(&mut self, type_and_dim: 
&GeometryTypeAndDimensions) {
+        let geom_shift = type_and_dim.geometry_type().wkb_id();
+        // WKB ID must be < 8 to fit in the bitset layout (8 bits per 
dimension)
+        if geom_shift >= 8 {
+            panic!(
+                "Invalid geometry type wkb_id {} in 
GeometryTypeSet::insert_or_ignore",
+                geom_shift
+            );
+        }
+        let dim_shift = match type_and_dim.dimensions() {
+            geo_traits::Dimensions::Unknown(_) => {
+                // Ignore unknown dimensions
+                return;
+            }
+            geo_traits::Dimensions::Xy => 0,
+            geo_traits::Dimensions::Xyz => 8,
+            geo_traits::Dimensions::Xym => 16,
+            geo_traits::Dimensions::Xyzm => 24,
+        };
+        let bit_position = geom_shift + dim_shift;
+        self.types |= 1 << bit_position;
+    }
+
+    #[inline]
+    pub fn merge(&mut self, other: &Self) {
+        self.types |= other.types;
+    }
+
+    /// Returns `true` if the set contains no geometry types.
+    #[inline]
+    pub fn is_empty(&self) -> bool {
+        self.types == 0
+    }
+
+    /// Returns the number of geometry types in the set.
+    #[inline]
+    pub fn size(&self) -> usize {
+        self.types.count_ones() as usize
+    }
+
+    /// Clears the set, removing all geometry types.
+    #[inline]
+    pub fn clear(&mut self) {
+        self.types = 0;
+    }
+
+    /// Returns an iterator over the geometry types in the set.
+    pub fn iter(&self) -> GeometryTypeSetIter {
+        GeometryTypeSetIter {
+            types: self.types,
+            current_bit: 0,
+        }
+    }
+}
+
+/// Iterator over [`GeometryTypeAndDimensions`] values in a [`GeometryTypeSet`]

Review Comment:
   Documentation references `GeometryTypeSet` but the actual type is 
`GeometryTypeAndDimensionsSet`.
   ```suggestion
   /// Iterator over [`GeometryTypeAndDimensions`] values in a 
[`GeometryTypeAndDimensionsSet`]
   ```



##########
rust/sedona-geometry/src/types.rs:
##########
@@ -292,6 +292,178 @@ impl FromStr for GeometryTypeAndDimensions {
     }
 }
 
+/// A set containing [`GeometryTypeAndDimensions`] values
+#[derive(Clone, Debug, Default, PartialEq, Eq)]
+pub struct GeometryTypeAndDimensionsSet {
+    /// Bitset encoding geometry types and dimensions.
+    ///
+    /// Uses bits 0-31 where each geometry type's WKB ID (0-7) is encoded
+    /// at different offsets based on dimensions:
+    /// - XY: bits 0-7
+    /// - XYZ: bits 8-15
+    /// - XYM: bits 16-23
+    /// - XYZM: bits 24-31
+    types: u32,
+}
+
+impl GeometryTypeAndDimensionsSet {
+    #[inline]
+    pub fn new() -> Self {
+        Self { types: 0 }
+    }
+
+    #[inline]
+    pub fn insert(
+        &mut self,
+        type_and_dim: &GeometryTypeAndDimensions,
+    ) -> Result<(), SedonaGeometryError> {
+        if let Dimensions::Unknown(n) = type_and_dim.dimensions() {
+            return Err(SedonaGeometryError::Invalid(format!(
+                "Unknown dimensions {} in GeometryTypeSet::insert",

Review Comment:
   Error message references `GeometryTypeSet::insert` but the actual type is 
`GeometryTypeAndDimensionsSet::insert`.
   ```suggestion
                   "Unknown dimensions {} in 
GeometryTypeAndDimensionsSet::insert",
   ```



##########
rust/sedona-geometry/src/types.rs:
##########
@@ -292,6 +292,178 @@ impl FromStr for GeometryTypeAndDimensions {
     }
 }
 
+/// A set containing [`GeometryTypeAndDimensions`] values
+#[derive(Clone, Debug, Default, PartialEq, Eq)]
+pub struct GeometryTypeAndDimensionsSet {
+    /// Bitset encoding geometry types and dimensions.
+    ///
+    /// Uses bits 0-31 where each geometry type's WKB ID (0-7) is encoded
+    /// at different offsets based on dimensions:
+    /// - XY: bits 0-7
+    /// - XYZ: bits 8-15
+    /// - XYM: bits 16-23
+    /// - XYZM: bits 24-31
+    types: u32,
+}
+
+impl GeometryTypeAndDimensionsSet {
+    #[inline]
+    pub fn new() -> Self {
+        Self { types: 0 }
+    }
+
+    #[inline]
+    pub fn insert(
+        &mut self,
+        type_and_dim: &GeometryTypeAndDimensions,
+    ) -> Result<(), SedonaGeometryError> {
+        if let Dimensions::Unknown(n) = type_and_dim.dimensions() {
+            return Err(SedonaGeometryError::Invalid(format!(
+                "Unknown dimensions {} in GeometryTypeSet::insert",
+                n
+            )));
+        }
+        self.insert_or_ignore(type_and_dim);
+        Ok(())
+    }
+
+    #[inline]
+    pub fn insert_or_ignore(&mut self, type_and_dim: 
&GeometryTypeAndDimensions) {
+        let geom_shift = type_and_dim.geometry_type().wkb_id();
+        // WKB ID must be < 8 to fit in the bitset layout (8 bits per 
dimension)
+        if geom_shift >= 8 {
+            panic!(
+                "Invalid geometry type wkb_id {} in 
GeometryTypeSet::insert_or_ignore",

Review Comment:
   Error message references `GeometryTypeSet::insert_or_ignore` but the actual 
type is `GeometryTypeAndDimensionsSet::insert_or_ignore`.
   ```suggestion
                   "Invalid geometry type wkb_id {} in 
GeometryTypeAndDimensionsSet::insert_or_ignore",
   ```



##########
rust/sedona-geometry/src/types.rs:
##########
@@ -292,6 +292,178 @@ impl FromStr for GeometryTypeAndDimensions {
     }
 }
 
+/// A set containing [`GeometryTypeAndDimensions`] values
+#[derive(Clone, Debug, Default, PartialEq, Eq)]
+pub struct GeometryTypeAndDimensionsSet {
+    /// Bitset encoding geometry types and dimensions.
+    ///
+    /// Uses bits 0-31 where each geometry type's WKB ID (0-7) is encoded
+    /// at different offsets based on dimensions:
+    /// - XY: bits 0-7
+    /// - XYZ: bits 8-15
+    /// - XYM: bits 16-23
+    /// - XYZM: bits 24-31
+    types: u32,
+}
+
+impl GeometryTypeAndDimensionsSet {
+    #[inline]
+    pub fn new() -> Self {
+        Self { types: 0 }
+    }
+
+    #[inline]
+    pub fn insert(
+        &mut self,
+        type_and_dim: &GeometryTypeAndDimensions,
+    ) -> Result<(), SedonaGeometryError> {
+        if let Dimensions::Unknown(n) = type_and_dim.dimensions() {
+            return Err(SedonaGeometryError::Invalid(format!(
+                "Unknown dimensions {} in GeometryTypeSet::insert",
+                n
+            )));
+        }
+        self.insert_or_ignore(type_and_dim);
+        Ok(())
+    }
+
+    #[inline]
+    pub fn insert_or_ignore(&mut self, type_and_dim: 
&GeometryTypeAndDimensions) {
+        let geom_shift = type_and_dim.geometry_type().wkb_id();
+        // WKB ID must be < 8 to fit in the bitset layout (8 bits per 
dimension)
+        if geom_shift >= 8 {
+            panic!(
+                "Invalid geometry type wkb_id {} in 
GeometryTypeSet::insert_or_ignore",
+                geom_shift
+            );
+        }
+        let dim_shift = match type_and_dim.dimensions() {
+            geo_traits::Dimensions::Unknown(_) => {
+                // Ignore unknown dimensions
+                return;
+            }
+            geo_traits::Dimensions::Xy => 0,
+            geo_traits::Dimensions::Xyz => 8,
+            geo_traits::Dimensions::Xym => 16,
+            geo_traits::Dimensions::Xyzm => 24,
+        };
+        let bit_position = geom_shift + dim_shift;
+        self.types |= 1 << bit_position;
+    }
+
+    #[inline]
+    pub fn merge(&mut self, other: &Self) {
+        self.types |= other.types;
+    }
+
+    /// Returns `true` if the set contains no geometry types.
+    #[inline]
+    pub fn is_empty(&self) -> bool {
+        self.types == 0
+    }
+
+    /// Returns the number of geometry types in the set.
+    #[inline]
+    pub fn size(&self) -> usize {
+        self.types.count_ones() as usize
+    }
+
+    /// Clears the set, removing all geometry types.
+    #[inline]
+    pub fn clear(&mut self) {
+        self.types = 0;
+    }
+
+    /// Returns an iterator over the geometry types in the set.
+    pub fn iter(&self) -> GeometryTypeSetIter {
+        GeometryTypeSetIter {
+            types: self.types,
+            current_bit: 0,
+        }
+    }
+}
+
+/// Iterator over [`GeometryTypeAndDimensions`] values in a [`GeometryTypeSet`]
+pub struct GeometryTypeSetIter {
+    types: u32,
+    current_bit: u32,
+}
+
+impl Iterator for GeometryTypeSetIter {
+    type Item = GeometryTypeAndDimensions;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        // Find the next set bit
+        while self.current_bit < 32 {
+            let bit = self.current_bit;
+            self.current_bit += 1;
+
+            if (self.types & (1 << bit)) != 0 {
+                // Decode the bit position into geometry type and dimensions
+                let dim_shift = (bit / 8) * 8;
+                let geom_shift = bit % 8;
+                let dimensions = match dim_shift {
+                    0 => Dimensions::Xy,
+                    8 => Dimensions::Xyz,
+                    16 => Dimensions::Xym,
+                    24 => Dimensions::Xyzm,
+                    _ => panic!(
+                        "Invalid dimension bits at position {} in 
GeometryTypeSet",
+                        bit
+                    ),
+                };
+
+                let geometry_type = GeometryTypeId::try_from_wkb_id(geom_shift)
+                    .expect("Invalid geometry type wkb_id in GeometryTypeSet");

Review Comment:
   Error message references `GeometryTypeSet` but the actual type is 
`GeometryTypeAndDimensionsSet`.
   ```suggestion
                       .expect("Invalid geometry type wkb_id in 
GeometryTypeAndDimensionsSet");
   ```



##########
rust/sedona-geometry/src/types.rs:
##########
@@ -292,6 +292,178 @@ impl FromStr for GeometryTypeAndDimensions {
     }
 }
 
+/// A set containing [`GeometryTypeAndDimensions`] values
+#[derive(Clone, Debug, Default, PartialEq, Eq)]
+pub struct GeometryTypeAndDimensionsSet {
+    /// Bitset encoding geometry types and dimensions.
+    ///
+    /// Uses bits 0-31 where each geometry type's WKB ID (0-7) is encoded
+    /// at different offsets based on dimensions:
+    /// - XY: bits 0-7
+    /// - XYZ: bits 8-15
+    /// - XYM: bits 16-23
+    /// - XYZM: bits 24-31
+    types: u32,
+}
+
+impl GeometryTypeAndDimensionsSet {
+    #[inline]
+    pub fn new() -> Self {
+        Self { types: 0 }
+    }
+
+    #[inline]
+    pub fn insert(
+        &mut self,
+        type_and_dim: &GeometryTypeAndDimensions,
+    ) -> Result<(), SedonaGeometryError> {
+        if let Dimensions::Unknown(n) = type_and_dim.dimensions() {
+            return Err(SedonaGeometryError::Invalid(format!(
+                "Unknown dimensions {} in GeometryTypeSet::insert",
+                n
+            )));
+        }
+        self.insert_or_ignore(type_and_dim);
+        Ok(())
+    }
+
+    #[inline]
+    pub fn insert_or_ignore(&mut self, type_and_dim: 
&GeometryTypeAndDimensions) {
+        let geom_shift = type_and_dim.geometry_type().wkb_id();
+        // WKB ID must be < 8 to fit in the bitset layout (8 bits per 
dimension)
+        if geom_shift >= 8 {
+            panic!(
+                "Invalid geometry type wkb_id {} in 
GeometryTypeSet::insert_or_ignore",
+                geom_shift
+            );
+        }
+        let dim_shift = match type_and_dim.dimensions() {
+            geo_traits::Dimensions::Unknown(_) => {
+                // Ignore unknown dimensions
+                return;
+            }
+            geo_traits::Dimensions::Xy => 0,
+            geo_traits::Dimensions::Xyz => 8,
+            geo_traits::Dimensions::Xym => 16,
+            geo_traits::Dimensions::Xyzm => 24,
+        };
+        let bit_position = geom_shift + dim_shift;
+        self.types |= 1 << bit_position;
+    }
+
+    #[inline]
+    pub fn merge(&mut self, other: &Self) {
+        self.types |= other.types;
+    }
+
+    /// Returns `true` if the set contains no geometry types.
+    #[inline]
+    pub fn is_empty(&self) -> bool {
+        self.types == 0
+    }
+
+    /// Returns the number of geometry types in the set.
+    #[inline]
+    pub fn size(&self) -> usize {
+        self.types.count_ones() as usize
+    }
+
+    /// Clears the set, removing all geometry types.
+    #[inline]
+    pub fn clear(&mut self) {
+        self.types = 0;
+    }
+
+    /// Returns an iterator over the geometry types in the set.
+    pub fn iter(&self) -> GeometryTypeSetIter {
+        GeometryTypeSetIter {
+            types: self.types,
+            current_bit: 0,
+        }
+    }
+}
+
+/// Iterator over [`GeometryTypeAndDimensions`] values in a [`GeometryTypeSet`]
+pub struct GeometryTypeSetIter {
+    types: u32,
+    current_bit: u32,
+}
+
+impl Iterator for GeometryTypeSetIter {
+    type Item = GeometryTypeAndDimensions;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        // Find the next set bit
+        while self.current_bit < 32 {
+            let bit = self.current_bit;
+            self.current_bit += 1;
+
+            if (self.types & (1 << bit)) != 0 {
+                // Decode the bit position into geometry type and dimensions
+                let dim_shift = (bit / 8) * 8;
+                let geom_shift = bit % 8;
+                let dimensions = match dim_shift {
+                    0 => Dimensions::Xy,
+                    8 => Dimensions::Xyz,
+                    16 => Dimensions::Xym,
+                    24 => Dimensions::Xyzm,
+                    _ => panic!(
+                        "Invalid dimension bits at position {} in 
GeometryTypeSet",

Review Comment:
   Error message references `GeometryTypeSet` but the actual type is 
`GeometryTypeAndDimensionsSet`.
   ```suggestion
                           "Invalid dimension bits at position {} in 
GeometryTypeAndDimensionsSet",
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to