'Create a map of all *equivalent* columns, based on
the determination of column pairs that are equated to
one another based on inherit condition.  This is designed
to work with the queries that util.polymorphic_union
comes up with, which often don\'t include the columns from
the base table directly (including the subclass table columns
only).
The resulting structure is a dictionary of columns mapped
to lists of equivalent columns, i.e.
tablea.col1:
set([tableb.col1, tablec.col1]),
tablea.col2:
set([tabled.col2])'

@_memoized_configured_property
def _equivalent_columns(self):

    result = util.column_dict()
    def visit_binary(binary):
        if (binary.operator == operators.eq):
            if (binary.left in result):
                result[binary.left].add(binary.right)
            else:
                result[binary.left] = util.column_set((binary.right,))
            if (binary.right in result):
                result[binary.right].add(binary.left)
            else:
                result[binary.right] = util.column_set((binary.left,))
    for mapper in self.base_mapper.self_and_descendants:
        if (mapper.inherit_condition is not None):
            visitors.traverse(mapper.inherit_condition, {}, {'binary': visit_binary})
    return result
