An EquivalenceClass is a set of Arc<dyn PhysicalExpr>s that are known
to have the same value for all tuples in a relation. These are generated by
equality predicates (e.g. a = b), typically equi-join conditions and
equality conditions in filters.
An OrderingEquivalenceClass object keeps track of different alternative
orderings than can describe a schema. For example, consider the following table:
Calculates the union (in the sense of UnionExec) EquivalenceProperties
of the given EquivalenceProperties in eqps according to the given
output schema (which need not be the same with those of lhs and rhs
as details such as nullability may be different).
This function constructs a duplicate-free LexOrderingReq by filtering out
duplicate entries that have same physical expression inside. For example,
vec![a Some(ASC), a Some(DESC)] collapses to vec![a Some(ASC)].