From d9cc5b55e0e30cedda66784cfb322e01be367d67 Mon Sep 17 00:00:00 2001 From: Haaroon Yousaf Date: Thu, 20 Apr 2023 10:38:47 +0100 Subject: [PATCH 1/5] dont use pointer in loader --- docbrown/src/graph_loader/lotr_graph.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docbrown/src/graph_loader/lotr_graph.rs b/docbrown/src/graph_loader/lotr_graph.rs index a7c2b294..044696b4 100644 --- a/docbrown/src/graph_loader/lotr_graph.rs +++ b/docbrown/src/graph_loader/lotr_graph.rs @@ -64,8 +64,8 @@ pub fn lotr_graph(shards: usize) -> Graph { CsvLoader::new(lotr_file().unwrap()) .load_into_graph(&g, |lotr: Lotr, g: &Graph| { - let src_id = &lotr.src_id; - let dst_id = &lotr.dst_id; + let src_id = lotr.src_id; + let dst_id = lotr.dst_id; let time = lotr.time; g.add_vertex(time, src_id.clone(), &vec![]) From c701c18b487a4ae696c2d9385740c7a4b9f9a87a Mon Sep 17 00:00:00 2001 From: Haaroon Yousaf Date: Thu, 20 Apr 2023 18:01:34 +0100 Subject: [PATCH 2/5] some extra code coverages --- docbrown/src/core/misc.rs | 33 ---------- docbrown/src/graph_loader/mod.rs | 17 +++++- .../src/graph_loader/reddit_hyperlinks.rs | 60 ++++++++++++------- 3 files changed, 54 insertions(+), 56 deletions(-) delete mode 100644 docbrown/src/core/misc.rs diff --git a/docbrown/src/core/misc.rs b/docbrown/src/core/misc.rs deleted file mode 100644 index befecc07..00000000 --- a/docbrown/src/core/misc.rs +++ /dev/null @@ -1,33 +0,0 @@ -pub trait MinMax { - fn min() -> A; - fn max() -> A; - fn one() -> A; -} - -impl MinMax for u64 { - fn min() -> u64 { - u64::MIN - } - - fn max() -> u64 { - u64::MAX - } - - fn one() -> u64 { - 1 - } -} - -impl MinMax for i32 { - fn min() -> i32 { - i32::MIN - } - - fn max() -> i32 { - i32::MAX - } - - fn one() -> i32 { - 1 - } -} diff --git a/docbrown/src/graph_loader/mod.rs b/docbrown/src/graph_loader/mod.rs index 0a205f61..39d130bd 100644 --- a/docbrown/src/graph_loader/mod.rs +++ b/docbrown/src/graph_loader/mod.rs @@ -20,7 +20,7 @@ use std::env; use std::fs::File; -use std::io::{copy, Cursor}; +use std::io::{copy, Cursor, Read}; use std::path::PathBuf; use std::time::Duration; @@ -48,3 +48,18 @@ pub fn fetch_file( } Ok(filepath) } + +#[cfg(test)] +mod graph_loader_test { + use crate::graph_loader::fetch_file; + + #[test] + fn test_fetch_file() { + let path = fetch_file( + "lotr2.csv", + "https://raw.githubusercontent.com/Raphtory/Data/main/lotr_test.csv", + 600, + ); + assert!(path.is_ok()); + } +} diff --git a/docbrown/src/graph_loader/reddit_hyperlinks.rs b/docbrown/src/graph_loader/reddit_hyperlinks.rs index ffc66696..22cff3ec 100644 --- a/docbrown/src/graph_loader/reddit_hyperlinks.rs +++ b/docbrown/src/graph_loader/reddit_hyperlinks.rs @@ -33,7 +33,7 @@ //! use docbrown::db::graph::Graph; //! use docbrown::db::view_api::*; //! -//! let graph = reddit_graph(1, 120); +//! let graph = reddit_graph(1, 120, false); //! //! println!("The graph has {:?} vertices", graph.num_vertices()); //! println!("The graph has {:?} edges", graph.num_edges()); @@ -53,12 +53,22 @@ use std::path::PathBuf; /// * `timeout` - The timeout in seconds for downloading the dataset /// # Returns /// * `PathBuf` - The path to the file -pub fn reddit_file(timeout: u64) -> Result> { - fetch_file( - "reddit-title.tsv", - "http://snap.stanford.edu/data/soc-redditHyperlinks-title.tsv", - timeout, - ) +pub fn reddit_file( + timeout: u64, + test_file: Option, +) -> Result> { + match test_file { + Some(true) => fetch_file( + "reddit-title-test.tsv", + "https://raw.githubusercontent.com/Raphtory/Data/main/reddit-title-test.tsv", + timeout, + ), + _ => fetch_file( + "reddit-title.tsv", + "http://snap.stanford.edu/data/soc-redditHyperlinks-title.tsv", + timeout, + ), + } } /// Read the file line by line @@ -80,11 +90,11 @@ where /// # Returns /// /// * `Graph` - The graph containing the Reddit hyperlinks dataset -pub fn reddit_graph(shards: usize, timeout: u64) -> Graph { +pub fn reddit_graph(shards: usize, timeout: u64, test_file: bool) -> Graph { let graph = { let g = Graph::new(shards); - if let Ok(path) = reddit_file(timeout) { + if let Ok(path) = reddit_file(timeout, Some(test_file)) { if let Ok(lines) = read_lines(path.as_path()) { // Consumes the iterator, returns an (Optional) String for reddit in lines.dropping(1).flatten() { @@ -142,16 +152,22 @@ pub fn reddit_graph(shards: usize, timeout: u64) -> Graph { }; graph } -// #[cfg(test)] -// mod reddit_test { -// use crate::graph_loader::reddit_hyperlinks::reddit_graph; -// use crate::db::view_api::GraphViewOps; -// -// #[test] -// fn check_data() { -// if let Ok(g) = reddit_graph(1, 600) { -// println!("{} {}",g.num_vertices(),g.num_edges()); -// }; -// } -// } -// + +#[cfg(test)] +mod reddit_test { + use crate::db::view_api::GraphViewOps; + use crate::graph_loader::reddit_hyperlinks::{reddit_file, reddit_graph}; + + #[test] + fn check_data() { + let file = reddit_file(100, Some(true)); + assert!(file.is_ok()); + } + + #[test] + fn check_graph() { + let graph = reddit_graph(1, 100, true); + assert_eq!(graph.num_vertices(), 16); + assert_eq!(graph.num_edges(), 9); + } +} From 2d0856eece8785c7210fa6de68457a10666ee783 Mon Sep 17 00:00:00 2001 From: Haaroon Yousaf Date: Thu, 20 Apr 2023 18:08:29 +0100 Subject: [PATCH 3/5] fix missing module, display tests --- docbrown/src/core/mod.rs | 1 - docbrown/src/db/graph.rs | 27 +++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/docbrown/src/core/mod.rs b/docbrown/src/core/mod.rs index 9f175ae8..c0560ed3 100644 --- a/docbrown/src/core/mod.rs +++ b/docbrown/src/core/mod.rs @@ -36,7 +36,6 @@ mod bitset; mod edge_layer; mod lazy_vec; pub mod lsm; -mod misc; mod props; mod sorted_vec_map; pub mod state; diff --git a/docbrown/src/db/graph.rs b/docbrown/src/db/graph.rs index 15c573ef..f2a2166e 100644 --- a/docbrown/src/db/graph.rs +++ b/docbrown/src/db/graph.rs @@ -1897,4 +1897,31 @@ mod db_tests { assert_eq!(windowed_times_of_farquaad, [4, 6, 7]); assert_eq!(windowed_times_of_two, [5, 6, 7]); } + + #[test] + fn test_prop_display_str() { + let mut prop = Prop::Str(String::from("hello")); + assert_eq!(format!("{}", prop), "hello"); + + prop = Prop::I32(42); + assert_eq!(format!("{}", prop), "42"); + + prop = Prop::I64(9223372036854775807); + assert_eq!(format!("{}", prop), "9223372036854775807"); + + prop = Prop::U32(4294967295); + assert_eq!(format!("{}", prop), "4294967295"); + + prop = Prop::U64(18446744073709551615); + assert_eq!(format!("{}", prop), "18446744073709551615"); + + prop = Prop::F32(3.14159); + assert_eq!(format!("{}", prop), "3.14159"); + + prop = Prop::F64(3.141592653589793); + assert_eq!(format!("{}", prop), "3.141592653589793"); + + prop = Prop::Bool(true); + assert_eq!(format!("{}", prop), "true"); + } } From df08664d4973a90b0d65df55c6c3ea0943508c4f Mon Sep 17 00:00:00 2001 From: Haaroon Yousaf Date: Thu, 20 Apr 2023 18:13:30 +0100 Subject: [PATCH 4/5] fix python graph loader --- python/src/graph_loader.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/python/src/graph_loader.rs b/python/src/graph_loader.rs index 85d33e4a..c562bc0e 100644 --- a/python/src/graph_loader.rs +++ b/python/src/graph_loader.rs @@ -69,5 +69,6 @@ pub(crate) fn reddit_hyperlink_graph(shards: usize, timeout_seconds: u64) -> PyR PyGraph::py_from_db_graph(docbrown::graph_loader::reddit_hyperlinks::reddit_graph( shards, timeout_seconds, + false, )) } From 902eb50a4335429955ef5d19f3ab7441ead54176 Mon Sep 17 00:00:00 2001 From: Haaroon Yousaf Date: Thu, 20 Apr 2023 19:00:49 +0100 Subject: [PATCH 5/5] my family needs me --- docbrown/src/db/graph.rs | 58 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/docbrown/src/db/graph.rs b/docbrown/src/db/graph.rs index f2a2166e..0975c6e9 100644 --- a/docbrown/src/db/graph.rs +++ b/docbrown/src/db/graph.rs @@ -1924,4 +1924,62 @@ mod db_tests { prop = Prop::Bool(true); assert_eq!(format!("{}", prop), "true"); } + + #[test] + fn test_temporral_edge_props_window() { + let g = Graph::new(1); + g.add_edge(1, 1, 2, &vec![("weight".to_string(), Prop::I64(1))], None) + .unwrap(); + g.add_edge(2, 1, 2, &vec![("weight".to_string(), Prop::I64(2))], None) + .unwrap(); + g.add_edge(3, 1, 2, &vec![("weight".to_string(), Prop::I64(3))], None) + .unwrap(); + + let e = g.vertex(1).unwrap().out_edges().next().unwrap(); + + let res = g.temporal_edge_props_window(EdgeRef::from(e), 1, 3); + let mut exp = HashMap::new(); + exp.insert( + "weight".to_string(), + vec![(1, Prop::I64(1)), (2, Prop::I64(2))], + ); + assert_eq!(res, exp); + } + + #[test] + fn test_vertex_early_late_times() { + let g = Graph::new(1); + g.add_vertex(1, 1, &vec![]).unwrap(); + g.add_vertex(2, 1, &vec![]).unwrap(); + g.add_vertex(3, 1, &vec![]).unwrap(); + + assert_eq!(g.vertex(1).unwrap().earliest_time(), Some(1)); + assert_eq!(g.vertex(1).unwrap().latest_time(), Some(3)); + + assert_eq!(g.at(2).vertex(1).unwrap().earliest_time(), Some(1)); + assert_eq!(g.at(2).vertex(1).unwrap().latest_time(), Some(2)); + } + + #[test] + fn test_vertex_ids() { + let g = Graph::new(1); + g.add_vertex(1, 1, &vec![]).unwrap(); + g.add_vertex(1, 2, &vec![]).unwrap(); + g.add_vertex(2, 3, &vec![]).unwrap(); + + assert_eq!(g.vertex_ids().collect::>(), vec![1, 2, 3]); + + let g_at = g.at(1); + assert_eq!(g.vertex_ids().collect::>(), vec![1, 2]); + } + + // #[test] + // fn test_vertex_refs_shard() { + // let g = Graph::new(2); + // g.add_vertex(1, 1, &vec![]).unwrap(); + // g.add_vertex(1, 2, &vec![]).unwrap(); + // g.add_vertex(2, 3, &vec![]).unwrap(); + // + // assert_eq!(g.vertex_refs_shard(0).collect::>(), vec![1, 2]); + // } }