From 1194a4439e466a4ee6e41ea82560528377d0dc7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Ml=C3=A1dek?= Date: Fri, 17 Dec 2021 19:44:00 +0100 Subject: [PATCH] list_path also fetches attrs of attrs --- src/database/hierarchies.rs | 41 ++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/src/database/hierarchies.rs b/src/database/hierarchies.rs index 65a4afb..8819f07 100644 --- a/src/database/hierarchies.rs +++ b/src/database/hierarchies.rs @@ -9,7 +9,7 @@ use lru::LruCache; use serde_json::Value; use uuid::Uuid; -use crate::addressing::Address; +use crate::addressing::{Address, Addressable}; use crate::database::constants::{ HIER_ADDR, HIER_HAS_ATTR, HIER_INVARIANT, IS_OF_TYPE_ATTR, LABEL_ATTR, TYPE_ADDR, TYPE_HAS_ATTR, }; @@ -78,15 +78,15 @@ impl std::fmt::Display for UPath { } trait EntryList { - fn extract_addresses(&self) -> Vec
; + fn extract_pointers(&self) -> Vec<(Address, Address)>; } impl EntryList for Vec { - fn extract_addresses(&self) -> Vec
{ + fn extract_pointers(&self) -> Vec<(Address, Address)> { self.iter() .filter_map(|e| { if let EntryValue::Address(address) = &e.value { - Some(address.clone()) + Some((e.address().unwrap(), address.clone())) } else { None } @@ -113,7 +113,10 @@ pub fn list_orphans>(connection: &C) -> Result>( ) -> Result> { let resolved_path: Vec
= resolve_path(connection, path, false)?; let entry_addresses = match resolved_path.last() { - Some(last) => - query( - connection, - Query::SingleQuery(QueryPart::Matches(EntryQuery { - entity: QueryComponent::Exact(last.clone()), - attribute: QueryComponent::Exact(HIER_HAS_ATTR.to_string()), - value: QueryComponent::Any, - })), - )? - .extract_addresses(), + Some(last) => query( + connection, + Query::SingleQuery(QueryPart::Matches(EntryQuery { + entity: QueryComponent::Exact(last.clone()), + attribute: QueryComponent::Exact(HIER_HAS_ATTR.to_string()), + value: QueryComponent::Any, + })), + )? + .extract_pointers() + .into_iter() + .map(|(addr, val)| [addr, val]) + .flatten() + .collect(), None => list_orphans(connection)?, }; @@ -189,7 +195,10 @@ pub fn fetch_or_create_dir>( value: QueryComponent::Any, })), )? - .extract_addresses(), + .extract_pointers() + .into_iter() + .map(|(_, val)| val) + .collect(), None => list_orphans(connection)?, };