Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
b80ad8e
make sure we cancel all tasks when the running server is dropped
ljeub-pometry Apr 17, 2026
c7f41f5
update optd
ljeub-pometry Apr 17, 2026
8bc017b
add domain for NodeOp
ljeub-pometry Apr 17, 2026
f51ea1d
Merge branch 'db_v4' into optimise_node_name_filter
miratepuffin Apr 17, 2026
14ca248
Merge db_v4 into optimise_node_name_filter
ljeub-pometry Apr 20, 2026
be0de7c
avoid unnecessarily re-filtering the domain when it is correct
ljeub-pometry Apr 20, 2026
00192b2
changes to better support Bn edge sized graphs
fabianmurariu Apr 17, 2026
3d60794
remove accidental pyo3 import
ljeub-pometry Apr 20, 2026
13305b5
small import updates
fabianmurariu Apr 20, 2026
7d42637
should call list_filtered in nodes
ljeub-pometry Apr 20, 2026
85a9431
const_value_in_domain should be the same as const_value by default
ljeub-pometry Apr 20, 2026
69e67a5
Merge remote-tracking branch 'origin/optimise_node_name_filter' into …
fabianmurariu Apr 20, 2026
be62c8f
possible improvements to UI for very large graphs
fabianmurariu Apr 21, 2026
f814e71
Merge db_v4 into pre_prod_optim2
ljeub-pometry Apr 21, 2026
73a6762
still need to check that the edge exists in the layer, even if we hav…
ljeub-pometry Apr 22, 2026
2a54bf3
no optimisation in with_debug as they make debugging more annoying
ljeub-pometry Apr 22, 2026
84cd417
filtering by node is really bad for window so change this back
ljeub-pometry Apr 22, 2026
92881b1
fix materialize double-adding temporal edges
ljeub-pometry Apr 22, 2026
b52362c
for a persistent graph the update history and properties for exploded…
ljeub-pometry Apr 22, 2026
1b76bbc
need to look at explode() for history on persistent graphs
ljeub-pometry Apr 22, 2026
c1d71bd
attempt at faster node_valid
ljeub-pometry Apr 22, 2026
5f6140a
include updates from static graph in node_valid check for layers
ljeub-pometry Apr 23, 2026
24f843c
cleanup
ljeub-pometry Apr 23, 2026
1fdccc4
fix search feature
ljeub-pometry Apr 23, 2026
adf1166
make component test easier to debug on failure
ljeub-pometry Apr 23, 2026
8f54fff
add our own union find implementation based on the old connected comp…
ljeub-pometry Apr 23, 2026
0a226ac
clean up dependencies
ljeub-pometry Apr 23, 2026
1c9dab6
storage dependency is definitely used
ljeub-pometry Apr 23, 2026
08a2d40
avoid compiling the vectors feature in benchmarks unless it is actual…
ljeub-pometry Apr 23, 2026
874dff9
implement has_layer_inner directly
ljeub-pometry Apr 23, 2026
c046c72
optimise last for filtered additions
ljeub-pometry Apr 24, 2026
a21d6a6
add fast path for getting edge ref out again
ljeub-pometry Apr 24, 2026
3f82030
attempt to optimise SVM
ljeub-pometry Apr 27, 2026
4b2b794
use optimised active check
ljeub-pometry Apr 27, 2026
3284009
some inlines
ljeub-pometry Apr 27, 2026
87babfc
minimise the size of the MemEdgeRef while still including src/dst inf…
ljeub-pometry Apr 27, 2026
e3104f9
add src/dst to MemEdgeEntry as well
ljeub-pometry Apr 27, 2026
adc304a
remove sorted_vector_map dependency and clean up
ljeub-pometry Apr 27, 2026
6afb390
Merge db_v4 into optimise_node_valid
ljeub-pometry Apr 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 2 additions & 59 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ debug = true
[profile.with-debug]
inherits = "dev"
debug = true
opt-level = 0

# for fast one-time builds (e.g., docs/CI)
[profile.build-fast]
Expand Down Expand Up @@ -92,7 +93,6 @@ itertools = "0.13.0"
rand = "0.9.2"
rayon = "1.11.0"
roaring = "0.10.12"
sorted_vector_map = "0.2.0"
tokio = { version = "1.50.0", features = ["full"] }
once_cell = "1.21.4"
parking_lot = { version = "0.12.5", features = [
Expand Down Expand Up @@ -195,7 +195,6 @@ strum = "0.27.2"
strum_macros = "0.27.2"
pythonize = { version = "0.27.0" }
test-log = "0.2.19"
disjoint-sets = "0.4.2"
datafusion = { version = "52.5.0" }
datafusion-physical-expr-common = "52.5.0"
datafusion-physical-expr = "52.5.0"
Expand Down
2 changes: 1 addition & 1 deletion clam-core
7 changes: 6 additions & 1 deletion db4-graph/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,11 @@ where
self.logical_to_physical.flush()
}

pub fn vacuum(&self) -> Result<(), StorageError> {
self.storage.vacuum()?;
Ok(())
}

pub fn disk_storage_path(&self) -> Option<&Path> {
self.graph_dir()
.filter(|_| Extension::disk_storage_enabled())
Expand Down Expand Up @@ -402,7 +407,7 @@ where
WriteLockedGraph::new(self)
}

pub fn update_time(&self, earliest: EventTime) {
pub fn update_time(&self, _earliest: EventTime) {
// self.storage.update_time(earliest);
}
}
Expand Down
24 changes: 13 additions & 11 deletions db4-storage/src/api/edges.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@ use crate::{
use parking_lot::{RwLockReadGuard, RwLockWriteGuard, lock_api::ArcRwLockReadGuard};
use raphtory_api::core::entities::{
LayerId,
edges::edge_ref::Dir,
properties::{meta::Meta, prop::Prop, tprop::TPropOps},
};
use raphtory_core::{
entities::{EID, LayerIds, VID},
entities::{EID, LayerIds, VID, edges::edge_ref::EdgeRef},
storage::timeindex::{EventTime, TimeIndexOps},
};
use rayon::iter::ParallelIterator;
Expand All @@ -32,7 +33,7 @@ pub trait EdgeSegmentOps: Send + Sync + std::fmt::Debug + 'static {
fn latest(&self) -> Option<EventTime>;
fn earliest(&self) -> Option<EventTime>;

fn t_len(&self) -> usize;
fn t_len(&self, layer_id: usize) -> usize;
fn num_layers(&self) -> usize;
// Persistent layer count, not used for up-to-date counts
fn layer_count(&self, layer_id: LayerId) -> u32;
Expand Down Expand Up @@ -97,7 +98,7 @@ pub trait EdgeSegmentOps: Send + Sync + std::fmt::Debug + 'static {
locked_head: impl Deref<Target = MemEdgeSegment>,
) -> Option<(VID, VID)>;

fn entry<'a>(&'a self, edge_pos: LocalPOS) -> Self::Entry<'a>;
fn entry<'a>(&'a self, edge_pos: LocalPOS, edge_ref: Option<EdgeRef>) -> Self::Entry<'a>;

fn layer_entry<'a>(
&'a self,
Expand All @@ -124,7 +125,11 @@ pub trait LockedESegment: Send + Sync + std::fmt::Debug {
where
Self: 'a;

fn entry_ref<'a>(&'a self, edge_pos: impl Into<LocalPOS>) -> Self::EntryRef<'a>
fn entry_ref<'a>(
&'a self,
edge_pos: impl Into<LocalPOS>,
edge_ref: Option<EdgeRef>,
) -> Self::EntryRef<'a>
where
Self: 'a;

Expand Down Expand Up @@ -157,11 +162,7 @@ pub trait EdgeRefOps<'a>: Copy + Clone + Send + Sync {
type Deletions: TimeIndexOps<'a, IndexType = EventTime>;
type TProps: TPropOps<'a>;

fn edge(self, layer_id: LayerId) -> Option<(VID, VID)>;

fn has_layer_inner(self, layer_id: LayerId) -> bool {
self.edge(layer_id).is_some()
}
fn has_layer_inner(self, layer_id: LayerId) -> bool;

fn internal_num_layers(self) -> usize;

Expand All @@ -172,9 +173,10 @@ pub trait EdgeRefOps<'a>: Copy + Clone + Send + Sync {

fn layer_t_prop(self, layer_id: LayerId, prop_id: usize) -> Self::TProps;

fn src(&self) -> Option<VID>;
fn src(&self) -> VID;

fn dst(&self) -> Option<VID>;
fn dst(&self) -> VID;

fn edge_id(&self) -> EID;
fn edge_ref(self, dir: Dir) -> EdgeRef;
}
1 change: 1 addition & 0 deletions db4-storage/src/gen_ts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,7 @@ impl<'a, Ref: WithTimeCells<'a> + 'a> TimeIndexOps<'a> for GenericTimeOps<'a, Re

type RangeType = Self;

#[inline]
fn active(&self, w: Range<Self::IndexType>) -> bool {
self.clone()
.time_cells()
Expand Down
42 changes: 32 additions & 10 deletions db4-storage/src/pages/edge_store.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,14 @@ use crate::{
persist::{config::ConfigOps, strategy::PersistenceStrategy},
segments::edge::segment::MemEdgeSegment,
};
use either::Either;
use parking_lot::{RwLock, RwLockWriteGuard};
use raphtory_api::core::entities::{
EID, LayerId, VID,
properties::meta::{Meta, STATIC_GRAPH_LAYER_ID},
};
use raphtory_core::{
entities::{ELID, LayerIds},
entities::{ELID, LayerIds, edges::edge_ref::EdgeRef},
storage::timeindex::{AsTime, EventTime},
};
use rayon::prelude::*;
Expand Down Expand Up @@ -56,12 +57,12 @@ impl<ES: EdgeSegmentOps<Extension = EXT>, EXT: PersistenceStrategy<ES = ES>>

pub fn edge_ref(
&self,
e_id: impl Into<EID>,
e_id_ref: Either<EID, EdgeRef>,
) -> <<ES as EdgeSegmentOps>::ArcLockedSegment as LockedESegment>::EntryRef<'_> {
let e_id = e_id.into();
let e_id = e_id_ref.either(|eid| eid, |eref| eref.pid());
let (page_id, pos) = self.storage.resolve_pos(e_id);
let locked_page = &self.locked_pages[page_id];
locked_page.entry_ref(pos)
locked_page.entry_ref(pos, e_id_ref.right())
}

pub fn iter<'a, 'b: 'a>(
Expand Down Expand Up @@ -122,7 +123,10 @@ impl<ES: EdgeSegmentOps<Extension = EXT>, EXT: PersistenceStrategy<ES = ES>>
.map(|(row_group_id, iter)| {
(
row_group_id,
iter.filter(|eid| self.edge_ref(*eid).edge(LayerId(0)).is_some()),
iter.filter(|eid| {
self.edge_ref(Either::Left(*eid))
.has_layer_inner(STATIC_GRAPH_LAYER_ID)
}),
)
})
}
Expand Down Expand Up @@ -223,8 +227,11 @@ impl<ES: EdgeSegmentOps<Extension = EXT>, EXT: PersistenceStrategy<ES = ES>>
Iterator::max(self.segments.iter().filter_map(|(_, page)| page.latest()))
}

pub fn t_len(&self) -> usize {
self.segments.iter().map(|(_, page)| page.t_len()).sum()
pub fn t_len(&self, layer_id: usize) -> usize {
self.segments
.iter()
.map(|(_, page)| page.t_len(layer_id))
.sum()
}

pub fn prop_meta(&self) -> &Arc<Meta> {
Expand Down Expand Up @@ -467,16 +474,16 @@ impl<ES: EdgeSegmentOps<Extension = EXT>, EXT: PersistenceStrategy<ES = ES>>
segment.get_edge(local_edge, layer, segment.head())
}

pub fn edge(&self, e_id: impl Into<EID>) -> ES::Entry<'_> {
let e_id = e_id.into();
pub fn edge(&self, e_id_ref: Either<EID, EdgeRef>) -> ES::Entry<'_> {
let e_id = e_id_ref.either(|eid| eid, |eref| eref.pid());
let (segment_id, local_edge) = resolve_pos(e_id, self.max_page_len());
let segment = self.segments.get(segment_id).unwrap_or_else(|| {
panic!(
"{e_id:?} Not found in seg: {segment_id}, pos: {local_edge:?}, num_segments: {}",
self.segments.count()
)
});
segment.entry(local_edge)
segment.entry(local_edge, e_id_ref.right())
}

pub fn num_edges(&self) -> usize {
Expand All @@ -487,6 +494,21 @@ impl<ES: EdgeSegmentOps<Extension = EXT>, EXT: PersistenceStrategy<ES = ES>>
self.layer_counter.get(layer_id)
}

pub fn num_layers(&self) -> usize {
self.segments
.iter()
.map(|(_, page)| page.num_layers())
.max()
.unwrap_or(0)
}

pub fn num_temporal_edges_layer(&self, layer_id: LayerId) -> usize {
self.segments
.iter()
.map(|(_, page)| page.t_len(layer_id.0))
.sum()
}

pub fn get_writer<'a>(
&'a self,
e_id: EID,
Expand Down
Loading
Loading