use std::fmt;
use mem_dbg::MemSize;
use crate::index::field::Field;
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, MemSize)]
#[mem_size(flat)]
pub enum IndexOptions {
None = 0,
Docs = 1,
DocsAndFreqs = 2,
DocsAndFreqsAndPositions = 3,
DocsAndFreqsAndPositionsAndOffsets = 4,
}
impl IndexOptions {
pub fn has_freqs(self) -> bool {
self >= IndexOptions::DocsAndFreqs
}
pub fn has_positions(self) -> bool {
self >= IndexOptions::DocsAndFreqsAndPositions
}
pub fn has_offsets(self) -> bool {
self >= IndexOptions::DocsAndFreqsAndPositionsAndOffsets
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct TermOffset {
pub start: u32,
pub length: u16,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, MemSize)]
#[mem_size(flat)]
pub enum DocValuesType {
None = 0,
Numeric = 1,
Binary = 2,
Sorted = 3,
SortedNumeric = 4,
SortedSet = 5,
}
#[derive(Clone, PartialEq, MemSize)]
pub enum StoredValue {
String(String),
Bytes(Vec<u8>),
Int(i32),
Long(i64),
Float(f32),
Double(f64),
}
impl fmt::Debug for StoredValue {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
StoredValue::String(s) => f.debug_tuple("String").field(s).finish(),
StoredValue::Bytes(b) => f.debug_tuple("Bytes.len()").field(&b.len()).finish(),
StoredValue::Int(v) => f.debug_tuple("Int").field(v).finish(),
StoredValue::Long(v) => f.debug_tuple("Long").field(v).finish(),
StoredValue::Float(v) => f.debug_tuple("Float").field(v).finish(),
StoredValue::Double(v) => f.debug_tuple("Double").field(v).finish(),
}
}
}
#[derive(Debug)]
pub struct Document {
fields: Vec<Field>,
}
impl Document {
pub fn fields(&mut self) -> &mut [Field] {
&mut self.fields
}
}
#[derive(Debug, Default)]
pub struct DocumentBuilder {
fields: Vec<Field>,
}
impl DocumentBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn add_field(mut self, field: Field) -> Self {
self.fields.push(field);
self
}
pub fn build(self) -> Document {
Document {
fields: self.fields,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_index_options_ordering() {
use assertables::*;
assert_lt!(IndexOptions::None, IndexOptions::Docs);
assert_lt!(IndexOptions::Docs, IndexOptions::DocsAndFreqs);
assert_lt!(
IndexOptions::DocsAndFreqs,
IndexOptions::DocsAndFreqsAndPositions
);
assert_lt!(
IndexOptions::DocsAndFreqsAndPositions,
IndexOptions::DocsAndFreqsAndPositionsAndOffsets
);
}
#[test]
fn test_index_options_has_freqs() {
assert!(!IndexOptions::None.has_freqs());
assert!(!IndexOptions::Docs.has_freqs());
assert!(IndexOptions::DocsAndFreqs.has_freqs());
assert!(IndexOptions::DocsAndFreqsAndPositions.has_freqs());
assert!(IndexOptions::DocsAndFreqsAndPositionsAndOffsets.has_freqs());
}
#[test]
fn test_index_options_has_positions() {
assert!(!IndexOptions::None.has_positions());
assert!(!IndexOptions::Docs.has_positions());
assert!(!IndexOptions::DocsAndFreqs.has_positions());
assert!(IndexOptions::DocsAndFreqsAndPositions.has_positions());
assert!(IndexOptions::DocsAndFreqsAndPositionsAndOffsets.has_positions());
}
}