use std::fmt::Debug;
use crate::ir::{EdgeParameters, Eid, FieldValue, Vid};
use super::{Adapter, DataContext, InterpretedQuery};
pub type VertexIterator<'vertex, VertexT> = Box<dyn Iterator<Item = VertexT> + 'vertex>;
pub type ContextIterator<'vertex, VertexT> =
Box<dyn Iterator<Item = DataContext<VertexT>> + 'vertex>;
pub type ContextOutcomeIterator<'vertex, VertexT, OutcomeT> =
Box<dyn Iterator<Item = (DataContext<VertexT>, OutcomeT)> + 'vertex>;
pub trait BasicAdapter<'vertex> {
type Vertex: Clone + Debug + 'vertex;
fn resolve_starting_vertices(
&mut self,
edge_name: &str,
parameters: Option<&EdgeParameters>,
) -> VertexIterator<'vertex, Self::Vertex>;
fn resolve_property(
&mut self,
contexts: ContextIterator<'vertex, Self::Vertex>,
type_name: &str,
property_name: &str,
) -> ContextOutcomeIterator<'vertex, Self::Vertex, FieldValue>;
fn resolve_neighbors(
&mut self,
contexts: ContextIterator<'vertex, Self::Vertex>,
type_name: &str,
edge_name: &str,
parameters: Option<&EdgeParameters>,
) -> ContextOutcomeIterator<'vertex, Self::Vertex, VertexIterator<'vertex, Self::Vertex>>;
fn resolve_coercion(
&mut self,
contexts: ContextIterator<'vertex, Self::Vertex>,
type_name: &str,
coerce_to_type: &str,
) -> ContextOutcomeIterator<'vertex, Self::Vertex, bool>;
}
impl<'token, T> Adapter<'token> for T
where
T: BasicAdapter<'token>,
{
type DataToken = T::Vertex;
fn get_starting_tokens(
&mut self,
edge: std::sync::Arc<str>,
parameters: Option<std::sync::Arc<EdgeParameters>>,
_query_hint: InterpretedQuery,
_vertex_hint: Vid,
) -> Box<dyn Iterator<Item = Self::DataToken> + 'token> {
<Self as BasicAdapter>::resolve_starting_vertices(
self,
edge.as_ref(),
parameters.as_deref(),
)
}
fn project_property(
&mut self,
contexts: Box<dyn Iterator<Item = DataContext<Self::DataToken>> + 'token>,
current_type_name: std::sync::Arc<str>,
field_name: std::sync::Arc<str>,
_query_hint: InterpretedQuery,
_vertex_hint: Vid,
) -> Box<dyn Iterator<Item = (DataContext<Self::DataToken>, FieldValue)> + 'token> {
<Self as BasicAdapter>::resolve_property(
self,
contexts,
current_type_name.as_ref(),
field_name.as_ref(),
)
}
fn project_neighbors(
&mut self,
contexts: Box<dyn Iterator<Item = DataContext<Self::DataToken>> + 'token>,
current_type_name: std::sync::Arc<str>,
edge_name: std::sync::Arc<str>,
parameters: Option<std::sync::Arc<EdgeParameters>>,
_query_hint: InterpretedQuery,
_vertex_hint: Vid,
_edge_hint: Eid,
) -> Box<
dyn Iterator<
Item = (
DataContext<Self::DataToken>,
Box<dyn Iterator<Item = Self::DataToken> + 'token>,
),
> + 'token,
> {
<Self as BasicAdapter>::resolve_neighbors(
self,
contexts,
current_type_name.as_ref(),
edge_name.as_ref(),
parameters.as_deref(),
)
}
fn can_coerce_to_type(
&mut self,
contexts: Box<dyn Iterator<Item = DataContext<Self::DataToken>> + 'token>,
current_type_name: std::sync::Arc<str>,
coerce_to_type_name: std::sync::Arc<str>,
_query_hint: InterpretedQuery,
_vertex_hint: Vid,
) -> Box<dyn Iterator<Item = (DataContext<Self::DataToken>, bool)> + 'token> {
<Self as BasicAdapter>::resolve_coercion(
self,
contexts,
current_type_name.as_ref(),
coerce_to_type_name.as_ref(),
)
}
}