From 31079efde9f7f08e23a288bcd2b70cbb739463da Mon Sep 17 00:00:00 2001 From: Qichao Chu Date: Mon, 12 Jan 2026 19:38:58 -0800 Subject: [PATCH 1/2] fix(simple-executor): return consistent column names using dot notation Update simple executor to return Cypher dot notation (e.g., p.name) instead of double underscore format (e.g., p__name) for column names. This ensures consistency with the DataFusion executor output. Changes: - Add to_cypher_column_name() function to convert to dot notation - Update apply_return_with_qualifier() to apply conversion for final output - Add unit tests for the new function - Preserve explicit user-provided aliases Fixes #30 Co-Authored-By: Claude Sonnet 4.5 --- .../src/simple_executor/aliases.rs | 27 +++++++++++++++++++ .../src/simple_executor/clauses.rs | 3 +++ 2 files changed, 30 insertions(+) diff --git a/rust/lance-graph/src/simple_executor/aliases.rs b/rust/lance-graph/src/simple_executor/aliases.rs index d53f8e7..1eedae8 100644 --- a/rust/lance-graph/src/simple_executor/aliases.rs +++ b/rust/lance-graph/src/simple_executor/aliases.rs @@ -1,6 +1,33 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: Copyright The Lance Authors +/// Qualify a column name for internal DataFusion operations. +/// Returns format: `alias__property` (e.g., "p__name"). +/// Note: This is for internal use only. Final output uses Cypher dot notation. pub(super) fn qualify_alias_property(alias: &str, property: &str) -> String { format!("{}__{}", alias, property) } + +/// Convert to Cypher-style column name for query results. +/// Returns format: `alias.property` (e.g., "p.name"). +/// This matches the output format used by the DataFusion executor. +pub(super) fn to_cypher_column_name(alias: &str, property: &str) -> String { + format!("{}.{}", alias, property) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_qualify_alias_property() { + assert_eq!(qualify_alias_property("p", "name"), "p__name"); + assert_eq!(qualify_alias_property("person", "age"), "person__age"); + } + + #[test] + fn test_to_cypher_column_name() { + assert_eq!(to_cypher_column_name("p", "name"), "p.name"); + assert_eq!(to_cypher_column_name("c", "company_name"), "c.company_name"); + } +} diff --git a/rust/lance-graph/src/simple_executor/clauses.rs b/rust/lance-graph/src/simple_executor/clauses.rs index 493ca10..fa3636f 100644 --- a/rust/lance-graph/src/simple_executor/clauses.rs +++ b/rust/lance-graph/src/simple_executor/clauses.rs @@ -37,6 +37,9 @@ pub(super) fn apply_return_with_qualifier( let mut e = datafusion::logical_expr::col(col_name); if let Some(a) = &item.alias { e = e.alias(a); + } else { + let cypher_name = super::aliases::to_cypher_column_name(&prop.variable, &prop.property); + e = e.alias(cypher_name); } proj.push(e); } From ca45e0c1d0a3bf7d955c4ec0755d53799abd8e7a Mon Sep 17 00:00:00 2001 From: Qichao Chu Date: Mon, 12 Jan 2026 22:50:31 -0800 Subject: [PATCH 2/2] cargo fmt --- rust/lance-graph/src/simple_executor/clauses.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rust/lance-graph/src/simple_executor/clauses.rs b/rust/lance-graph/src/simple_executor/clauses.rs index fa3636f..66c6325 100644 --- a/rust/lance-graph/src/simple_executor/clauses.rs +++ b/rust/lance-graph/src/simple_executor/clauses.rs @@ -38,7 +38,8 @@ pub(super) fn apply_return_with_qualifier( if let Some(a) = &item.alias { e = e.alias(a); } else { - let cypher_name = super::aliases::to_cypher_column_name(&prop.variable, &prop.property); + let cypher_name = + super::aliases::to_cypher_column_name(&prop.variable, &prop.property); e = e.alias(cypher_name); } proj.push(e);