graphrecords-query 0.5.0

High-performance graph-based data records
Documentation
mod edge_endpoint;
mod entity;
mod expanded;
mod key;

use crate::{AttributeName, FailureKind};
pub use edge_endpoint::EdgeEndpointRole;
pub use entity::{EntityAttributes, IndicesInGroup};
pub use expanded::{ExpandedChild, ExpandedIndex, ExpandedIndexOwned, ExpandedIndexReference};
use graphrecords_core::{
    GraphRecord,
    errors::GraphRecordResult,
    graphrecord::{EdgeIndex, GraphRecordAttribute, GraphRecordValue, NodeIndex},
};
pub use key::GroupKey;
use std::{
    any::Any,
    fmt::{Debug, Display},
    hash::Hash,
};

pub type Position = usize;

pub trait OwnedIndex: Any + Debug + Display + Send + Sync {}

impl<T: Any + Debug + Display + Send + Sync> OwnedIndex for T {}

pub trait IndexDomain: 'static + Clone {
    type Owned: 'static + Clone + Eq + Hash + OwnedIndex;

    type Index<'a>: Clone + Eq + Hash
    where
        Self: 'a;

    fn to_owned(index: &Self::Index<'_>) -> Self::Owned;

    fn from_owned(owned: &Self::Owned) -> Self::Index<'_>;
}

pub trait EntityDomain: IndexDomain {
    fn resolve_index<'a>(
        graphrecord: &'a GraphRecord,
        index: &Self::Owned,
    ) -> GraphRecordResult<Self::Index<'a>>;
}

#[derive(Clone, Debug)]
pub struct Positional;

impl IndexDomain for Positional {
    type Index<'a> = Position;
    type Owned = Position;

    fn to_owned(index: &Self::Index<'_>) -> Self::Owned {
        *index
    }

    fn from_owned(owned: &Self::Owned) -> Self::Index<'_> {
        *owned
    }
}

impl IndexDomain for EdgeIndex {
    type Index<'a> = &'a Self;
    type Owned = Self;

    fn to_owned(index: &Self::Index<'_>) -> Self::Owned {
        **index
    }

    fn from_owned(owned: &Self::Owned) -> Self::Index<'_> {
        owned
    }
}

impl IndexDomain for NodeIndex {
    type Index<'a> = &'a Self;
    type Owned = Self;

    fn to_owned(index: &Self::Index<'_>) -> Self::Owned {
        (*index).clone()
    }

    fn from_owned(owned: &Self::Owned) -> Self::Index<'_> {
        owned
    }
}

impl IndexDomain for FailureKind {
    type Index<'a> = Self;
    type Owned = Self;

    fn to_owned(index: &Self::Index<'_>) -> Self::Owned {
        *index
    }

    fn from_owned(owned: &Self::Owned) -> Self::Index<'_> {
        *owned
    }
}

impl IndexDomain for GraphRecordValue {
    type Index<'a> = Self;
    type Owned = Self;

    fn to_owned(index: &Self::Index<'_>) -> Self::Owned {
        index.clone()
    }

    fn from_owned(owned: &Self::Owned) -> Self::Index<'_> {
        owned.clone()
    }
}

impl IndexDomain for AttributeName {
    type Index<'a> = GraphRecordAttribute;
    type Owned = GraphRecordAttribute;

    fn to_owned(index: &Self::Index<'_>) -> Self::Owned {
        index.clone()
    }

    fn from_owned(owned: &Self::Owned) -> Self::Index<'_> {
        owned.clone()
    }
}

impl IndexDomain for bool {
    type Index<'a> = Self;
    type Owned = Self;

    fn to_owned(index: &Self::Index<'_>) -> Self::Owned {
        *index
    }

    fn from_owned(owned: &Self::Owned) -> Self::Index<'_> {
        *owned
    }
}

impl EntityDomain for EdgeIndex {
    fn resolve_index<'a>(
        graphrecord: &'a GraphRecord,
        index: &Self::Owned,
    ) -> GraphRecordResult<Self::Index<'a>> {
        graphrecord.resolve_edge_index(index)
    }
}

impl EntityDomain for NodeIndex {
    fn resolve_index<'a>(
        graphrecord: &'a GraphRecord,
        index: &Self::Owned,
    ) -> GraphRecordResult<Self::Index<'a>> {
        graphrecord.resolve_node_index(index)
    }
}