Skip to content

[MAJOR] Equivalence System Overhaul #16217

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 197 commits into from
Jun 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
197 commits
Select commit Hold shift + click to select a range
5df66e7
introduce Soft & Hard RequiredInputOrderings
Feb 12, 2025
7c9f6d3
add documentation to replace_with_partial_sort
Feb 12, 2025
3c76bdc
add documentation to analyze_immediate_sort_removal
Feb 12, 2025
265e00e
remove prefer_existing_sort effects
Feb 12, 2025
23e0bf6
remove prefer_existing_sort configuration
Feb 12, 2025
ee626d1
remove prefer_existing_sort configuration
Feb 12, 2025
0b98382
add documentation
Feb 12, 2025
a41dfec
add documentation
Feb 13, 2025
f6dae9d
add documentation
Feb 13, 2025
419e8ab
Merge branch 'refs/heads/apache_main' into soft-required-input-ordering
Feb 21, 2025
81d5ac0
Merge branch 'refs/heads/apache_main' into soft-required-input-ordering
Mar 10, 2025
d551623
fix imports and test cases
Mar 10, 2025
9a1b5b5
fix imports and test cases
Mar 10, 2025
77e97fd
implement RequiredInputOrdering as vectors
Mar 19, 2025
1d90a71
implement RequiredInputOrdering as vectors
Mar 19, 2025
7949ca0
Merge branch 'refs/heads/apache_main' into required-input-ordering
Mar 19, 2025
55ef9aa
fix test cases
Mar 19, 2025
ea2583b
change doc
Mar 19, 2025
c83862f
revert prefer_existing_sort flag
Mar 20, 2025
87dd95e
fix changes
Mar 20, 2025
24dba16
fix test case
Mar 20, 2025
8635d5e
make LexRequirement private
Mar 20, 2025
ab28421
ensure RequiredInputOrdering inner requirement can not be empty
Mar 20, 2025
cb8f763
add default test cases
Mar 21, 2025
1c1f116
doc fixes
Mar 21, 2025
7817b4f
fix clippy and docs
Mar 21, 2025
6b43982
format code
Mar 21, 2025
55b9cf1
format code
Mar 21, 2025
156b84c
Merge branch 'refs/heads/apache_main' into required-input-ordering
Mar 21, 2025
41e4292
doc fix
Mar 21, 2025
f80f093
add TODO test cases with test_soft_hard_requirements prefix
Mar 21, 2025
b41fa2f
Review Part 1
ozankabak Mar 23, 2025
117783f
Review Part 2
ozankabak Mar 23, 2025
d402680
Review Part 3
ozankabak Mar 23, 2025
807c28d
Review Part 4
ozankabak Mar 23, 2025
b07b377
Review Part 5
ozankabak Mar 23, 2025
51f5cd9
Review Part 6
ozankabak Mar 23, 2025
86e69a1
Enforce non-degeneracy for LexRequirement
ozankabak Mar 24, 2025
bade16d
Enforce non-degeneracy for LexOrdering (Part 1)
ozankabak Mar 27, 2025
e661b66
Merge branch 'refs/heads/apache_main' into required-input-ordering
Mar 28, 2025
0ba2db4
Enforce non-degeneracy for LexOrdering (Part 2)
ozankabak Mar 28, 2025
2c4a1f8
Merge remote-tracking branch 'origin/required-input-ordering' into re…
Mar 28, 2025
669a649
fix first phase of merge conflicts and other bugs
Mar 28, 2025
cf1c527
Fix sqllogictests except the schema mismatch
ozankabak Mar 28, 2025
45bc4ec
Cleanup Part 1
ozankabak Mar 28, 2025
923115c
Cleanup Part 2
ozankabak Mar 28, 2025
ef738ea
Cleanup Part 3
ozankabak Mar 28, 2025
272a098
do not initialize Trivial accumulators if ordering is set
Mar 28, 2025
b9c18dc
Merge remote-tracking branch 'origin/required-input-ordering' into re…
Mar 28, 2025
23f1108
initialize TrivialFirstPrimitiveGroupsAccumulator struct and return
Mar 29, 2025
63385fa
fix clippy
Apr 2, 2025
39d1848
Merge branch 'refs/heads/apache_main' into required-input-ordering
Apr 2, 2025
f70197f
fix merge conflicts
Apr 2, 2025
4e5d094
fix typos
Apr 2, 2025
30594f0
format code
Apr 2, 2025
ebda669
Add requirement_satisfied back in
ozankabak Apr 2, 2025
198ffae
Replace AsRef with ordinary & for LexOrdering
ozankabak Apr 2, 2025
241ac0c
Further cleanup
ozankabak Apr 2, 2025
1776ece
Merge branch 'refs/heads/apache_main' into required-input-ordering
Apr 3, 2025
4c494d7
add OutputRequirementExec fetches to sort adding
Apr 3, 2025
99755c7
Simplify remove_redundant_entries
ozankabak Apr 3, 2025
99223ae
Work with iterators in ordering_satisfy_requirement
ozankabak Apr 3, 2025
cef12ca
Fix doctests
ozankabak Apr 3, 2025
4ae0807
Cleanup LexOrdering APIs
ozankabak Apr 3, 2025
851779d
Cleanup LexOrdering APIs 2
ozankabak Apr 4, 2025
cebb0d0
Add reverse_each to LexOrdering
ozankabak Apr 4, 2025
44e6b95
Use LexOrdering instead of Arc<[PhysicalSortExpr]>
ozankabak Apr 4, 2025
804bec5
Use PhysicalSortExpr slices in contexts where we simply list sort exp…
ozankabak Apr 4, 2025
b2c2c75
Generalize add_new_ordering APIs
ozankabak Apr 5, 2025
166f9a4
Simplifications
ozankabak Apr 5, 2025
96b73b3
More cleanups
ozankabak Apr 5, 2025
159139a
API Simplifications
ozankabak Apr 6, 2025
a3eb637
Improve comments
ozankabak Apr 6, 2025
e56306c
Use vector in Expr structs
ozankabak Apr 6, 2025
a82fa38
Fix doctests
ozankabak Apr 6, 2025
6f86ebd
Simplify sort
ozankabak Apr 6, 2025
1a1a556
Simplify the get_finer_aggregate_exprs_requirement function
ozankabak Apr 6, 2025
5b121d0
Avoid hidden clones
ozankabak Apr 6, 2025
aba45be
bugfix
ozankabak Apr 6, 2025
84ccfd5
Simplify the get_finer_aggregate_exprs_requirement function
ozankabak Apr 7, 2025
eb07739
Simplify the function with_reorder
ozankabak Apr 7, 2025
0c9c93f
Fix with_reorder bug
ozankabak Apr 7, 2025
2fa9da8
Simplify the function with_reorder (Part 2)
ozankabak Apr 7, 2025
06f9ef0
Simplify
ozankabak Apr 7, 2025
65b546b
DRY
ozankabak Apr 8, 2025
2517590
Simplifications
ozankabak Apr 8, 2025
842b7d5
Improve add_equal_condition
ozankabak Apr 8, 2025
16bc515
Improve docs
ozankabak Apr 8, 2025
ddf8ef9
Simplifications
ozankabak Apr 10, 2025
5962808
Merge branch 'apache_main' into required-input-ordering
ozankabak Apr 10, 2025
d1173aa
Simplifications
ozankabak Apr 11, 2025
32d4431
RequiredInputOrdering -> OrderingAlternatives
ozankabak Apr 13, 2025
eb61621
Merge branch 'apache_main' into required-input-ordering
ozankabak Apr 13, 2025
c4d70a4
Simplify new_with_orderings
ozankabak Apr 14, 2025
38ff1eb
Transition to fallible LexOrdering constructor
ozankabak Apr 14, 2025
a3101bb
Transition to fallible LexOrdering constructor - 2
ozankabak Apr 14, 2025
8819ace
Transition to fallible LexOrdering constructor - 3
ozankabak Apr 14, 2025
3660ce5
Transition to fallible LexOrdering constructor - 4
ozankabak Apr 14, 2025
4c9770c
Transition to fallible LexOrdering constructor - 5
ozankabak Apr 14, 2025
7f2fe97
Transition to fallible LexOrdering constructor - 6
ozankabak Apr 15, 2025
95f7182
Transition to fallible LexOrdering constructor - 7
ozankabak Apr 15, 2025
a9b3b70
Transition to fallible LexOrdering constructor - 8
ozankabak Apr 16, 2025
e291ecd
Transition to fallible LexOrdering constructor - 9
ozankabak Apr 16, 2025
39e6a9e
Transition to fallible LexOrdering constructor - 10
ozankabak Apr 16, 2025
0810007
Transition to fallible LexOrdering constructor - 11
ozankabak Apr 16, 2025
1ba1830
Simplify constant expressions
ozankabak Apr 16, 2025
f2f48a1
Simplify constant expressions - 2
ozankabak Apr 16, 2025
b905976
Simplify constant expressions - 3
ozankabak Apr 16, 2025
a9c17f6
Simplify constant expressions - 4
ozankabak Apr 16, 2025
47ca84c
Simplify constant expressions - 5
ozankabak Apr 16, 2025
2f80439
Simplify constant expressions - 6
ozankabak Apr 16, 2025
591fc74
Simplify constant expressions - 7
ozankabak Apr 17, 2025
79ad9d7
Simplify constant expressions - 8
ozankabak Apr 17, 2025
61a41bc
Simplify constant expressions - 9
ozankabak Apr 17, 2025
5567249
Merge branch 'apache_main' into required-input-ordering
ozankabak Apr 21, 2025
5292fbb
Merge branch 'apache_main' into required-input-ordering
ozankabak Apr 21, 2025
ea6fe10
Fix imports
ozankabak Apr 21, 2025
278cb49
Merge branch 'apache_main' into required-input-ordering
ozankabak Apr 21, 2025
9b22545
Remove explicit constant tracking from equivalences
ozankabak Apr 23, 2025
d5468f5
Merge branch 'apache_main' into required-input-ordering
ozankabak Apr 23, 2025
00ce540
Resolve logical conflict
ozankabak Apr 23, 2025
052120f
Remove the unusual take API, instead use the from trait
ozankabak Apr 24, 2025
0b37352
Simplify projection mapping - 1
ozankabak Apr 24, 2025
914458e
Use a map instead of a vector in ProjectionMapping
ozankabak Apr 25, 2025
cce6168
Simplify DependencyMap
ozankabak Apr 26, 2025
8094ab0
Simplify DependencyMap - 2
ozankabak Apr 26, 2025
98ff7d2
Simplify DependencyMap - 3
ozankabak Apr 27, 2025
1bcc9bc
Merge branch 'apache_main' into required-input-ordering
ozankabak Apr 27, 2025
564ea22
Incorporate Jay's suggestions
ozankabak Apr 28, 2025
0fc3465
Simplifications
ozankabak Apr 28, 2025
4171887
Fix doctest
ozankabak Apr 28, 2025
47d5c72
Improve docstrings
ozankabak Apr 28, 2025
ece9d5f
Update/cast the constant value accordingly when schema changes
ozankabak Apr 28, 2025
20e2284
Merge branch 'apache_main' into required-input-ordering
ozankabak Apr 29, 2025
be45b96
Improve ProjectionMapping
ozankabak Apr 29, 2025
7f2b0db
Remove DerefMut from ProjectionTargets to preserve non-emptiness
ozankabak Apr 29, 2025
cb0972d
Docstring
ozankabak Apr 29, 2025
9f898ec
Optimize project_expr by fetching equivalence classes only once
ozankabak Apr 30, 2025
74f74b3
Project multiple expressions more efficiently at once
ozankabak Apr 30, 2025
e4ff5fa
Merge branch 'apache_main' into required-input-ordering
ozankabak Apr 30, 2025
4839e6b
Project multiple expressions more efficiently at once - 2
ozankabak May 1, 2025
96ec3b4
Project multiple expressions more efficiently at once - 3
ozankabak May 1, 2025
82486ae
Project multiple expressions more efficiently at once - 4
ozankabak May 1, 2025
c8bc03c
Merge branch 'apache_main' into required-input-ordering
ozankabak May 1, 2025
51e7e80
Move normalization of sort expressions to equivalence group
ozankabak May 3, 2025
7252898
Improve comments
ozankabak May 3, 2025
6b63999
Merge branch 'apache_main' into required-input-ordering
ozankabak May 4, 2025
95c89b5
Improve display for EquivalenceProperties
ozankabak May 4, 2025
0cfb364
More idiomatic code
ozankabak May 6, 2025
277f867
More succinct code
ozankabak May 6, 2025
8060162
Remove extend_orderings from EquivalenceProperties
ozankabak May 6, 2025
703db4b
Simplify with_reorder
ozankabak May 6, 2025
b927015
Merge branch 'apache_main' into required-input-ordering
ozankabak May 6, 2025
2d38c14
Store normalized orderings - 1
ozankabak May 7, 2025
653ff87
Reduce time complexity of normalization w.r.t. number of equivalence …
ozankabak May 9, 2025
0c7b2e2
Merge branch 'apache_main' into required-input-ordering
ozankabak May 9, 2025
d6f7319
Simplify bridge_classes logic
ozankabak May 9, 2025
8cea6b4
Remove TODOs
ozankabak May 9, 2025
bf39ae7
Simplify generate_dependency_orderings
ozankabak May 9, 2025
ce84d2f
normalized orderings - 2
ozankabak May 9, 2025
0c99d3d
normalized orderings - 3
ozankabak May 10, 2025
1c2b911
undo normalized orderings
ozankabak May 11, 2025
c9d40d3
Merge branch 'apache_main' into required-input-ordering
ozankabak May 11, 2025
e8018bd
Fix logical conflicts
ozankabak May 11, 2025
5e65c35
Fix imports
ozankabak May 11, 2025
04e96f2
Remove noop code
ozankabak May 11, 2025
3a7d518
Move add_offset_to_expr
ozankabak May 11, 2025
3e4de1e
Remove mutation from LexOrdering
ozankabak May 12, 2025
2dbb8ce
Remove unwraps
ozankabak May 12, 2025
32efc62
Remove unwraps - 2
ozankabak May 12, 2025
6620506
Remove unwraps - 3
ozankabak May 12, 2025
0b61bea
Remove unwraps - 4
ozankabak May 12, 2025
93722a6
Remove collapse from LexOrdering
ozankabak May 12, 2025
e56ea33
Remove unwraps - 5
ozankabak May 13, 2025
22b216e
Remove unwraps - 6
ozankabak May 13, 2025
6e825a3
Remove unwraps - 7
ozankabak May 13, 2025
f9f2545
Remove unwraps - 8
ozankabak May 13, 2025
5df5233
Remove unwraps - 9
ozankabak May 13, 2025
8c70b7b
Remove unwraps - 10
ozankabak May 13, 2025
73294b6
Remove collapse from LexRequirement
ozankabak May 13, 2025
2448d2f
Merge branch 'apache_main' into required-input-ordering
ozankabak May 13, 2025
c2197f3
Simplify ordering_satisfy
ozankabak May 14, 2025
1685834
Enforce uniqueness in LexOrdering
ozankabak May 16, 2025
a1ae1cc
Fix with_reorder
ozankabak May 19, 2025
192ef41
Merge branch 'apache_main' into required-input-ordering
ozankabak May 19, 2025
34f1afc
Use tee
ozankabak May 19, 2025
d1b379a
Fix reorder api
ozankabak May 19, 2025
a87505e
Comment grammar
ozankabak May 20, 2025
4ac3c2b
Remove unwraps
ozankabak May 20, 2025
c704256
Cache normalized orderings
ozankabak May 30, 2025
a75ae44
Merge branch 'apache_main' into required-input-ordering
ozankabak May 30, 2025
e7bda2c
Minor: remove an unecessary clone in common_sort_prefix_length
alamb Jun 3, 2025
1aebf24
Merge pull request #72 from alamb/alamb/tweaks_to_input
berkaysynnada Jun 3, 2025
74d023b
Address reviews
ozankabak Jun 4, 2025
0d4e8b2
Merge branch 'apache_main' into required-input-ordering
ozankabak Jun 4, 2025
32de761
Merge branch 'apache_main' into required-input-ordering
ozankabak Jun 4, 2025
bde28fc
Merge branch 'apache_main' into required-input-ordering
ozankabak Jun 6, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 18 additions & 12 deletions benchmarks/src/sort.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,28 +70,31 @@ impl RunOpt {
let sort_cases = vec![
(
"sort utf8",
LexOrdering::new(vec![PhysicalSortExpr {
[PhysicalSortExpr {
expr: col("request_method", &schema)?,
options: Default::default(),
}]),
}]
.into(),
),
(
"sort int",
LexOrdering::new(vec![PhysicalSortExpr {
[PhysicalSortExpr {
expr: col("response_bytes", &schema)?,
options: Default::default(),
}]),
}]
.into(),
),
(
"sort decimal",
LexOrdering::new(vec![PhysicalSortExpr {
[PhysicalSortExpr {
expr: col("decimal_price", &schema)?,
options: Default::default(),
}]),
}]
.into(),
),
(
"sort integer tuple",
LexOrdering::new(vec![
[
PhysicalSortExpr {
expr: col("request_bytes", &schema)?,
options: Default::default(),
Expand All @@ -100,11 +103,12 @@ impl RunOpt {
expr: col("response_bytes", &schema)?,
options: Default::default(),
},
]),
]
.into(),
),
(
"sort utf8 tuple",
LexOrdering::new(vec![
[
// sort utf8 tuple
PhysicalSortExpr {
expr: col("service", &schema)?,
Expand All @@ -122,11 +126,12 @@ impl RunOpt {
expr: col("image", &schema)?,
options: Default::default(),
},
]),
]
.into(),
),
(
"sort mixed tuple",
LexOrdering::new(vec![
[
PhysicalSortExpr {
expr: col("service", &schema)?,
options: Default::default(),
Expand All @@ -139,7 +144,8 @@ impl RunOpt {
expr: col("decimal_price", &schema)?,
options: Default::default(),
},
]),
]
.into(),
),
];
for (title, expr) in sort_cases {
Expand Down
11 changes: 4 additions & 7 deletions datafusion-examples/examples/custom_file_format.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,27 +21,24 @@ use arrow::{
array::{AsArray, RecordBatch, StringArray, UInt8Array},
datatypes::{DataType, Field, Schema, SchemaRef, UInt64Type},
};
use datafusion::physical_expr::LexRequirement;
use datafusion::{
catalog::Session,
common::{GetExt, Statistics},
};
use datafusion::{
datasource::physical_plan::FileSource, execution::session_state::SessionStateBuilder,
};
use datafusion::{
datasource::{
file_format::{
csv::CsvFormatFactory, file_compression_type::FileCompressionType,
FileFormat, FileFormatFactory,
},
physical_plan::{FileScanConfig, FileSinkConfig},
physical_plan::{FileScanConfig, FileSinkConfig, FileSource},
MemTable,
},
error::Result,
execution::session_state::SessionStateBuilder,
physical_expr_common::sort_expr::LexRequirement,
physical_plan::ExecutionPlan,
prelude::SessionContext,
};

use object_store::{ObjectMeta, ObjectStore};
use tempfile::tempdir;

Expand Down
4 changes: 0 additions & 4 deletions datafusion-examples/examples/function_factory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,10 +150,6 @@ impl ScalarUDFImpl for ScalarFunctionWrapper {
Ok(ExprSimplifyResult::Simplified(replacement))
}

fn aliases(&self) -> &[String] {
&[]
}

fn output_ordering(&self, _input: &[ExprProperties]) -> Result<SortProperties> {
Ok(SortProperties::Unordered)
}
Expand Down
6 changes: 2 additions & 4 deletions datafusion/catalog/src/listing_schema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,7 @@ use std::sync::{Arc, Mutex};
use crate::{SchemaProvider, TableProvider, TableProviderFactory};

use crate::Session;
use datafusion_common::{
Constraints, DFSchema, DataFusionError, HashMap, TableReference,
};
use datafusion_common::{DFSchema, DataFusionError, HashMap, TableReference};
use datafusion_expr::CreateExternalTable;

use async_trait::async_trait;
Expand Down Expand Up @@ -143,7 +141,7 @@ impl ListingSchemaProvider {
order_exprs: vec![],
unbounded: false,
options: Default::default(),
constraints: Constraints::empty(),
constraints: Default::default(),
column_defaults: Default::default(),
},
)
Expand Down
38 changes: 16 additions & 22 deletions datafusion/catalog/src/memory/table.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,25 +23,22 @@ use std::fmt::Debug;
use std::sync::Arc;

use crate::TableProvider;
use datafusion_common::error::Result;
use datafusion_expr::Expr;
use datafusion_expr::TableType;
use datafusion_physical_expr::create_physical_sort_exprs;
use datafusion_physical_plan::repartition::RepartitionExec;
use datafusion_physical_plan::{
common, ExecutionPlan, ExecutionPlanProperties, Partitioning,
};

use arrow::datatypes::SchemaRef;
use arrow::record_batch::RecordBatch;
use datafusion_common::error::Result;
use datafusion_common::{not_impl_err, plan_err, Constraints, DFSchema, SchemaExt};
use datafusion_common_runtime::JoinSet;
use datafusion_datasource::memory::MemSink;
use datafusion_datasource::memory::MemorySourceConfig;
use datafusion_datasource::memory::{MemSink, MemorySourceConfig};
use datafusion_datasource::sink::DataSinkExec;
use datafusion_datasource::source::DataSourceExec;
use datafusion_expr::dml::InsertOp;
use datafusion_expr::SortExpr;
use datafusion_expr::{Expr, SortExpr, TableType};
use datafusion_physical_expr::{create_physical_sort_exprs, LexOrdering};
use datafusion_physical_plan::repartition::RepartitionExec;
use datafusion_physical_plan::{
common, ExecutionPlan, ExecutionPlanProperties, Partitioning,
};
use datafusion_session::Session;

use async_trait::async_trait;
Expand Down Expand Up @@ -89,7 +86,7 @@ impl MemTable {
.into_iter()
.map(|e| Arc::new(RwLock::new(e)))
.collect::<Vec<_>>(),
constraints: Constraints::empty(),
constraints: Constraints::default(),
column_defaults: HashMap::new(),
sort_order: Arc::new(Mutex::new(vec![])),
})
Expand Down Expand Up @@ -239,16 +236,13 @@ impl TableProvider for MemTable {
if !sort_order.is_empty() {
let df_schema = DFSchema::try_from(self.schema.as_ref().clone())?;

let file_sort_order = sort_order
.iter()
.map(|sort_exprs| {
create_physical_sort_exprs(
sort_exprs,
&df_schema,
state.execution_props(),
)
})
.collect::<Result<Vec<_>>>()?;
let eqp = state.execution_props();
let mut file_sort_order = vec![];
for sort_exprs in sort_order.iter() {
let physical_exprs =
create_physical_sort_exprs(sort_exprs, &df_schema, eqp)?;
file_sort_order.extend(LexOrdering::new(physical_exprs));
}
source = source.try_with_sort_information(file_sort_order)?;
}

Expand Down
15 changes: 5 additions & 10 deletions datafusion/catalog/src/stream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ impl StreamConfig {
Self {
source,
order: vec![],
constraints: Constraints::empty(),
constraints: Constraints::default(),
}
}

Expand Down Expand Up @@ -350,15 +350,10 @@ impl TableProvider for StreamTable {
input: Arc<dyn ExecutionPlan>,
_insert_op: InsertOp,
) -> Result<Arc<dyn ExecutionPlan>> {
let ordering = match self.0.order.first() {
Some(x) => {
let schema = self.0.source.schema();
let orders = create_ordering(schema, std::slice::from_ref(x))?;
let ordering = orders.into_iter().next().unwrap();
Some(ordering.into_iter().map(Into::into).collect())
}
None => None,
};
let schema = self.0.source.schema();
let orders = create_ordering(schema, &self.0.order)?;
// It is sufficient to pass only one of the equivalent orderings:
let ordering = orders.into_iter().next().map(Into::into);

Ok(Arc::new(DataSinkExec::new(
input,
Expand Down
38 changes: 14 additions & 24 deletions datafusion/common/src/functional_dependencies.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,35 +36,31 @@ pub enum Constraint {
}

/// This object encapsulates a list of functional constraints:
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Hash)]
#[derive(Clone, Debug, Default, Eq, Hash, PartialEq, PartialOrd)]
pub struct Constraints {
inner: Vec<Constraint>,
}

impl Constraints {
/// Create empty constraints
pub fn empty() -> Self {
Constraints::new_unverified(vec![])
}

/// Create a new [`Constraints`] object from the given `constraints`.
/// Users should use the [`Constraints::empty`] or [`SqlToRel::new_constraint_from_table_constraints`] functions
/// for constructing [`Constraints`]. This constructor is for internal
/// purposes only and does not check whether the argument is valid. The user
/// is responsible for supplying a valid vector of [`Constraint`] objects.
/// Users should use the [`Constraints::default`] or [`SqlToRel::new_constraint_from_table_constraints`]
/// functions for constructing [`Constraints`] instances. This constructor
/// is for internal purposes only and does not check whether the argument
/// is valid. The user is responsible for supplying a valid vector of
/// [`Constraint`] objects.
///
/// [`SqlToRel::new_constraint_from_table_constraints`]: https://docs.rs/datafusion/latest/datafusion/sql/planner/struct.SqlToRel.html#method.new_constraint_from_table_constraints
pub fn new_unverified(constraints: Vec<Constraint>) -> Self {
Self { inner: constraints }
}

/// Check whether constraints is empty
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
/// Extends the current constraints with the given `other` constraints.
pub fn extend(&mut self, other: Constraints) {
self.inner.extend(other.inner);
}

/// Projects constraints using the given projection indices.
/// Returns None if any of the constraint columns are not included in the projection.
/// Projects constraints using the given projection indices. Returns `None`
/// if any of the constraint columns are not included in the projection.
pub fn project(&self, proj_indices: &[usize]) -> Option<Self> {
let projected = self
.inner
Expand All @@ -74,14 +70,14 @@ impl Constraints {
Constraint::PrimaryKey(indices) => {
let new_indices =
update_elements_with_matching_indices(indices, proj_indices);
// Only keep constraint if all columns are preserved
// Only keep the constraint if all columns are preserved:
(new_indices.len() == indices.len())
.then_some(Constraint::PrimaryKey(new_indices))
}
Constraint::Unique(indices) => {
let new_indices =
update_elements_with_matching_indices(indices, proj_indices);
// Only keep constraint if all columns are preserved
// Only keep the constraint if all columns are preserved:
(new_indices.len() == indices.len())
.then_some(Constraint::Unique(new_indices))
}
Expand All @@ -93,15 +89,9 @@ impl Constraints {
}
}

impl Default for Constraints {
fn default() -> Self {
Constraints::empty()
}
}

impl IntoIterator for Constraints {
type Item = Constraint;
type IntoIter = IntoIter<Constraint>;
type IntoIter = IntoIter<Self::Item>;

fn into_iter(self) -> Self::IntoIter {
self.inner.into_iter()
Expand Down
7 changes: 2 additions & 5 deletions datafusion/core/benches/physical_plan.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,8 @@ fn sort_preserving_merge_operator(

let sort = sort
.iter()
.map(|name| PhysicalSortExpr {
expr: col(name, &schema).unwrap(),
options: Default::default(),
})
.collect::<LexOrdering>();
.map(|name| PhysicalSortExpr::new_default(col(name, &schema).unwrap()));
let sort = LexOrdering::new(sort).unwrap();

let exec = MemorySourceConfig::try_new_exec(
&batches.into_iter().map(|rb| vec![rb]).collect::<Vec<_>>(),
Expand Down
10 changes: 3 additions & 7 deletions datafusion/core/benches/sort.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@ use std::sync::Arc;
use arrow::array::StringViewArray;
use arrow::{
array::{DictionaryArray, Float64Array, Int64Array, StringArray},
compute::SortOptions,
datatypes::{Int32Type, Schema},
record_batch::RecordBatch,
};
Expand Down Expand Up @@ -272,14 +271,11 @@ impl BenchCase {

/// Make sort exprs for each column in `schema`
fn make_sort_exprs(schema: &Schema) -> LexOrdering {
schema
let sort_exprs = schema
.fields()
.iter()
.map(|f| PhysicalSortExpr {
expr: col(f.name(), schema).unwrap(),
options: SortOptions::default(),
})
.collect()
.map(|f| PhysicalSortExpr::new_default(col(f.name(), schema).unwrap()));
LexOrdering::new(sort_exprs).unwrap()
}

/// Create streams of int64 (where approximately 1/3 values is repeated)
Expand Down
6 changes: 3 additions & 3 deletions datafusion/core/benches/spm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ use arrow::array::{ArrayRef, Int32Array, Int64Array, RecordBatch, StringArray};
use datafusion_execution::TaskContext;
use datafusion_physical_expr::expressions::col;
use datafusion_physical_expr::PhysicalSortExpr;
use datafusion_physical_expr_common::sort_expr::LexOrdering;
use datafusion_physical_plan::sorts::sort_preserving_merge::SortPreservingMergeExec;
use datafusion_physical_plan::{collect, ExecutionPlan};

Expand Down Expand Up @@ -70,7 +69,7 @@ fn generate_spm_for_round_robin_tie_breaker(
let partitiones = vec![rbs.clone(); partition_count];

let schema = rb.schema();
let sort = LexOrdering::new(vec![
let sort = [
PhysicalSortExpr {
expr: col("b", &schema).unwrap(),
options: Default::default(),
Expand All @@ -79,7 +78,8 @@ fn generate_spm_for_round_robin_tie_breaker(
expr: col("c", &schema).unwrap(),
options: Default::default(),
},
]);
]
.into();

let exec = MemorySourceConfig::try_new_exec(&partitiones, schema, None).unwrap();
SortPreservingMergeExec::new(sort, exec)
Expand Down
Loading