1515// specific language governing permissions and limitations
1616// under the License.
1717
18- use std:: fmt:: Display ;
19- use std:: hash:: Hash ;
20- use std:: sync:: Arc ;
21-
2218use crate :: equivalence:: add_offset_to_expr;
2319use crate :: { LexOrdering , PhysicalExpr , PhysicalSortExpr } ;
2420use arrow_schema:: SortOptions ;
21+ use std:: fmt:: Display ;
22+ use std:: hash:: Hash ;
23+ use std:: sync:: Arc ;
24+ use std:: vec:: IntoIter ;
2525
2626/// An `OrderingEquivalenceClass` object keeps track of different alternative
2727/// orderings than can describe a schema. For example, consider the following table:
@@ -36,15 +36,15 @@ use arrow_schema::SortOptions;
3636///
3737/// Here, both `vec![a ASC, b ASC]` and `vec![c DESC, d ASC]` describe the table
3838/// ordering. In this case, we say that these orderings are equivalent.
39- #[ derive( Debug , Clone , Eq , PartialEq , Hash ) ]
39+ #[ derive( Debug , Clone , Eq , PartialEq , Hash , Default ) ]
4040pub struct OrderingEquivalenceClass {
4141 pub orderings : Vec < LexOrdering > ,
4242}
4343
4444impl OrderingEquivalenceClass {
4545 /// Creates new empty ordering equivalence class.
4646 pub fn empty ( ) -> Self {
47- Self { orderings : vec ! [ ] }
47+ Default :: default ( )
4848 }
4949
5050 /// Clears (empties) this ordering equivalence class.
@@ -197,6 +197,15 @@ impl OrderingEquivalenceClass {
197197 }
198198}
199199
200+ impl IntoIterator for OrderingEquivalenceClass {
201+ type Item = LexOrdering ;
202+ type IntoIter = IntoIter < LexOrdering > ;
203+
204+ fn into_iter ( self ) -> Self :: IntoIter {
205+ self . orderings . into_iter ( )
206+ }
207+ }
208+
200209/// This function constructs a duplicate-free `LexOrdering` by filtering out
201210/// duplicate entries that have same physical expression inside. For example,
202211/// `vec![a ASC, a DESC]` collapses to `vec![a ASC]`.
@@ -229,10 +238,10 @@ impl Display for OrderingEquivalenceClass {
229238 write ! ( f, "[" ) ?;
230239 let mut iter = self . orderings . iter ( ) ;
231240 if let Some ( ordering) = iter. next ( ) {
232- write ! ( f, "{} " , PhysicalSortExpr :: format_list( ordering) ) ?;
241+ write ! ( f, "[{}] " , PhysicalSortExpr :: format_list( ordering) ) ?;
233242 }
234243 for ordering in iter {
235- write ! ( f, "{} " , PhysicalSortExpr :: format_list( ordering) ) ?;
244+ write ! ( f, ", [{}] " , PhysicalSortExpr :: format_list( ordering) ) ?;
236245 }
237246 write ! ( f, "]" ) ?;
238247 Ok ( ( ) )
0 commit comments