Finish step code

pull/825/head
Peter Heringer 1 year ago
parent d8b56ce893
commit 05448c5a20
  1. 80
      lib/src/storage/storage_generator.rs

@ -12,10 +12,12 @@ use super::numeric_encoder::{StrLookup, StrHash};
use super::{Storage, ChainedDecodingQuadIterator};
use gfa::gfa::Orientation;
use handlegraph::handle::{Direction, Handle};
use handlegraph::packed::PackedElement;
use handlegraph::packedgraph::paths::StepPtr;
use handlegraph::pathhandlegraph::{
path::PathStep, GraphPathsRef, IntoPathIds, PathBase,
};
use handlegraph::pathhandlegraph::{GraphPathNames, PathId};
use handlegraph::pathhandlegraph::{GraphPathNames, PathId, PathSequences, GraphPaths};
use handlegraph::{
handlegraph::IntoHandles, handlegraph::IntoNeighbors,
handlegraph::IntoSequences,
@ -219,10 +221,80 @@ impl StorageGenerator {
}
}
}
} else if let Some(step_type) = self.get_step_iri_fields(subject) {
match step_type {
StepType::Rank(path_name, target_rank) => {
if let Some(id) = self.storage.graph.get_path_id(path_name.as_bytes()) {
let path_ref = self.storage.graph.get_path_ref(id).unwrap();
let step_handle = path_ref.step_at(path_ref.first_step());
let step_handle = step_handle.unwrap();
let mut node_handle = step_handle.handle();
let mut rank = 1;
let mut position = 1;
while path_ref.next_step(step_handle.0).is_some() && rank < target_rank {
let step_handle = path_ref.next_step(step_handle.0).unwrap();
position += self.storage.graph.node_len(node_handle);
node_handle = step_handle.handle();
rank += 1;
}
let mut triples = self.step_handle_to_triples(
&path_name,
subject,
predicate,
object,
graph_name,
node_handle,
Some(rank),
Some(position),
);
results.append(&mut triples);
}
},
StepType::Position(path_name, position) => {
if let Some(id) = self.storage.graph.get_path_id(path_name.as_bytes()) {
if let Some(step) = self.storage.graph.path_step_at_base(id, position) {
let node_handle = self.storage.graph.path_handle_at_step(id, step).unwrap();
let rank = step.pack() as usize + 1;
let mut triples = self.step_handle_to_triples(
&path_name,
subject,
predicate,
object,
graph_name,
node_handle,
Some(rank),
Some(position)
);
results.append(&mut triples);
}
}
}
}
}
results
}
fn get_step_iri_fields(&self, term: Option<&EncodedTerm>) -> Option<StepType> {
let term = term?;
if let EncodedTerm::NamedNode { iri_id, value } = term {
let mut parts = value.split("/").collect::<Vec<_>>();
parts.reverse();
if parts.len() < 5 || parts[3] != "path" {
return None;
}
let path_name = parts[2].to_owned();
match parts[1] {
"step" => Some(StepType::Rank(path_name, parts[0].parse().ok()?)),
"position" => Some(StepType::Position(path_name, parts[0].parse().ok()?)),
_ => None
}
} else {
None
}
}
fn step_handle_to_triples(
&self,
path_name: &str,
@ -673,6 +745,12 @@ impl StrLookup for StorageGenerator {
}
}
// FIX: Change usize to u64
enum StepType {
Rank(String, usize),
Position(String, usize),
}
#[cfg(test)]
mod tests {
use std::{path::Path, str::FromStr};

Loading…
Cancel
Save