Compare the sort expr as PostgreSQL's common_prefix_cmp():
(
sort_expr_a: &Sort,
sort_expr_b: &Sort,
schema: &DFSchemaRef,
)
| 561 | /// Compare the sort expr as PostgreSQL's common_prefix_cmp(): |
| 562 | /// <https://github.com/postgres/postgres/blob/master/src/backend/optimizer/plan/planner.c> |
| 563 | pub fn compare_sort_expr( |
| 564 | sort_expr_a: &Sort, |
| 565 | sort_expr_b: &Sort, |
| 566 | schema: &DFSchemaRef, |
| 567 | ) -> Ordering { |
| 568 | let Sort { |
| 569 | expr: expr_a, |
| 570 | asc: asc_a, |
| 571 | nulls_first: nulls_first_a, |
| 572 | } = sort_expr_a; |
| 573 | |
| 574 | let Sort { |
| 575 | expr: expr_b, |
| 576 | asc: asc_b, |
| 577 | nulls_first: nulls_first_b, |
| 578 | } = sort_expr_b; |
| 579 | |
| 580 | let ref_indexes_a = find_column_indexes_referenced_by_expr(expr_a, schema); |
| 581 | let ref_indexes_b = find_column_indexes_referenced_by_expr(expr_b, schema); |
| 582 | for (idx_a, idx_b) in ref_indexes_a.iter().zip(ref_indexes_b.iter()) { |
| 583 | match idx_a.cmp(idx_b) { |
| 584 | Ordering::Less => { |
| 585 | return Ordering::Less; |
| 586 | } |
| 587 | Ordering::Greater => { |
| 588 | return Ordering::Greater; |
| 589 | } |
| 590 | Ordering::Equal => {} |
| 591 | } |
| 592 | } |
| 593 | match ref_indexes_a.len().cmp(&ref_indexes_b.len()) { |
| 594 | Ordering::Less => return Ordering::Greater, |
| 595 | Ordering::Greater => { |
| 596 | return Ordering::Less; |
| 597 | } |
| 598 | Ordering::Equal => {} |
| 599 | } |
| 600 | match (asc_a, asc_b) { |
| 601 | (true, false) => { |
| 602 | return Ordering::Greater; |
| 603 | } |
| 604 | (false, true) => { |
| 605 | return Ordering::Less; |
| 606 | } |
| 607 | _ => {} |
| 608 | } |
| 609 | match (nulls_first_a, nulls_first_b) { |
| 610 | (true, false) => { |
| 611 | return Ordering::Less; |
| 612 | } |
| 613 | (false, true) => { |
| 614 | return Ordering::Greater; |
| 615 | } |
| 616 | _ => {} |
| 617 | } |
| 618 | Ordering::Equal |
| 619 | } |
| 620 |
no test coverage detected
searching dependent graphs…