This commit is contained in:
Alex Wied
2026-06-29 15:20:02 -04:00
parent ee5deb87c1
commit 59c8dffb01
10 changed files with 149 additions and 141 deletions
Generated
+20 -20
View File
@@ -106,9 +106,9 @@ dependencies = [
[[package]]
name = "anyhow"
version = "1.0.102"
version = "1.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3"
[[package]]
name = "arboard"
@@ -130,9 +130,9 @@ dependencies = [
[[package]]
name = "arc-swap"
version = "1.9.1"
version = "1.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207"
checksum = "c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b"
dependencies = [
"rustversion",
]
@@ -1399,9 +1399,9 @@ dependencies = [
[[package]]
name = "glam"
version = "0.33.1"
version = "0.33.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "898f5a568a84989b6c0f8caa50a93074b97dbdc58fc6d9543157bb4562758933"
checksum = "7f22fb22f065b308be0d8724e3706c7fa3fc2a6c7d6899df4cad7860e7a75436"
[[package]]
name = "glob"
@@ -1630,7 +1630,7 @@ dependencies = [
[[package]]
name = "iced"
version = "0.15.0-dev"
source = "git+https://github.com/iced-rs/iced.git?branch=master#e46f9c9e69a8d787823c4a64fdcc49c23f303065"
source = "git+https://github.com/iced-rs/iced.git?branch=master#36b6ed0aec85fb01afbb63b4f48afa7763487967"
dependencies = [
"iced_core",
"iced_debug",
@@ -1645,7 +1645,7 @@ dependencies = [
[[package]]
name = "iced_core"
version = "0.15.0-dev"
source = "git+https://github.com/iced-rs/iced.git?branch=master#e46f9c9e69a8d787823c4a64fdcc49c23f303065"
source = "git+https://github.com/iced-rs/iced.git?branch=master#36b6ed0aec85fb01afbb63b4f48afa7763487967"
dependencies = [
"bitflags 2.13.0",
"bytes",
@@ -1663,7 +1663,7 @@ dependencies = [
[[package]]
name = "iced_debug"
version = "0.15.0-dev"
source = "git+https://github.com/iced-rs/iced.git?branch=master#e46f9c9e69a8d787823c4a64fdcc49c23f303065"
source = "git+https://github.com/iced-rs/iced.git?branch=master#36b6ed0aec85fb01afbb63b4f48afa7763487967"
dependencies = [
"iced_core",
"iced_futures",
@@ -1673,7 +1673,7 @@ dependencies = [
[[package]]
name = "iced_futures"
version = "0.15.0-dev"
source = "git+https://github.com/iced-rs/iced.git?branch=master#e46f9c9e69a8d787823c4a64fdcc49c23f303065"
source = "git+https://github.com/iced-rs/iced.git?branch=master#36b6ed0aec85fb01afbb63b4f48afa7763487967"
dependencies = [
"futures",
"iced_core",
@@ -1687,7 +1687,7 @@ dependencies = [
[[package]]
name = "iced_graphics"
version = "0.15.0-dev"
source = "git+https://github.com/iced-rs/iced.git?branch=master#e46f9c9e69a8d787823c4a64fdcc49c23f303065"
source = "git+https://github.com/iced-rs/iced.git?branch=master#36b6ed0aec85fb01afbb63b4f48afa7763487967"
dependencies = [
"bitflags 2.13.0",
"bytemuck",
@@ -1705,7 +1705,7 @@ dependencies = [
[[package]]
name = "iced_program"
version = "0.15.0-dev"
source = "git+https://github.com/iced-rs/iced.git?branch=master#e46f9c9e69a8d787823c4a64fdcc49c23f303065"
source = "git+https://github.com/iced-rs/iced.git?branch=master#36b6ed0aec85fb01afbb63b4f48afa7763487967"
dependencies = [
"iced_graphics",
"iced_runtime",
@@ -1714,7 +1714,7 @@ dependencies = [
[[package]]
name = "iced_renderer"
version = "0.15.0-dev"
source = "git+https://github.com/iced-rs/iced.git?branch=master#e46f9c9e69a8d787823c4a64fdcc49c23f303065"
source = "git+https://github.com/iced-rs/iced.git?branch=master#36b6ed0aec85fb01afbb63b4f48afa7763487967"
dependencies = [
"iced_graphics",
"iced_tiny_skia",
@@ -1726,7 +1726,7 @@ dependencies = [
[[package]]
name = "iced_runtime"
version = "0.15.0-dev"
source = "git+https://github.com/iced-rs/iced.git?branch=master#e46f9c9e69a8d787823c4a64fdcc49c23f303065"
source = "git+https://github.com/iced-rs/iced.git?branch=master#36b6ed0aec85fb01afbb63b4f48afa7763487967"
dependencies = [
"bytes",
"iced_core",
@@ -1737,7 +1737,7 @@ dependencies = [
[[package]]
name = "iced_tiny_skia"
version = "0.15.0-dev"
source = "git+https://github.com/iced-rs/iced.git?branch=master#e46f9c9e69a8d787823c4a64fdcc49c23f303065"
source = "git+https://github.com/iced-rs/iced.git?branch=master#36b6ed0aec85fb01afbb63b4f48afa7763487967"
dependencies = [
"bytemuck",
"cosmic-text",
@@ -1753,7 +1753,7 @@ dependencies = [
[[package]]
name = "iced_wgpu"
version = "0.15.0-dev"
source = "git+https://github.com/iced-rs/iced.git?branch=master#e46f9c9e69a8d787823c4a64fdcc49c23f303065"
source = "git+https://github.com/iced-rs/iced.git?branch=master#36b6ed0aec85fb01afbb63b4f48afa7763487967"
dependencies = [
"bitflags 2.13.0",
"bytemuck",
@@ -1770,7 +1770,7 @@ dependencies = [
[[package]]
name = "iced_widget"
version = "0.15.0-dev"
source = "git+https://github.com/iced-rs/iced.git?branch=master#e46f9c9e69a8d787823c4a64fdcc49c23f303065"
source = "git+https://github.com/iced-rs/iced.git?branch=master#36b6ed0aec85fb01afbb63b4f48afa7763487967"
dependencies = [
"iced_renderer",
"iced_runtime",
@@ -1784,7 +1784,7 @@ dependencies = [
[[package]]
name = "iced_winit"
version = "0.15.0-dev"
source = "git+https://github.com/iced-rs/iced.git?branch=master#e46f9c9e69a8d787823c4a64fdcc49c23f303065"
source = "git+https://github.com/iced-rs/iced.git?branch=master#36b6ed0aec85fb01afbb63b4f48afa7763487967"
dependencies = [
"arboard",
"iced_debug",
@@ -4727,9 +4727,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]]
name = "uuid"
version = "1.23.3"
version = "1.23.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7"
checksum = "bf80a72845275afea99e7f2b434723d3bc7e38470fcd1c7ed39a599c73319a53"
dependencies = [
"getrandom 0.4.3",
"js-sys",
+25 -24
View File
@@ -1,7 +1,7 @@
use crate::rdf::ontology::{LabeledIri, Ontology};
use crate::rdf::term_helper::{TermHelper, TermHelperMut};
use crate::rdf::vocab::{gl, rda};
use gl_search::{Schema, SearchDocument, SearchIndex, doc, NamedFieldDocument, OwnedValue};
use gl_search::{Schema, SearchDocument, SearchIndex, NamedFieldDocument, OwnedValue, doc};
use http::StatusCode;
use iced::alignment::Horizontal;
use iced::widget::button::Style;
@@ -18,8 +18,8 @@ use ldp::traverse::Traverse;
use ldp::{RdfSource, RdfSourceUpdateResponse, ResourceRequestBuilder, SerializationOptions};
use oxigraph::io::RdfFormat;
use oxigraph::model::vocab::{rdf, rdfs};
use oxigraph::model::{BaseDirection, Dataset, NamedNode, NamedNodeRef, Quad, Term, TermRef};
use tracing::{debug, error, info};
use oxigraph::model::{BaseDirection, Dataset, NamedNode, Quad, Term, TermRef};
use tracing::{debug, error, info, info_span, span, Level};
use crate::widget::iri_input::iri_input;
#[derive(Debug, Clone)]
@@ -95,40 +95,41 @@ pub(crate) struct Publisher {
impl Publisher {
pub(crate) fn new() -> (Self, Task<Message>) {
let ontology = Ontology::builder()
.with_path("/home/alex/.local/share/org.graphofliberty.desktop/ontology")
.build()
.expect("Failed to build ontology");
let ontology = info_span!("Ontology Creation").in_scope(|| {
Ontology::builder()
.with_path("/home/alex/.local/share/org.graphofliberty.desktop/ontology")
.build()
.expect("Failed to build ontology")
});
let mut index = SearchIndex::builder()
.with_path("/home/alex/Documents/Index")
.build()
.expect("Failed to build search index");
let index = info_span!("Ontology Indexing").in_scope(|| {
let mut index = SearchIndex::builder()
//.with_path("/home/alex/.local/share/org.graphofliberty.desktop/index")
.build()
.expect("Failed to build search index");
if let Some(id) = ontology.catalog_id(&rdf::PROPERTY.into_owned()) { index.remove_all_of_type(id); }
if let Some(id) = ontology.catalog_id(&rdfs::CLASS.into_owned()) { index.remove_all_of_type(id); }
if let Some(id) = ontology.catalog_id(&rdf::PROPERTY.into_owned()) { index.remove_all_of_type(id); }
if let Some(id) = ontology.catalog_id(&rdfs::CLASS.into_owned()) { index.remove_all_of_type(id); }
/*for (iri, info) in ontology.iri_info() {
if let Some(type_) = ontology.catalog_id(&info.type_) {
for (iri, entity) in ontology.entities() {
let mut document = doc!(
Schema::type_field() => type_,
Schema::type_field() => entity.catalog_id,
Schema::iri_field() => iri.as_str(),
);
if let Some(label) = &info.label &&
let Some(field) = ontology.field_for_property(&rdfs::LABEL.into_owned()) {
document.add_text(Schema::field(&field.name), label);
if let Some(field) = ontology.field_for_property(&rdfs::LABEL.into_owned()) {
document.add_text(Schema::field(&field.name), &entity.label);
}
if let Some(comment) = &info.comment &&
let Some(field) = ontology.field_for_property(&rdfs::COMMENT.into_owned()) {
document.add_text(Schema::field(&field.name), comment);
if let Some(field) = ontology.field_for_property(&rdfs::COMMENT.into_owned()) {
document.add_text(Schema::field(&field.name), entity.comment.clone().unwrap_or(String::from("")));
}
index.add(document).expect("Unable to add annotated IRI to search index");
}
}
index.commit().expect("Unable to commit ontology to index");*/
index.commit().expect("Unable to commit ontology to index");
index
});
let mut abbreviated_datatypes = ontology
.datatypes()
+3
View File
@@ -21,4 +21,7 @@ pub(crate) enum Error {
#[error(transparent)]
Search(#[from] gl_search::SearchError),
#[error(transparent)]
QueryEvaluation(#[from] oxigraph::sparql::QueryEvaluationError),
}
+2 -2
View File
@@ -4,16 +4,16 @@ mod rdf;
mod windows;
mod widget;
use iced::Program;
use crate::app::Publisher;
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::util::SubscriberInitExt;
use tracing_subscriber::{EnvFilter, fmt};
use tracing_subscriber::fmt::format::FmtSpan;
fn main() -> color_eyre::Result<()> {
let appender = tracing_appender::rolling::never("/tmp", "publisher-log");
tracing_subscriber::registry()
.with(fmt::layer().with_writer(appender))
.with(fmt::layer().with_span_events(FmtSpan::CLOSE).with_writer(appender))
.with(EnvFilter::from_default_env())
.init();
color_eyre::install()?;
+7 -6
View File
@@ -1,11 +1,12 @@
use oxigraph::model::{NamedNode, Quad, Term};
use oxigraph::model::vocab::{rdf, xsd};
use tracing::info;
fn quad_to_term(quad: &Quad) -> &Term {
pub fn quad_to_term(quad: &Quad) -> &Term {
&quad.object
}
fn term_to_named_node(term: &Term) -> Option<&NamedNode> {
pub fn term_to_named_node(term: &Term) -> Option<&NamedNode> {
if let Term::NamedNode(node) = term {
Some(node)
} else {
@@ -13,7 +14,7 @@ fn term_to_named_node(term: &Term) -> Option<&NamedNode> {
}
}
fn term_to_string(term: &Term) -> Option<&str> {
pub fn term_to_string(term: &Term) -> Option<&str> {
if let Term::Literal(literal) = term {
match literal.datatype() {
xsd::STRING | xsd::NORMALIZED_STRING | rdf::LANG_STRING | rdf::DIR_LANG_STRING => {
@@ -26,7 +27,7 @@ fn term_to_string(term: &Term) -> Option<&str> {
}
}
fn term_to_boolean(term: &Term) -> Option<bool> {
pub fn term_to_boolean(term: &Term) -> Option<bool> {
if let Term::Literal(literal) = term {
if literal.datatype() == xsd::BOOLEAN {
literal.value().parse().ok()
@@ -38,9 +39,9 @@ fn term_to_boolean(term: &Term) -> Option<bool> {
}
}
fn term_to_u64(term: &Term) -> Option<u64> {
pub fn term_to_u64(term: &Term) -> Option<u64> {
if let Term::Literal(literal) = term &&
literal.datatype() == xsd::NON_NEGATIVE_INTEGER {
(literal.datatype() == xsd::NON_NEGATIVE_INTEGER || literal.datatype() == xsd::INTEGER) {
let value: u64 = literal.value().parse().expect("Failed to parse u64 from ontology. It ought to be a non-negative integer.");
Some(value)
} else { None }
+10 -8
View File
@@ -4,7 +4,7 @@ use oxigraph::store::Store;
use crate::error;
use crate::rdf::vocab::owl;
pub fn same_as(store: Store) -> error::Result<Store> {
pub fn same_as(store: &mut Store) -> error::Result<()> {
let additional_quads = store
.quads_for_pattern(None, Some(owl::SAME_AS), None, None)
.filter_map(Result::ok)
@@ -42,11 +42,11 @@ pub fn same_as(store: Store) -> error::Result<Store> {
if new_size > old_size {
same_as(store)
} else {
Ok(store)
Ok(())
}
}
pub fn super_classes(dataset: &mut Dataset) {
pub fn super_classes(store: &mut Store) -> error::Result<()> {
let query = SparqlEvaluator::new()
.parse_query(
r#"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
@@ -61,7 +61,7 @@ CONSTRUCT {
.expect("Unable to parse superclass query");
let mut additional_quads = Dataset::new();
if let QueryResults::Graph(graph) = query.on_queryable_dataset(&*dataset).execute().unwrap()
if let QueryResults::Graph(graph) = query.on_store(&store).execute().unwrap()
{
additional_quads.extend(graph.filter_map(Result::ok).map(|triple| {
Quad::new(
@@ -73,12 +73,14 @@ CONSTRUCT {
}));
}
let old_size = dataset.len();
dataset.extend(&additional_quads);
let new_size = dataset.len();
let old_size = store.len()?;
store.extend(&additional_quads)?;
let new_size = store.len()?;
if new_size > old_size {
super_classes(dataset)
super_classes(store)
} else {
Ok(())
}
}
+4
View File
@@ -214,11 +214,15 @@ fedora:lastModifiedBy rdf:type owl:NamedIndividual ;
### http://www.w3.org/1999/02/22-rdf-syntax-ns#Property
rdf:Property rdf:type owl:NamedIndividual ;
:associatedProperty :comment ,
:label ;
:catalogId "0"^^xsd:nonNegativeInteger .
### http://www.w3.org/2000/01/rdf-schema#Class
rdfs:Class rdf:type owl:NamedIndividual ;
:associatedProperty :comment ,
:label ;
:catalogId "1"^^xsd:nonNegativeInteger .
+51 -52
View File
@@ -9,7 +9,8 @@ use std::fmt::Display;
use std::path::{Path, PathBuf};
use std::sync::LazyLock;
use oxigraph::store::Store;
use crate::rdf::materialize;
use tracing::{info, instrument};
use crate::rdf::{conversion, materialize};
static PREFIXES: LazyLock<BTreeMap<String, String>> = LazyLock::new(|| {
BTreeMap::from_iter([
@@ -57,7 +58,7 @@ impl OntologyBuilder {
}
pub fn build(self) -> error::Result<Ontology> {
let store = if let Some(path) = self.path {
let mut store = if let Some(path) = self.path {
Store::open(path)
} else {
Store::new()
@@ -68,41 +69,40 @@ impl OntologyBuilder {
.map(|(k, v)| (k.to_string(), v.to_string()))
.collect::<HashMap<String, String>>();
let store = materialize::same_as(store)?;
//materialize::super_classes(&mut dataset);
materialize::same_as(&mut store)?;
materialize::super_classes(&mut store)?;
store.optimize()?;
// Full-text search index field names
//let fields = Self::fields(&dataset);
let fields = Self::fields(&store)?;
/*let mut entities: HashMap<NamedNode, Entity> = HashMap::new();
let entity_iris = Self::subclass_of(&dataset, gl::ENTITY)
.chain(Self::subclass_of(&dataset, rda::ENTITY))
.chain([
rdf::PROPERTY.into_owned(),
rdfs::CLASS.into_owned(),
]);
for iri in entity_iris {
let subject = iri.as_ref().into();
let label = dataset.quads_for_pattern(Some(subject), Some(rdfs::LABEL), None, None)
.filter_map(|quad| term_to_string(&quad.object.into_owned()).map(String::from))
let mut entities: HashMap<NamedNode, Entity> = HashMap::new();
// All Entities have exactly one catalog ID.
for quad in store.quads_for_pattern(None, Some(gl::CATALOG_ID), None, None)
.filter_map(Result::ok) {
let label = store.quads_for_pattern(Some(quad.subject.as_ref().into()), Some(rdfs::LABEL), None, None)
.filter_map(Result::ok)
.filter_map(|quad| conversion::term_to_string(&quad.object).map(String::from))
.next();
let catalog_id = dataset.quads_for_pattern(Some(subject), Some(gl::CATALOG_ID), None, None)
.filter_map(|quad| term_to_u64(&quad.object.into_owned()))
let comment = store.quads_for_pattern(Some(quad.subject.as_ref().into()), Some(rdfs::COMMENT), None, None)
.filter_map(Result::ok)
.filter_map(|quad| conversion::term_to_string(&quad.object).map(String::from))
.next();
if let Some(catalog_id) = catalog_id {
if let Some(catalog_id) = conversion::term_to_u64(&quad.object) &&
let NamedOrBlankNode::NamedNode(subject) = quad.subject &&
let Some(label) = label {
let mut properties = HashSet::new();
for quad in dataset.quads_for_pattern(Some(subject), Some(gl::ASSOCIATED_PROPERTY), None, None) {
if let NamedOrBlankNodeRef::NamedNode(subject) = quad.subject
&& let TermRef::NamedNode(property) = quad.object {
properties.insert(property.into_owned());
for quad in store.quads_for_pattern(Some(subject.as_ref().into()), Some(gl::ASSOCIATED_PROPERTY), None, None)
.filter_map(Result::ok) {
if let Term::NamedNode(property) = quad.object {
properties.insert(property);
}
}
entities.insert(iri, Entity {
label: label.unwrap_or(catalog_id.to_string()),
entities.insert(subject, Entity {
label,
comment,
catalog_id,
properties,
});
@@ -110,28 +110,25 @@ impl OntologyBuilder {
}
let mut indexed_by = HashMap::new();
for quad in dataset.quads_for_pattern(None, Some(gl::INDEXED_BY_FIELD), None, None) {
if let NamedOrBlankNodeRef::NamedNode(subject) = quad.subject
&& let TermRef::NamedNode(field) = quad.object
for quad in store.quads_for_pattern(None, Some(gl::INDEXED_BY_FIELD), None, None)
.filter_map(Result::ok) {
if let NamedOrBlankNode::NamedNode(subject) = quad.subject
&& let Term::NamedNode(field) = quad.object
{
indexed_by.insert(subject.into_owned(), field.into_owned());
indexed_by.insert(subject, field);
}
}*/
}
Ok(Ontology {
store,
prefixes,
fields: HashMap::new(),
entities: HashMap::from_iter([(rdf::PROPERTY.into_owned(), Entity {
label: "property".to_string(),
catalog_id: 0,
properties: HashSet::new(),
})]),
indexed_by: HashMap::new(),
fields,
entities,
indexed_by,
})
}
/*fn fields(dataset: &Dataset) -> HashMap<NamedNode, IndexField> {
fn fields(store: &Store) -> error::Result<HashMap<NamedNode, IndexField>> {
let query = SparqlEvaluator::new()
.parse_query(
r#"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
@@ -147,13 +144,12 @@ SELECT DISTINCT ?subject ?name ?label {
.expect("Unable to parse field query");
let mut results = HashMap::new();
if let QueryResults::Solutions(solutions) =
query.on_queryable_dataset(dataset).execute().unwrap()
if let QueryResults::Solutions(solutions) = query.on_store(store).execute()?
{
for solution in solutions.filter_map(Result::ok) {
let subject = solution.get("subject").and_then(term_to_named_node);
let name = solution.get("name").and_then(term_to_string);
let label = solution.get("label").and_then(term_to_string);
let subject = solution.get("subject").and_then(conversion::term_to_named_node);
let name = solution.get("name").and_then(conversion::term_to_string);
let label = solution.get("label").and_then(conversion::term_to_string);
if let Some(subject) = subject && let Some(name) = name {
let field = IndexField {
@@ -164,10 +160,10 @@ SELECT DISTINCT ?subject ?name ?label {
}
}
}
results
Ok(results)
}
fn subclass_of(dataset: &Dataset, class: NamedNodeRef<'_>) -> impl Iterator<Item = NamedNode> {
/*fn subclass_of(dataset: &Dataset, class: NamedNodeRef<'_>) -> impl Iterator<Item = NamedNode> {
let query = SparqlEvaluator::new()
.parse_query(
format!(
@@ -200,6 +196,7 @@ SELECT ?class {{
pub struct LabeledIri {
pub iri: NamedNode,
pub label: String,
pub comment: Option<String>,
}
impl PartialEq for LabeledIri {
@@ -225,6 +222,7 @@ pub struct IriInformation {
#[derive(Clone, Debug)]
pub struct Entity {
pub label: String,
pub comment: Option<String>,
pub catalog_id: u64,
pub properties: HashSet<NamedNode>,
}
@@ -263,11 +261,6 @@ impl Ontology {
&*PREFIXES
}
/*pub fn info(&self, node: NamedNodeRef<'_>) -> Option<&IriInformation> {
let node = node.into_owned();
self.iri_info.get(&node)
}*/
pub fn abbreviate(&self, node: NamedNodeRef<'_>) -> String {
for (prefix_name, prefix_iri) in &self.prefixes {
if let Some(local_name) = node.as_str().strip_prefix(prefix_iri) {
@@ -314,6 +307,7 @@ impl Ontology {
.map(|entity| LabeledIri {
iri: class.to_owned(),
label: entity.label.to_owned(),
comment: entity.comment.to_owned(),
})
}
@@ -322,9 +316,14 @@ impl Ontology {
.map(|(iri, entity)| LabeledIri {
iri: iri.to_owned(),
label: entity.label.to_owned(),
comment: entity.comment.to_owned(),
})
}
pub fn entities(&self) -> impl Iterator<Item = (&NamedNode, &Entity)> {
self.entities.iter()
}
pub fn datatypes(&self) -> impl Iterator<Item = NamedNode> {
self.store
.quads_for_pattern(
-3
View File
@@ -11,7 +11,4 @@ pub enum SearchError {
#[error(transparent)]
OpenDirectoryError(#[from] tantivy::directory::error::OpenDirectoryError),
#[error("Path to index not specified")]
IndexPathNotSpecified,
}
+27 -26
View File
@@ -21,37 +21,38 @@ impl SearchIndexBuilder {
}
pub fn build(self) -> error::Result<SearchIndex> {
if let Some(path) = self.path {
let ngram_32 = NgramTokenizer::new(1, 32, false)?;
let ngram_32_lowercase = TextAnalyzer::builder(ngram_32)
.filter(LowerCaser)
.build();
let ngram_32 = NgramTokenizer::new(1, 32, false)?;
let ngram_32_lowercase = TextAnalyzer::builder(ngram_32)
.filter(LowerCaser)
.build();
let tokenizer_manager = TokenizerManager::default();
tokenizer_manager.register("ngram_32", ngram_32_lowercase);
let tokenizer_manager = TokenizerManager::default();
tokenizer_manager.register("ngram_32", ngram_32_lowercase);
let builder = Index::builder()
.schema(Schema::schema().clone())
.tokenizers(tokenizer_manager);
let index = if let Some(path) = self.path {
let mmap_directory = MmapDirectory::open(path)?;
let managed_directory = ManagedDirectory::wrap(Box::new(mmap_directory))?;
let index = Index::builder()
.schema(Schema::schema().clone())
.tokenizers(tokenizer_manager)
.open_or_create(managed_directory)?;
let reader = index
.reader_builder()
.reload_policy(ReloadPolicy::OnCommitWithDelay)
.try_into()?;
let writer = index.writer(50_000_000)?;
Ok(SearchIndex {
index,
reader,
writer,
})
builder.open_or_create(managed_directory)?
} else {
Err(SearchError::IndexPathNotSpecified)
}
builder.create_in_ram()?
};
let reader = index
.reader_builder()
.reload_policy(ReloadPolicy::OnCommitWithDelay)
.try_into()?;
let writer = index.writer(50_000_000)?;
Ok(SearchIndex {
index,
reader,
writer,
})
}
}