#![allow(unused_variables)]
use std::collections::HashMap;
use interstellar::p;
use interstellar::storage::Graph;
use interstellar::traversal::__;
use interstellar::value::{Value, VertexId};
use crate::common::graphs::create_small_graph;
#[test]
fn has_where_eq_filters_by_property_value() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("age", p::eq(30)).to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.alice));
}
#[test]
fn has_where_neq_filters_out_property_value() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_label("person")
.has_where("age", p::neq(30))
.to_list();
assert_eq!(results.len(), 2);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.bob));
assert!(ids.contains(&tg.charlie));
assert!(!ids.contains(&tg.alice));
}
#[test]
fn has_where_gte_filters_correctly() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("age", p::gte(30)).to_list();
assert_eq!(results.len(), 2);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.alice));
assert!(ids.contains(&tg.charlie));
}
#[test]
fn has_where_gt_filters_correctly() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("age", p::gt(30)).to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.charlie));
}
#[test]
fn has_where_lt_filters_correctly() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("age", p::lt(30)).to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.bob));
}
#[test]
fn has_where_lte_filters_correctly() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("age", p::lte(30)).to_list();
assert_eq!(results.len(), 2);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.alice));
assert!(ids.contains(&tg.bob));
}
#[test]
fn has_where_cross_type_comparison() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("age", p::gte(29.5f64)).to_list();
assert_eq!(results.len(), 2);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.alice));
assert!(ids.contains(&tg.charlie));
}
#[test]
fn has_where_missing_property_filters_out() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("age", p::gte(0)).to_list();
assert_eq!(results.len(), 3);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(!ids.contains(&tg.graphdb));
}
#[test]
fn has_where_between_filters_range() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("age", p::between(25, 35)).to_list();
assert_eq!(results.len(), 2);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.alice));
assert!(ids.contains(&tg.bob));
assert!(!ids.contains(&tg.charlie));
}
#[test]
fn has_where_between_inclusive_start() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("age", p::between(30, 40)).to_list();
assert_eq!(results.len(), 2);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.alice));
assert!(ids.contains(&tg.charlie));
}
#[test]
fn has_where_between_exclusive_end() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("age", p::between(20, 30)).to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.bob));
}
#[test]
fn has_where_inside_filters_exclusive() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("age", p::inside(25, 35)).to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.alice));
}
#[test]
fn has_where_inside_excludes_boundaries() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("age", p::inside(29, 31)).to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.alice));
}
#[test]
fn has_where_outside_filters_outside_range() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("age", p::outside(26, 34)).to_list();
assert_eq!(results.len(), 2);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.bob));
assert!(ids.contains(&tg.charlie));
assert!(!ids.contains(&tg.alice));
}
#[test]
fn has_where_outside_boundaries_not_outside() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("age", p::outside(25, 35)).to_list();
assert!(results.is_empty());
}
#[test]
fn has_where_starting_with_filters_strings() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("name", p::starting_with("A")).to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.alice));
}
#[test]
fn has_where_starting_with_multiple_matches() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("name", p::starting_with("B")).to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.bob));
}
#[test]
fn has_where_ending_with_filters_strings() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("name", p::ending_with("e")).to_list();
assert_eq!(results.len(), 2);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.alice));
assert!(ids.contains(&tg.charlie));
}
#[test]
fn has_where_ending_with_no_matches() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("name", p::ending_with("z")).to_list();
assert!(results.is_empty());
}
#[test]
fn has_where_containing_filters_strings() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("name", p::containing("li")).to_list();
assert_eq!(results.len(), 2);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.alice));
assert!(ids.contains(&tg.charlie));
}
#[test]
fn has_where_containing_single_match() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("name", p::containing("ob")).to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.bob));
}
#[test]
fn has_where_string_predicate_on_non_string_property_fails() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("age", p::containing("3")).to_list();
assert!(results.is_empty());
}
#[test]
fn has_where_regex_filters_strings() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("name", p::regex("^[AB].*")).to_list();
assert_eq!(results.len(), 2);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.alice));
assert!(ids.contains(&tg.bob));
}
#[test]
fn has_where_regex_exact_match() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("name", p::regex("^Bob$")).to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.bob));
}
#[test]
fn has_where_and_composed_predicate() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_where("age", p::and(p::gte(25), p::lte(30)))
.to_list();
assert_eq!(results.len(), 2);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.alice));
assert!(ids.contains(&tg.bob));
}
#[test]
fn has_where_or_composed_predicate() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_where("age", p::or(p::eq(25), p::eq(35)))
.to_list();
assert_eq!(results.len(), 2);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.bob));
assert!(ids.contains(&tg.charlie));
}
#[test]
fn has_where_not_composed_predicate() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_label("person")
.has_where("age", p::not(p::eq(30)))
.to_list();
assert_eq!(results.len(), 2);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.bob));
assert!(ids.contains(&tg.charlie));
}
#[test]
fn has_where_complex_nested_predicate() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_where("age", p::or(p::and(p::gte(30), p::lt(35)), p::eq(25)))
.to_list();
assert_eq!(results.len(), 2);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.alice));
assert!(ids.contains(&tg.bob));
}
#[test]
fn has_where_and_with_string_predicates() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_where("name", p::and(p::starting_with("A"), p::containing("lic")))
.to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.alice));
}
#[test]
fn has_where_or_with_string_predicates() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_where("name", p::or(p::ending_with("b"), p::containing("arl")))
.to_list();
assert_eq!(results.len(), 2);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.bob));
assert!(ids.contains(&tg.charlie));
}
#[test]
fn has_where_not_with_between() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_label("person")
.has_where("age", p::not(p::between(26, 35)))
.to_list();
assert_eq!(results.len(), 2);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.bob));
assert!(ids.contains(&tg.charlie));
}
#[test]
fn has_where_within_filters_by_set_membership() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().has_where("age", p::within([25i64, 35i64])).to_list();
assert_eq!(results.len(), 2);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.bob));
assert!(ids.contains(&tg.charlie));
}
#[test]
fn has_where_without_filters_by_exclusion() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_label("person")
.has_where("age", p::without([25i64, 35i64]))
.to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.alice));
}
#[test]
fn has_where_within_with_strings() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_where("name", p::within(["Alice", "Charlie"]))
.to_list();
assert_eq!(results.len(), 2);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.alice));
assert!(ids.contains(&tg.charlie));
}
#[test]
fn has_where_on_edges() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.e()
.has_label("knows")
.has_where("since", p::gte(2020))
.to_list();
assert_eq!(results.len(), 2); }
#[test]
fn has_where_on_edge_with_range() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.e()
.has_label("knows")
.has_where("since", p::between(2019, 2021))
.to_list();
assert_eq!(results.len(), 2); }
#[test]
fn has_where_chained_with_navigation() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice])
.out()
.has_where("age", p::gt(30))
.to_list();
assert!(results.is_empty());
}
#[test]
fn has_where_in_where_step() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().where_(__.out().has_where("age", p::lt(30))).to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.alice));
}
#[test]
fn has_where_in_union_branches() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice])
.union(vec![
__.out().has_where("age", p::lt(30)), __.out().has_where("name", p::starting_with("G")), ])
.to_list();
assert_eq!(results.len(), 2);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.bob));
assert!(ids.contains(&tg.graphdb));
}
struct SpecTestGraph {
graph: Graph,
alice: VertexId,
bob: VertexId,
#[allow(dead_code)]
carol: VertexId,
#[allow(dead_code)]
acme: VertexId,
}
fn create_spec_test_graph() -> SpecTestGraph {
let graph = Graph::new();
let alice = graph.add_vertex("person", {
let mut props = HashMap::new();
props.insert("name".to_string(), Value::String("Alice".to_string()));
props.insert("age".to_string(), Value::Int(30));
props
});
let bob = graph.add_vertex("person", {
let mut props = HashMap::new();
props.insert("name".to_string(), Value::String("Bob".to_string()));
props.insert("age".to_string(), Value::Int(35));
props
});
let carol = graph.add_vertex("person", {
let mut props = HashMap::new();
props.insert("name".to_string(), Value::String("Carol".to_string()));
props.insert("age".to_string(), Value::Int(25));
props
});
let acme = graph.add_vertex("company", {
let mut props = HashMap::new();
props.insert("name".to_string(), Value::String("Acme Corp".to_string()));
props
});
graph.add_edge(alice, bob, "knows", HashMap::new()).unwrap();
graph
.add_edge(alice, carol, "knows", HashMap::new())
.unwrap();
graph.add_edge(bob, carol, "knows", HashMap::new()).unwrap();
graph
.add_edge(alice, acme, "works_at", HashMap::new())
.unwrap();
graph
.add_edge(bob, acme, "works_at", HashMap::new())
.unwrap();
SpecTestGraph {
graph,
alice,
bob,
carol,
acme,
}
}
#[test]
fn has_where_spec_graph_integration() {
let tg = create_spec_test_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_where("age", p::gte(18))
.where_(__.out_labels(&["works_at"]))
.to_list();
assert_eq!(results.len(), 2);
let ids: Vec<VertexId> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.alice));
assert!(ids.contains(&tg.bob));
}