diff --git a/src/schema/flags.rs b/src/schema/flags.rs index 4f8caa612..9b03b214d 100644 --- a/src/schema/flags.rs +++ b/src/schema/flags.rs @@ -1,6 +1,6 @@ use std::ops::BitOr; -use crate::schema::{DateOptions, NumericOptions, TextOptions}; +use crate::schema::{DateOptions, NumericOptions, SpatialOptions, TextOptions}; #[derive(Clone)] pub struct StoredFlag; @@ -95,6 +95,14 @@ impl> BitOr for SchemaFlagList } } +impl> BitOr for SchemaFlagList { + type Output = SpatialOptions; + + fn bitor(self, rhs: SpatialOptions) -> Self::Output { + self.head.into() | rhs + } +} + #[derive(Clone)] pub struct SchemaFlagList { pub head: Head, diff --git a/src/schema/mod.rs b/src/schema/mod.rs index 1cd4b7243..627774e54 100644 --- a/src/schema/mod.rs +++ b/src/schema/mod.rs @@ -124,6 +124,7 @@ mod ip_options; mod json_object_options; mod named_field_document; mod numeric_options; +mod spatial_options; mod text_options; use columnar::ColumnType; @@ -144,6 +145,7 @@ pub use self::json_object_options::JsonObjectOptions; pub use self::named_field_document::NamedFieldDocument; pub use self::numeric_options::NumericOptions; pub use self::schema::{Schema, SchemaBuilder}; +pub use self::spatial_options::{SpatialOptions, SPATIAL}; pub use self::term::{Term, ValueBytes}; pub use self::text_options::{TextFieldIndexing, TextOptions, STRING, TEXT}; diff --git a/src/schema/spatial_options.rs b/src/schema/spatial_options.rs new file mode 100644 index 000000000..13cce1a6f --- /dev/null +++ b/src/schema/spatial_options.rs @@ -0,0 +1,51 @@ +use std::ops::BitOr; + +use serde::{Deserialize, Serialize}; + +use crate::schema::flags::StoredFlag; + +/// Define how a spatial field should be handled by tantivy. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, Default)] +pub struct SpatialOptions { + #[serde(default)] + stored: bool, +} + +/// The field will be untokenized and indexed. +pub const SPATIAL: SpatialOptions = SpatialOptions { stored: false }; + +impl SpatialOptions { + /// Returns true if the geometry is to be stored. + #[inline] + pub fn is_stored(&self) -> bool { + self.stored + } +} + +impl> BitOr for SpatialOptions { + type Output = SpatialOptions; + + fn bitor(self, other: T) -> SpatialOptions { + let other = other.into(); + SpatialOptions { + stored: self.stored | other.stored, + } + } +} + +impl From for SpatialOptions { + fn from(_: StoredFlag) -> SpatialOptions { + SpatialOptions { stored: true } + } +} + +#[cfg(test)] +mod tests { + use crate::schema::*; + + #[test] + fn test_field_options() { + let field_options = STORED | SPATIAL; + assert!(field_options.is_stored()); + } +}