use crate::mapping::field_type::FieldType;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct FieldMapping {
pub name: String,
pub field_type: FieldType,
pub stored: bool,
pub indexed: bool,
pub doc_values: bool,
pub norms: bool,
pub analyzer: Option<String>,
pub search_analyzer: Option<String>,
pub parent_field: Option<String>,
pub copy_to: Vec<String>,
}
impl FieldMapping {
pub fn new(name: impl Into<String>, field_type: FieldType) -> Self {
let norms = field_type == FieldType::Text;
let is_vector = field_type.is_dense_vector();
let is_geo = matches!(field_type, FieldType::GeoPoint | FieldType::GeoShape);
let doc_values = !matches!(field_type, FieldType::Text) && !is_vector && !is_geo;
Self {
name: name.into(),
field_type,
stored: !is_vector && !is_geo, indexed: true,
doc_values,
norms,
analyzer: None,
search_analyzer: None,
parent_field: None,
copy_to: Vec::new(),
}
}
pub fn stored(mut self, stored: bool) -> Self {
self.stored = stored;
self
}
pub fn indexed(mut self, indexed: bool) -> Self {
self.indexed = indexed;
self
}
pub fn doc_values(mut self, doc_values: bool) -> Self {
self.doc_values = doc_values;
self
}
pub fn norms(mut self, norms: bool) -> Self {
self.norms = norms;
self
}
pub fn analyzer(mut self, analyzer: impl Into<String>) -> Self {
self.analyzer = Some(analyzer.into());
self
}
pub fn search_analyzer(mut self, analyzer: impl Into<String>) -> Self {
self.search_analyzer = Some(analyzer.into());
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn text_defaults() {
let m = FieldMapping::new("title", FieldType::Text);
assert!(m.stored);
assert!(m.indexed);
assert!(!m.doc_values);
assert!(m.norms);
assert!(m.analyzer.is_none());
}
#[test]
fn keyword_defaults() {
let m = FieldMapping::new("status", FieldType::Keyword);
assert!(m.stored);
assert!(m.indexed);
assert!(m.doc_values);
assert!(!m.norms);
}
#[test]
fn numeric_defaults() {
for ft in [
FieldType::Integer,
FieldType::Long,
FieldType::Float,
FieldType::Double,
] {
let m = FieldMapping::new("val", ft);
assert!(m.stored);
assert!(m.indexed);
assert!(m.doc_values);
assert!(!m.norms);
}
}
#[test]
fn boolean_defaults() {
let m = FieldMapping::new("active", FieldType::Boolean);
assert!(m.doc_values);
assert!(!m.norms);
}
#[test]
fn date_defaults() {
let m = FieldMapping::new("created", FieldType::Date);
assert!(m.doc_values);
assert!(!m.norms);
}
#[test]
fn builder_chaining() {
let m = FieldMapping::new("body", FieldType::Text)
.stored(false)
.norms(false)
.analyzer("whitespace");
assert!(!m.stored);
assert!(!m.norms);
assert_eq!(m.analyzer.as_deref(), Some("whitespace"));
}
}