Weijun-H commented on code in PR #7870:
URL: https://github.com/apache/arrow-datafusion/pull/7870#discussion_r1374412774
##########
datafusion/common/src/dfschema.rs:
##########
@@ -35,11 +38,122 @@ use arrow::datatypes::{DataType, Field, FieldRef, Fields,
Schema, SchemaRef};
/// A reference-counted reference to a `DFSchema`.
pub type DFSchemaRef = Arc<DFSchema>;
+/// [`FieldReference`]s represent a multi part identifier (path) to a
+/// field that may require further resolution.
+#[derive(Debug, Clone, PartialEq, Eq)]
+struct FieldReference<'a> {
+ /// The field name
+ name: Cow<'a, str>,
+ /// Optional qualifier (usually a table or relation name)
+ qualifier: Option<TableReference<'a>>,
+}
+
+impl<'a> PartialOrd for FieldReference<'a> {
+ fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+ Some(self.cmp(other))
+ }
+}
+
+impl<'a> Ord for FieldReference<'a> {
+ fn cmp(&self, other: &Self) -> Ordering {
+ if self == other {
+ return Ordering::Equal;
+ }
+
+ match self.field().cmp(other.field()) {
+ Ordering::Less => return Ordering::Less,
+ Ordering::Greater => return Ordering::Greater,
+ Ordering::Equal => {}
+ }
+
+ match (self.table(), other.table()) {
+ (Some(lhs), Some(rhs)) => match lhs.cmp(rhs) {
+ Ordering::Less => return Ordering::Less,
+ Ordering::Greater => return Ordering::Greater,
+ Ordering::Equal => {}
+ },
+ (Some(_), None) => return Ordering::Greater,
+ (None, Some(_)) => return Ordering::Less,
+ _ => {}
+ }
+
+ match (self.schema(), other.schema()) {
+ (Some(lhs), Some(rhs)) => match lhs.cmp(rhs) {
+ Ordering::Less => return Ordering::Less,
+ Ordering::Greater => return Ordering::Greater,
+ Ordering::Equal => {}
+ },
+ (Some(_), None) => return Ordering::Greater,
+ (None, Some(_)) => return Ordering::Less,
+ _ => {}
+ }
+
+ match (self.catalog(), other.catalog()) {
+ (Some(lhs), Some(rhs)) => match lhs.cmp(rhs) {
+ Ordering::Less => return Ordering::Less,
+ Ordering::Greater => return Ordering::Greater,
+ Ordering::Equal => {}
+ },
+ (Some(_), None) => return Ordering::Greater,
+ (None, Some(_)) => return Ordering::Less,
+ _ => {}
+ }
+
+ Ordering::Equal
+ }
+}
+
+/// This is a [`FieldReference`] that has 'static lifetime (aka it
+/// owns the underlying strings)
+type OwnedFieldReference = FieldReference<'static>;
+
+impl<'a> FieldReference<'a> {
+ /// Convenience method for creating a [`FieldReference`].
+ pub fn new(
+ name: impl Into<Cow<'a, str>>,
+ qualifier: Option<TableReference<'a>>,
+ ) -> Self {
+ Self {
+ name: name.into(),
+ qualifier,
+ }
+ }
+
+ /// Compare with another [`FieldReference`] as if both are resolved.
+ /// This allows comparing across variants, where if a field is not present
+ /// in both variants being compared then it is ignored in the comparison.
+ pub fn resolved_eq(&self, other: &Self) -> bool {
+ self.name == other.name
+ && match (&self.qualifier, &other.qualifier) {
+ (Some(lhs), Some(rhs)) => lhs.resolved_eq(rhs),
+ _ => true,
+ }
+ }
+
+ fn field(&self) -> &str {
+ &self.name
+ }
+
+ fn table(&self) -> Option<&str> {
+ self.qualifier.as_ref().map(|q| q.table())
+ }
+
+ fn schema(&self) -> Option<&str> {
+ self.qualifier.as_ref().and_then(|q| q.schema())
+ }
+
+ fn catalog(&self) -> Option<&str> {
+ self.qualifier.as_ref().and_then(|q| q.catalog())
+ }
+}
+
/// DFSchema wraps an Arrow schema and adds relation names
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DFSchema {
/// Fields
fields: Vec<DFField>,
+ /// Fields index
+ fields_index: BTreeMap<OwnedFieldReference, Vec<usize>>,
Review Comment:
Fair enough
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]