Skip to content

Commit ab34649

Browse files
committed
ref composite filter and add search api tests
1 parent 286d766 commit ab34649

File tree

5 files changed

+1192
-1029
lines changed

5 files changed

+1192
-1029
lines changed

raphtory/src/core/utils/errors.rs

+10-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ use std::{fmt::Debug, io, path::PathBuf, time::SystemTimeError};
1616
use tantivy;
1717
#[cfg(feature = "search")]
1818
use tantivy::query::QueryParserError;
19-
use crate::db::graph::views::property_filter::ComparisonOperator;
19+
use tracing::error;
20+
use crate::db::graph::views::property_filter::FilterOperator;
2021

2122
#[derive(thiserror::Error, Debug)]
2223
pub enum InvalidPathReason {
@@ -296,13 +297,19 @@ pub enum GraphError {
296297
LockError,
297298

298299
#[error("Operator {0} requires a property value, but none was provided.")]
299-
InvalidFilter(ComparisonOperator),
300+
InvalidFilter(FilterOperator),
300301

301302
#[error("Property {0} not found in temporal or constant metadata")]
302303
PropertyNotFound(String),
303304

304305
#[error("PropertyIndex not found for property {0}")]
305-
PropertyIndexNotFound(String)
306+
PropertyIndexNotFound(String),
307+
308+
#[error("Tokenization is support only for str field type")]
309+
UnsupportedFieldTypeForTokenization,
310+
311+
#[error("Not tokens found")]
312+
NoTokensFound,
306313
}
307314

308315
impl GraphError {

raphtory/src/db/api/view/graph.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ use std::{
4444
borrow::Borrow,
4545
sync::{atomic::Ordering, Arc},
4646
};
47-
use crate::db::graph::views::property_filter::CompositeFilter;
47+
use crate::db::graph::views::property_filter::CompositeNodeFilter;
4848
use crate::prelude::PropertyFilter;
4949

5050
/// This trait GraphViewOps defines operations for accessing
@@ -136,7 +136,7 @@ pub trait SearchableGraphOps: Sized {
136136
fn search_nodes(
137137
&self,
138138
// q: &str,
139-
filter: &CompositeFilter,
139+
filter: &CompositeNodeFilter,
140140
limit: usize,
141141
offset: usize,
142142
) -> Result<Vec<NodeView<Self>>, GraphError>;
@@ -626,7 +626,7 @@ impl<G: BoxableGraphView + Sized + Clone + 'static> SearchableGraphOps for G {
626626
fn search_nodes(
627627
&self,
628628
// q: &str,
629-
filter: &CompositeFilter,
629+
filter: &CompositeNodeFilter,
630630
limit: usize,
631631
offset: usize,
632632
) -> Result<Vec<NodeView<Self>>, GraphError> {

raphtory/src/db/graph/views/property_filter/mod.rs

+22-22
Original file line numberDiff line numberDiff line change
@@ -329,27 +329,27 @@ impl NodeFilter {
329329
}
330330

331331
#[derive(Debug, Clone)]
332-
pub enum CompositeFilter {
333-
SingleNode(NodeFilter),
334-
SingleProperty(PropertyFilter),
335-
And(Vec<CompositeFilter>),
336-
Or(Vec<CompositeFilter>),
332+
pub enum CompositeNodeFilter {
333+
Node(NodeFilter),
334+
Property(PropertyFilter),
335+
And(Vec<CompositeNodeFilter>),
336+
Or(Vec<CompositeNodeFilter>),
337337
}
338338

339-
impl fmt::Display for CompositeFilter {
339+
impl fmt::Display for CompositeNodeFilter {
340340
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
341341
match self {
342-
CompositeFilter::SingleProperty(filter) => write!(f, "{}", filter),
343-
CompositeFilter::SingleNode(filter) => write!(f, "{}", filter),
344-
CompositeFilter::And(filters) => {
342+
CompositeNodeFilter::Property(filter) => write!(f, "{}", filter),
343+
CompositeNodeFilter::Node(filter) => write!(f, "{}", filter),
344+
CompositeNodeFilter::And(filters) => {
345345
let formatted = filters
346346
.iter()
347347
.map(|filter| format!("({})", filter))
348348
.collect::<Vec<String>>()
349349
.join(" AND ");
350350
write!(f, "{}", formatted)
351351
}
352-
CompositeFilter::Or(filters) => {
352+
CompositeNodeFilter::Or(filters) => {
353353
let formatted = filters
354354
.iter()
355355
.map(|filter| format!("({})", filter))
@@ -364,34 +364,34 @@ impl fmt::Display for CompositeFilter {
364364
#[cfg(test)]
365365
mod test_filters {
366366
use crate::{
367-
db::graph::views::property_filter::{CompositeFilter, NodeFilter},
367+
db::graph::views::property_filter::{CompositeNodeFilter, NodeFilter},
368368
prelude::PropertyFilter,
369369
};
370370

371371
#[test]
372372
fn test_composite_filter() {
373373
assert_eq!(
374374
"p2 == 2",
375-
CompositeFilter::SingleProperty(PropertyFilter::eq("p2", 2u64)).to_string()
375+
CompositeNodeFilter::Property(PropertyFilter::eq("p2", 2u64)).to_string()
376376
);
377377

378378
assert_eq!(
379379
"((node_type NOT IN [fire_nation, water_tribe]) AND (p2 == 2) AND (p1 == 1) AND ((p3 <= 5) OR (p4 <= 1))) OR (node_name == pometry) OR (p5 == 9)",
380-
CompositeFilter::Or(vec![
381-
CompositeFilter::And(vec![
382-
CompositeFilter::SingleNode(NodeFilter::not_any(
380+
CompositeNodeFilter::Or(vec![
381+
CompositeNodeFilter::And(vec![
382+
CompositeNodeFilter::Node(NodeFilter::not_any(
383383
"node_type",
384384
vec!["fire_nation".into(), "water_tribe".into()]
385385
)),
386-
CompositeFilter::SingleProperty(PropertyFilter::eq("p2", 2u64)),
387-
CompositeFilter::SingleProperty(PropertyFilter::eq("p1", 1u64)),
388-
CompositeFilter::Or(vec![
389-
CompositeFilter::SingleProperty(PropertyFilter::le("p3", 5u64)),
390-
CompositeFilter::SingleProperty(PropertyFilter::le("p4", 1u64))
386+
CompositeNodeFilter::Property(PropertyFilter::eq("p2", 2u64)),
387+
CompositeNodeFilter::Property(PropertyFilter::eq("p1", 1u64)),
388+
CompositeNodeFilter::Or(vec![
389+
CompositeNodeFilter::Property(PropertyFilter::le("p3", 5u64)),
390+
CompositeNodeFilter::Property(PropertyFilter::le("p4", 1u64))
391391
]),
392392
]),
393-
CompositeFilter::SingleNode(NodeFilter::eq("node_name", "pometry")),
394-
CompositeFilter::SingleProperty(PropertyFilter::eq("p5", 9u64)),
393+
CompositeNodeFilter::Node(NodeFilter::eq("node_name", "pometry")),
394+
CompositeNodeFilter::Property(PropertyFilter::eq("p5", 9u64)),
395395
])
396396
.to_string()
397397
);

raphtory/src/search/query_executor.rs

+10-13
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::{
44
api::view::StaticGraphViewOps,
55
graph::{
66
node::NodeView,
7-
views::property_filter::{CompositeFilter, NodeFilter},
7+
views::property_filter::{CompositeNodeFilter, NodeFilter},
88
},
99
},
1010
prelude::{GraphViewOps, NodePropertyFilterOps, NodeViewOps, PropertyFilter, ResetFilter},
@@ -15,7 +15,7 @@ use raphtory_api::core::entities::VID;
1515
use std::{collections::HashSet, sync::Arc};
1616
use tantivy::{
1717
collector::{FilterCollector, TopDocs},
18-
query::{Query},
18+
query::Query,
1919
schema::{Field, Value},
2020
DocAddress, Document, Index, IndexReader, Score, Searcher, TantivyDocument,
2121
};
@@ -136,11 +136,11 @@ impl<'a> QueryExecutor<'a> {
136136
limit,
137137
offset,
138138
)?
139-
},
139+
}
140140
None => {
141141
println!("I was here");
142142
vec![]
143-
},
143+
}
144144
};
145145

146146
let unique_results: HashSet<_> = results.into_iter().collect();
@@ -157,18 +157,18 @@ impl<'a> QueryExecutor<'a> {
157157
pub fn execute<G: StaticGraphViewOps>(
158158
&self,
159159
graph: &G,
160-
filter: &CompositeFilter,
160+
filter: &CompositeNodeFilter,
161161
limit: usize,
162162
offset: usize,
163163
) -> Result<HashSet<NodeView<G, G>>, GraphError> {
164164
match filter {
165-
CompositeFilter::SingleProperty(filter) => {
165+
CompositeNodeFilter::Property(filter) => {
166166
self.execute_property_filter(graph, filter, limit, offset)
167167
}
168-
CompositeFilter::SingleNode(filter) => {
168+
CompositeNodeFilter::Node(filter) => {
169169
self.execute_node_filter(graph, filter, limit, offset)
170170
}
171-
CompositeFilter::And(filters) => {
171+
CompositeNodeFilter::And(filters) => {
172172
let mut results = None;
173173

174174
for sub_filter in filters {
@@ -182,7 +182,7 @@ impl<'a> QueryExecutor<'a> {
182182

183183
Ok(results.unwrap_or_default())
184184
}
185-
CompositeFilter::Or(filters) => {
185+
CompositeNodeFilter::Or(filters) => {
186186
let mut results = HashSet::new();
187187

188188
for sub_filter in filters {
@@ -248,10 +248,7 @@ impl<'a> QueryExecutor<'a> {
248248
fn print_schema_fields(schema: &tantivy::schema::Schema) {
249249
println!("Schema fields and their IDs:");
250250
for (field_name, field_entry) in schema.fields() {
251-
println!(
252-
"Field Name: '{:?}'",
253-
field_name,
254-
);
251+
println!("Field Name: '{:?}'", field_name,);
255252
}
256253
}
257254

0 commit comments

Comments
 (0)