From 5e17636b9d73b1696e59b07cf42e40b6b0417633 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mina=20Gali=C4=87?= Date: Wed, 22 Jul 2020 23:05:15 +0200 Subject: [PATCH] Add an SearcherActor, wrapping Searcher & DbPool and implement AddDocument message! This code compiles, but hasn't been put to use yet. --- plume-models/src/posts.rs | 2 +- plume-models/src/search/searcher.rs | 31 ++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/plume-models/src/posts.rs b/plume-models/src/posts.rs index 73c0c915..2eeb9395 100644 --- a/plume-models/src/posts.rs +++ b/plume-models/src/posts.rs @@ -24,7 +24,7 @@ use std::collections::HashSet; pub type LicensedArticle = CustomObject; -#[derive(Queryable, Identifiable, Clone, AsChangeset)] +#[derive(Debug, Queryable, Identifiable, Clone, AsChangeset)] #[changeset_options(treat_none_as_null = "true")] pub struct Post { pub id: i32, diff --git a/plume-models/src/search/searcher.rs b/plume-models/src/search/searcher.rs index 34a45b0b..b1764fd7 100644 --- a/plume-models/src/search/searcher.rs +++ b/plume-models/src/search/searcher.rs @@ -1,10 +1,11 @@ use crate::{ - config::SearchTokenizerConfig, instance::Instance, posts::Post, schema::posts, + config::SearchTokenizerConfig, db_conn::DbPool, instance::Instance, posts::Post, schema::posts, search::query::PlumeQuery, tags::Tag, Connection, Result, }; use chrono::Datelike; use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl}; use itertools::Itertools; +use riker::actors::*; use std::{cmp, fs::create_dir_all, io, path::Path, sync::Mutex}; use tantivy::{ collector::TopDocs, directory::MmapDirectory, schema::*, Index, IndexReader, IndexWriter, @@ -254,3 +255,31 @@ impl Searcher { self.writer.lock().unwrap().take(); } } + +#[derive(Clone, Debug)] +pub struct AddDocument(Post); + +#[actor(AddDocument)] +pub struct SearcherActor { + searcher: Searcher, + db_pool: DbPool, +} + +impl Actor for SearcherActor { + // we used the #[actor] attribute so SearcherActorMsg is the Msg type + type Msg = SearcherActorMsg; + + fn recv(&mut self, ctx: &Context, msg: Self::Msg, sender: Sender) { + // Use the respective Receive implementation + self.receive(ctx, msg, sender); + } +} + +impl Receive for SearcherActor { + type Msg = SearcherActorMsg; + + fn receive(&mut self, _ctx: &Context, msg: AddDocument, _sender: Sender) { + let conn = self.db_pool.get().unwrap(); + let _ = self.searcher.add_document(&conn, &msg.0); + } +}