Checks if the other index already fulfills
        all the indexing and constraint needs of the current one.

        :param other: The other index
        :type other: Index

        :rtype: bool

def is_fullfilled_by(self, other):
        """
        Checks if the other index already fulfills
        all the indexing and constraint needs of the current one.

        :param other: The other index
        :type other: Index

        :rtype: bool
        """
        # allow the other index to be equally large only. It being larger is an option
        # but it creates a problem with scenarios of the kind PRIMARY KEY(foo,bar) UNIQUE(foo)
        if len(other.get_columns()) != len(self.get_columns()):
            return False

        # Check if columns are the same, and even in the same order
        if not self.spans_columns(other.get_columns()):
            return False

        if not self.same_partial_index(other):
            return False

        if self.is_simple_index():
            # this is a special case: If the current key is neither primary or unique,
            # any unique or primary key will always have the same effect
            # for the index and there cannot be any constraint overlaps.
            # This means a primary or unique index can always fulfill
            # the requirements of just an index that has no constraints.
            return True

        if other.is_primary() != self.is_primary():
            return False

        if other.is_unique() != self.is_unique():
            return False

        return True