2021-03-24 11:29:11 +01:00
|
|
|
use std::path::{Path, PathBuf};
|
2021-03-23 11:00:50 +01:00
|
|
|
|
|
|
|
use tokio::sync::{mpsc, oneshot};
|
|
|
|
use uuid::Uuid;
|
|
|
|
|
2021-05-31 16:03:39 +02:00
|
|
|
use crate::{
|
|
|
|
index::Checked,
|
|
|
|
index_controller::{IndexSettings, IndexStats, Processing},
|
|
|
|
};
|
2021-04-22 10:14:29 +02:00
|
|
|
use crate::{
|
|
|
|
index::{Document, SearchQuery, SearchResult, Settings},
|
|
|
|
index_controller::{Failed, Processed},
|
2021-03-24 11:29:11 +01:00
|
|
|
};
|
2021-03-23 11:00:50 +01:00
|
|
|
|
2021-06-14 21:26:35 +02:00
|
|
|
use super::error::Result;
|
2021-06-15 17:39:07 +02:00
|
|
|
use super::{IndexActor, IndexActorHandle, IndexMeta, IndexMsg, MapIndexStore};
|
2021-04-22 10:14:29 +02:00
|
|
|
|
2021-03-23 11:00:50 +01:00
|
|
|
#[derive(Clone)]
|
|
|
|
pub struct IndexActorHandleImpl {
|
2021-04-13 17:46:39 +02:00
|
|
|
sender: mpsc::Sender<IndexMsg>,
|
2021-03-23 11:00:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#[async_trait::async_trait]
|
|
|
|
impl IndexActorHandle for IndexActorHandleImpl {
|
2021-06-15 17:39:07 +02:00
|
|
|
async fn create_index(&self, uuid: Uuid, primary_key: Option<String>) -> Result<IndexMeta> {
|
2021-03-23 11:00:50 +01:00
|
|
|
let (ret, receiver) = oneshot::channel();
|
|
|
|
let msg = IndexMsg::CreateIndex {
|
|
|
|
ret,
|
|
|
|
uuid,
|
|
|
|
primary_key,
|
|
|
|
};
|
2021-04-13 17:46:39 +02:00
|
|
|
let _ = self.sender.send(msg).await;
|
2021-03-23 11:00:50 +01:00
|
|
|
receiver.await.expect("IndexActor has been killed")
|
|
|
|
}
|
|
|
|
|
|
|
|
async fn update(
|
|
|
|
&self,
|
2021-04-13 17:14:02 +02:00
|
|
|
uuid: Uuid,
|
2021-04-22 10:14:29 +02:00
|
|
|
meta: Processing,
|
|
|
|
data: Option<std::fs::File>,
|
2021-06-14 21:26:35 +02:00
|
|
|
) -> Result<std::result::Result<Processed, Failed>> {
|
2021-03-23 11:00:50 +01:00
|
|
|
let (ret, receiver) = oneshot::channel();
|
2021-04-14 17:53:12 +02:00
|
|
|
let msg = IndexMsg::Update {
|
|
|
|
ret,
|
|
|
|
meta,
|
|
|
|
data,
|
|
|
|
uuid,
|
|
|
|
};
|
2021-04-13 17:46:39 +02:00
|
|
|
let _ = self.sender.send(msg).await;
|
2021-03-23 11:00:50 +01:00
|
|
|
Ok(receiver.await.expect("IndexActor has been killed")?)
|
|
|
|
}
|
|
|
|
|
2021-06-14 21:26:35 +02:00
|
|
|
async fn search(&self, uuid: Uuid, query: SearchQuery) -> Result<SearchResult> {
|
2021-03-23 11:00:50 +01:00
|
|
|
let (ret, receiver) = oneshot::channel();
|
|
|
|
let msg = IndexMsg::Search { uuid, query, ret };
|
2021-04-13 17:46:39 +02:00
|
|
|
let _ = self.sender.send(msg).await;
|
2021-03-23 11:00:50 +01:00
|
|
|
Ok(receiver.await.expect("IndexActor has been killed")?)
|
|
|
|
}
|
|
|
|
|
2021-06-14 21:26:35 +02:00
|
|
|
async fn settings(&self, uuid: Uuid) -> Result<Settings<Checked>> {
|
2021-03-23 11:00:50 +01:00
|
|
|
let (ret, receiver) = oneshot::channel();
|
|
|
|
let msg = IndexMsg::Settings { uuid, ret };
|
2021-04-13 17:46:39 +02:00
|
|
|
let _ = self.sender.send(msg).await;
|
2021-03-23 11:00:50 +01:00
|
|
|
Ok(receiver.await.expect("IndexActor has been killed")?)
|
|
|
|
}
|
|
|
|
|
|
|
|
async fn documents(
|
|
|
|
&self,
|
|
|
|
uuid: Uuid,
|
|
|
|
offset: usize,
|
|
|
|
limit: usize,
|
|
|
|
attributes_to_retrieve: Option<Vec<String>>,
|
2021-06-14 21:26:35 +02:00
|
|
|
) -> Result<Vec<Document>> {
|
2021-03-23 11:00:50 +01:00
|
|
|
let (ret, receiver) = oneshot::channel();
|
|
|
|
let msg = IndexMsg::Documents {
|
|
|
|
uuid,
|
|
|
|
ret,
|
|
|
|
offset,
|
|
|
|
attributes_to_retrieve,
|
|
|
|
limit,
|
|
|
|
};
|
2021-04-13 17:46:39 +02:00
|
|
|
let _ = self.sender.send(msg).await;
|
2021-03-23 11:00:50 +01:00
|
|
|
Ok(receiver.await.expect("IndexActor has been killed")?)
|
|
|
|
}
|
|
|
|
|
|
|
|
async fn document(
|
|
|
|
&self,
|
|
|
|
uuid: Uuid,
|
|
|
|
doc_id: String,
|
|
|
|
attributes_to_retrieve: Option<Vec<String>>,
|
2021-06-14 21:26:35 +02:00
|
|
|
) -> Result<Document> {
|
2021-03-23 11:00:50 +01:00
|
|
|
let (ret, receiver) = oneshot::channel();
|
|
|
|
let msg = IndexMsg::Document {
|
|
|
|
uuid,
|
|
|
|
ret,
|
|
|
|
doc_id,
|
|
|
|
attributes_to_retrieve,
|
|
|
|
};
|
2021-04-13 17:46:39 +02:00
|
|
|
let _ = self.sender.send(msg).await;
|
2021-03-23 11:00:50 +01:00
|
|
|
Ok(receiver.await.expect("IndexActor has been killed")?)
|
|
|
|
}
|
|
|
|
|
2021-06-14 21:26:35 +02:00
|
|
|
async fn delete(&self, uuid: Uuid) -> Result<()> {
|
2021-03-23 11:00:50 +01:00
|
|
|
let (ret, receiver) = oneshot::channel();
|
|
|
|
let msg = IndexMsg::Delete { uuid, ret };
|
2021-04-13 17:46:39 +02:00
|
|
|
let _ = self.sender.send(msg).await;
|
2021-03-23 11:00:50 +01:00
|
|
|
Ok(receiver.await.expect("IndexActor has been killed")?)
|
|
|
|
}
|
|
|
|
|
2021-06-14 21:26:35 +02:00
|
|
|
async fn get_index_meta(&self, uuid: Uuid) -> Result<IndexMeta> {
|
2021-03-23 11:00:50 +01:00
|
|
|
let (ret, receiver) = oneshot::channel();
|
|
|
|
let msg = IndexMsg::GetMeta { uuid, ret };
|
2021-04-13 17:46:39 +02:00
|
|
|
let _ = self.sender.send(msg).await;
|
2021-03-23 11:00:50 +01:00
|
|
|
Ok(receiver.await.expect("IndexActor has been killed")?)
|
|
|
|
}
|
|
|
|
|
2021-06-15 17:39:07 +02:00
|
|
|
async fn update_index(&self, uuid: Uuid, index_settings: IndexSettings) -> Result<IndexMeta> {
|
2021-03-23 11:00:50 +01:00
|
|
|
let (ret, receiver) = oneshot::channel();
|
|
|
|
let msg = IndexMsg::UpdateIndex {
|
|
|
|
uuid,
|
|
|
|
index_settings,
|
|
|
|
ret,
|
|
|
|
};
|
2021-04-13 17:46:39 +02:00
|
|
|
let _ = self.sender.send(msg).await;
|
2021-03-23 11:00:50 +01:00
|
|
|
Ok(receiver.await.expect("IndexActor has been killed")?)
|
|
|
|
}
|
|
|
|
|
2021-06-14 21:26:35 +02:00
|
|
|
async fn snapshot(&self, uuid: Uuid, path: PathBuf) -> Result<()> {
|
2021-03-23 11:00:50 +01:00
|
|
|
let (ret, receiver) = oneshot::channel();
|
|
|
|
let msg = IndexMsg::Snapshot { uuid, path, ret };
|
2021-04-13 17:46:39 +02:00
|
|
|
let _ = self.sender.send(msg).await;
|
2021-03-23 11:00:50 +01:00
|
|
|
Ok(receiver.await.expect("IndexActor has been killed")?)
|
|
|
|
}
|
2021-04-01 16:44:42 +02:00
|
|
|
|
2021-06-14 21:26:35 +02:00
|
|
|
async fn dump(&self, uuid: Uuid, path: PathBuf) -> Result<()> {
|
2021-04-28 16:43:49 +02:00
|
|
|
let (ret, receiver) = oneshot::channel();
|
2021-05-24 18:16:35 +02:00
|
|
|
let msg = IndexMsg::Dump { uuid, path, ret };
|
2021-05-10 20:24:14 +02:00
|
|
|
let _ = self.sender.send(msg).await;
|
2021-04-28 16:43:49 +02:00
|
|
|
Ok(receiver.await.expect("IndexActor has been killed")?)
|
|
|
|
}
|
|
|
|
|
2021-06-14 21:26:35 +02:00
|
|
|
async fn get_index_stats(&self, uuid: Uuid) -> Result<IndexStats> {
|
2021-04-01 16:44:42 +02:00
|
|
|
let (ret, receiver) = oneshot::channel();
|
|
|
|
let msg = IndexMsg::GetStats { uuid, ret };
|
2021-04-14 17:53:12 +02:00
|
|
|
let _ = self.sender.send(msg).await;
|
2021-04-01 16:44:42 +02:00
|
|
|
Ok(receiver.await.expect("IndexActor has been killed")?)
|
|
|
|
}
|
2021-03-23 11:00:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
impl IndexActorHandleImpl {
|
2021-06-15 17:39:07 +02:00
|
|
|
pub fn new(path: impl AsRef<Path>, index_size: usize) -> anyhow::Result<Self> {
|
2021-04-13 17:46:39 +02:00
|
|
|
let (sender, receiver) = mpsc::channel(100);
|
2021-03-23 11:00:50 +01:00
|
|
|
|
|
|
|
let store = MapIndexStore::new(path, index_size);
|
2021-04-13 17:46:39 +02:00
|
|
|
let actor = IndexActor::new(receiver, store)?;
|
2021-03-23 11:00:50 +01:00
|
|
|
tokio::task::spawn(actor.run());
|
2021-04-14 17:53:12 +02:00
|
|
|
Ok(Self { sender })
|
2021-03-23 11:00:50 +01:00
|
|
|
}
|
|
|
|
}
|