2019-10-08 15:22:36 +02:00
|
|
|
#[cfg(test)]
|
2019-10-18 13:05:28 +02:00
|
|
|
#[macro_use]
|
|
|
|
extern crate assert_matches;
|
2019-10-08 15:22:36 +02:00
|
|
|
|
2019-10-02 17:34:32 +02:00
|
|
|
mod automaton;
|
2019-12-13 11:49:56 +01:00
|
|
|
mod bucket_sort;
|
2019-10-04 16:49:17 +02:00
|
|
|
mod database;
|
2019-10-09 13:44:18 +02:00
|
|
|
mod distinct_map;
|
2019-10-03 15:04:11 +02:00
|
|
|
mod error;
|
2019-10-30 17:25:42 +01:00
|
|
|
mod levenshtein;
|
2019-10-03 11:49:13 +02:00
|
|
|
mod number;
|
2019-10-02 17:34:32 +02:00
|
|
|
mod query_builder;
|
2019-10-03 15:04:11 +02:00
|
|
|
mod ranked_map;
|
2019-10-02 17:34:32 +02:00
|
|
|
mod raw_document;
|
2019-10-18 13:05:28 +02:00
|
|
|
mod reordered_attrs;
|
2019-12-13 11:49:56 +01:00
|
|
|
mod update;
|
|
|
|
pub mod criterion;
|
|
|
|
pub mod raw_indexer;
|
2019-10-03 11:49:13 +02:00
|
|
|
pub mod serde;
|
2019-10-02 17:34:32 +02:00
|
|
|
pub mod store;
|
2019-11-30 16:53:34 +01:00
|
|
|
|
2019-11-26 16:12:06 +01:00
|
|
|
pub use self::database::{BoxUpdateFn, Database, MainT, UpdateT};
|
2019-10-03 17:33:15 +02:00
|
|
|
pub use self::error::{Error, MResult};
|
2019-10-04 13:26:33 +02:00
|
|
|
pub use self::number::{Number, ParseNumberError};
|
|
|
|
pub use self::ranked_map::RankedMap;
|
2019-10-04 16:49:17 +02:00
|
|
|
pub use self::raw_document::RawDocument;
|
2019-10-04 13:26:33 +02:00
|
|
|
pub use self::store::Index;
|
2019-10-31 11:13:37 +01:00
|
|
|
pub use self::update::{EnqueuedUpdateResult, ProcessedUpdateResult, UpdateStatus, UpdateType};
|
2019-12-13 11:46:53 +01:00
|
|
|
pub use meilisearch_types::{DocIndex, DocumentId, Highlight};
|
2019-10-02 17:34:32 +02:00
|
|
|
|
2019-12-11 17:36:53 +01:00
|
|
|
use compact_arena::SmallArena;
|
|
|
|
use crate::bucket_sort::{QueryWordAutomaton, PostingsListView};
|
|
|
|
use crate::levenshtein::prefix_damerau_levenshtein;
|
|
|
|
|
2019-12-13 11:14:12 +01:00
|
|
|
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
|
2019-10-02 17:34:32 +02:00
|
|
|
pub struct Document {
|
|
|
|
pub id: DocumentId,
|
|
|
|
pub highlights: Vec<Highlight>,
|
|
|
|
|
2019-12-13 11:14:12 +01:00
|
|
|
#[cfg(test)]
|
|
|
|
pub matches: Vec<crate::bucket_sort::SimpleMatch>,
|
2019-10-02 17:34:32 +02:00
|
|
|
}
|
|
|
|
|
2019-12-11 17:36:53 +01:00
|
|
|
impl Document {
|
|
|
|
pub fn from_raw<'a, 'tag, 'txn>(
|
|
|
|
raw_document: RawDocument<'a, 'tag>,
|
|
|
|
automatons: &[QueryWordAutomaton],
|
|
|
|
arena: &SmallArena<'tag, PostingsListView<'txn>>,
|
|
|
|
) -> Document
|
|
|
|
{
|
|
|
|
let highlights = raw_document.raw_matches.iter().flat_map(|sm| {
|
|
|
|
let postings_list = &arena[sm.postings_list];
|
|
|
|
let input = postings_list.input();
|
|
|
|
let query = &automatons[sm.query_index as usize].query;
|
|
|
|
postings_list.iter().map(move |m| {
|
|
|
|
let covered_area = if query.len() > input.len() {
|
|
|
|
input.len()
|
|
|
|
} else {
|
|
|
|
prefix_damerau_levenshtein(query.as_bytes(), input).1
|
|
|
|
};
|
|
|
|
|
|
|
|
Highlight {
|
|
|
|
attribute: m.attribute,
|
|
|
|
char_index: m.char_index,
|
|
|
|
char_length: covered_area as u16,
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}).collect();
|
|
|
|
|
2019-12-13 11:14:12 +01:00
|
|
|
#[cfg(not(test))]
|
|
|
|
{
|
|
|
|
Document { id: raw_document.id, highlights }
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
{
|
|
|
|
let matches = raw_document.processed_matches;
|
|
|
|
Document { id: raw_document.id, highlights, matches }
|
|
|
|
}
|
2019-12-11 17:36:53 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-10-02 17:34:32 +02:00
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
use super::*;
|
|
|
|
use std::mem;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn docindex_mem_size() {
|
|
|
|
assert_eq!(mem::size_of::<DocIndex>(), 16);
|
|
|
|
}
|
|
|
|
}
|