use super::Index;
use crate::chunk;
use crate::error::Error;
use crate::schema::{
ChunkSchema,
FileSchema,
ImageSchema,
ModelSchema,
QueryTurnSchema,
};
use crate::uid::Uid;
use ragit_api::load_models;
use ragit_fs::{file_name, parent};
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum UidOrStagedFile {
Uid(Uid),
StagedFile(String),
}
impl Index {
pub fn list_chunks<Filter, Sort, Key: Clone + Ord>(
&self,
filter: &Filter,
sort_key: &Sort,
) -> Result<Vec<Uid>, Error> where Filter: Fn(&ChunkSchema) -> bool, Sort: Fn(&ChunkSchema) -> Key {
let mut result = vec![];
for chunk_file in self.get_all_chunk_files()? {
let chunk = chunk::load_from_file(&chunk_file)?;
let chunk: ChunkSchema = chunk.into();
if !filter(&chunk) {
continue;
}
let key = sort_key(&chunk);
result.push((chunk.uid, key));
}
result.sort_by_key(|(_, key)| key.clone());
Ok(result.into_iter().map(|(uid, _)| uid).collect())
}
pub fn list_files<Filter, Sort, Key: Clone + Ord>(
&self,
filter: &Filter,
sort_key: &Sort,
) -> Result<Vec<UidOrStagedFile>, Error> where Filter: Fn(&FileSchema) -> bool, Sort: Fn(&FileSchema) -> Key {
let mut result = vec![];
for file in self.staged_files.iter() {
let f = FileSchema {
path: file.clone(),
is_processed: false,
..FileSchema::dummy()
};
if !filter(&f) {
continue;
}
let key = sort_key(&f);
result.push((UidOrStagedFile::StagedFile(file.clone()), key));
}
for (file, uid) in self.processed_files.iter() {
let f = self.get_file_schema_worker(file.to_string(), *uid)?;
if !filter(&f) {
continue;
}
let key = sort_key(&f);
result.push((UidOrStagedFile::Uid(f.uid), key));
}
result.sort_by_key(|(_, key)| key.clone());
Ok(result.into_iter().map(|(uid, _)| uid).collect())
}
pub fn list_models<Filter, Map, Sort, Key: Ord>(
models_at: &str,
filter: &Filter,
map: &Map,
sort_key: &Sort,
) -> Result<Vec<ModelSchema>, Error> where Filter: Fn(&ModelSchema) -> bool, Map: Fn(ModelSchema) -> ModelSchema, Sort: Fn(&ModelSchema) -> Key {
let mut result = vec![];
for model in load_models(models_at)? {
if !filter(&model) {
continue;
}
let model = map(model);
result.push(model);
}
result.sort_by_key(sort_key);
Ok(result)
}
pub fn list_images<Filter, Sort, Key: Clone + Ord>(
&self,
filter: &Filter,
sort_key: &Sort,
) -> Result<Vec<Uid>, Error> where Filter: Fn(&ImageSchema) -> bool, Sort: Fn(&ImageSchema) -> Key {
let mut result = vec![];
for image in self.get_all_image_files()? {
let image = self.get_image_schema(
Uid::from_prefix_and_suffix(
&file_name(&parent(&image)?)?,
&file_name(&image)?,
)?,
false,
)?;
if !filter(&image) {
continue;
}
let key = sort_key(&image);
result.push((image.uid, key));
}
result.sort_by_key(|(_, key)| key.clone());
Ok(result.into_iter().map(|(uid, _)| uid).collect())
}
pub fn list_queries<Filter, Sort, Key: Clone + Ord>(
&self,
filter: &Filter,
sort_key: &Sort,
) -> Result<Vec<Uid>, Error> where Filter: Fn(&[QueryTurnSchema]) -> bool, Sort: Fn(&[QueryTurnSchema]) -> Key {
let mut result = vec![];
for query_file in self.get_all_query_history_files()? {
let query_uid = Uid::from_prefix_and_suffix(
&file_name(&parent(&query_file)?)?,
&file_name(&query_file)?,
)?;
let query = self.get_query_schema(query_uid)?;
if !filter(&query) {
continue;
}
let key = sort_key(&query);
result.push((query_uid, key));
}
result.sort_by_key(|(_, key)| key.clone());
Ok(result.into_iter().map(|(uid, _)| uid).collect())
}
}