use anyhow::Result;
use uni_db::Uni;
#[tokio::test]
async fn test_pattern_two_nodes_vlp_undirected() -> Result<()> {
let db = Uni::in_memory().build().await?;
let tx = db.session().tx().await?;
tx.execute(
r#"
CREATE (a:A)-[:REL1]->(b:B), (b)-[:REL2]->(a), (a)-[:REL3]->(:C), (a)-[:REL1]->(:D)
"#,
)
.await?;
tx.commit().await?;
let results = db
.session()
.query(
r#"
MATCH (n), (m) WHERE (n)-[:REL1*2]-(m) RETURN n, m
"#,
)
.await?;
println!("Results: {:#?}", results);
println!("Row count: {}", results.len());
assert_eq!(results.len(), 2, "Expected 2 results");
Ok(())
}
#[tokio::test]
async fn test_pattern_two_nodes_simple() -> Result<()> {
let db = Uni::in_memory().build().await?;
let tx = db.session().tx().await?;
tx.execute(
r#"
CREATE (a:A)-[:REL]->(b:B)
"#,
)
.await?;
tx.commit().await?;
let cartesian = db.session().query("MATCH (n), (m) RETURN n, m").await?;
println!("Cartesian product rows: {}", cartesian.len());
for (i, row) in cartesian.iter().enumerate() {
println!(" Row {}: {:?}", i, row);
}
let results = db
.session()
.query(
r#"
MATCH (n), (m) WHERE (n)-[:REL]->(m) RETURN n, m
"#,
)
.await?;
println!("Filtered results: {:#?}", results);
println!("Filtered row count: {}", results.len());
assert_eq!(results.len(), 1, "Expected 1 result");
Ok(())
}
#[tokio::test]
async fn test_pattern_two_nodes_directed() -> Result<()> {
let db = Uni::in_memory().build().await?;
let tx = db.session().tx().await?;
tx.execute("CREATE (a:A)-[:REL]->(b:B)").await?;
tx.commit().await?;
let results = db
.session()
.query("MATCH (n), (m) WHERE (n)-[:REL]->(m) RETURN n, m")
.await?;
assert_eq!(results.len(), 1, "Expected 1 result for directed edge");
Ok(())
}
#[tokio::test]
async fn test_pattern_two_nodes_undirected() -> Result<()> {
let db = Uni::in_memory().build().await?;
let tx = db.session().tx().await?;
tx.execute("CREATE (a:A)-[:REL]->(b:B)").await?;
tx.commit().await?;
let results = db
.session()
.query("MATCH (n), (m) WHERE (n)-[:REL]-(m) RETURN n, m")
.await?;
assert_eq!(results.len(), 2, "Expected 2 results for undirected edge");
Ok(())
}
#[tokio::test]
async fn test_pattern_two_nodes_typed_undirected() -> Result<()> {
let db = Uni::in_memory().build().await?;
let tx = db.session().tx().await?;
tx.execute("CREATE (a:A)-[:REL]->(b:B), (a)-[:OTHER]->(c:C)")
.await?;
tx.commit().await?;
let results = db
.session()
.query("MATCH (n), (m) WHERE (n)-[:REL]-(m) RETURN n, m")
.await?;
assert_eq!(results.len(), 2, "Expected 2 results for typed undirected");
Ok(())
}
#[tokio::test]
async fn test_pattern_two_nodes_vlp_directed() -> Result<()> {
let db = Uni::in_memory().build().await?;
let tx = db.session().tx().await?;
tx.execute("CREATE (a:A)-[:REL]->(b:B)-[:REL]->(c:C)")
.await?;
tx.commit().await?;
let results = db
.session()
.query("MATCH (n), (m) WHERE (n)-[:REL*1..2]->(m) RETURN n, m")
.await?;
assert_eq!(results.len(), 3, "Expected 3 results for VLP directed");
Ok(())
}
#[tokio::test]
async fn test_pattern_two_nodes_vlp_undirected_single() -> Result<()> {
let db = Uni::in_memory().build().await?;
let tx = db.session().tx().await?;
tx.execute("CREATE (a:A)-[:REL]->(b:B)").await?;
tx.commit().await?;
let results = db
.session()
.query("MATCH (n), (m) WHERE (n)-[:REL*1..2]-(m) RETURN n, m")
.await?;
assert_eq!(
results.len(),
2,
"Expected 2 results for VLP undirected single edge"
);
Ok(())
}
#[tokio::test]
async fn test_pattern_two_nodes_no_match() -> Result<()> {
let db = Uni::in_memory().build().await?;
let tx = db.session().tx().await?;
tx.execute("CREATE (a:A), (b:B)").await?;
tx.commit().await?;
let results = db
.session()
.query("MATCH (n), (m) WHERE (n)-[:NONEXISTENT]->(m) RETURN n, m")
.await?;
assert_eq!(results.len(), 0, "Expected 0 results for non-existent edge");
Ok(())
}
#[tokio::test]
async fn test_pattern_two_nodes_self_loop() -> Result<()> {
let db = Uni::in_memory().build().await?;
let tx = db.session().tx().await?;
tx.execute("CREATE (a:A)-[:REL]->(a), (a)-[:REL]->(b:B)")
.await?;
tx.commit().await?;
let results = db
.session()
.query("MATCH (n), (m) WHERE (n)-[:REL]->(m) RETURN n, m")
.await?;
assert_eq!(results.len(), 2, "Expected 2 results including self-loop");
Ok(())
}
#[tokio::test]
async fn test_pattern_two_nodes_vlp_multiple_types() -> Result<()> {
let db = Uni::in_memory().build().await?;
let tx = db.session().tx().await?;
tx.execute("CREATE (a:A)-[:REL1]->(b:B), (a)-[:REL2]->(c:C)")
.await?;
tx.commit().await?;
let results = db
.session()
.query("MATCH (n), (m) WHERE (n)-[:REL1*1..1]->(m) RETURN n, m")
.await?;
assert_eq!(
results.len(),
1,
"Expected 1 result for VLP with type filter"
);
Ok(())
}