use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct ColumnRef {
qualifier: Option<ColumnQualifier>,
name: String,
display_name: String,
}
impl ColumnRef {
pub fn unqualified(name: impl Into<String>) -> Self {
let name = name.into();
Self { qualifier: None, display_name: name.clone(), name }
}
pub fn input(input: usize, name: impl Into<String>, display_name: impl Into<String>) -> Self {
Self {
qualifier: Some(ColumnQualifier::Input { index: input }),
name: name.into(),
display_name: display_name.into(),
}
}
pub fn qualifier(&self) -> Option<&ColumnQualifier> {
self.qualifier.as_ref()
}
pub fn name(&self) -> &str {
&self.name
}
pub fn display_name(&self) -> &str {
&self.display_name
}
pub fn is_qualified(&self) -> bool {
self.qualifier.is_some()
}
}
impl fmt::Display for ColumnRef {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if let Some(qualifier) = &self.qualifier {
write!(f, "{qualifier}.{}", self.name)
} else {
f.write_str(&self.name)
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum ColumnQualifier {
Input {
index: usize,
},
Node {
id: String,
},
Relation {
name: String,
},
}
impl fmt::Display for ColumnQualifier {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Input { index } => write!(f, "input{index}"),
Self::Node { id } => write!(f, "{id}"),
Self::Relation { name } => f.write_str(name),
}
}
}