'Returns a filter representing the intersection of self and other.'

def intersect(self, other):

    if isinstance(other, PropertyFilter):
        other = self.from_property_filter(other)
    elif (not isinstance(other, _PropertyRangeFilter)):
        raise datastore_errors.BadArgumentError(('other    argument    should    be    a    _PropertyRangeFilter    (%r)' % (other,)))
    if (other._get_prop_name() != self._get_prop_name()):
        raise datastore_errors.BadArgumentError(('other    argument    must    be    on    the    same    property    (%s    !=    %s)' % (other._get_prop_name(), self._get_prop_name())))
    start_source = None
    if other._start:
        if self._start:
            result = cmp(self._get_start_key_value(), other._get_start_key_value())
            if (result == 0):
                result = cmp(other._start_incl, self._start_incl)
            if (result > 0):
                start_source = self
            elif (result < 0):
                start_source = other
        else:
            start_source = other
    elif self._start:
        start_source = self
    end_source = None
    if other._end:
        if self._end:
            result = cmp(self._get_end_key_value(), other._get_end_key_value())
            if (result == 0):
                result = cmp(self._end_incl, other._end_incl)
            if (result < 0):
                end_source = self
            elif (result > 0):
                end_source = other
        else:
            end_source = other
    elif self._end:
        end_source = self
    if start_source:
        if (end_source in (start_source, None)):
            return start_source
        result = _PropertyRangeFilter(start=start_source._start, start_incl=start_source._start_incl, end=end_source._end, end_incl=end_source._end_incl)
        result._start_key_value = start_source._start_key_value
        result._end_key_value = end_source._end_key_value
        return result
    else:
        return (end_source or self)
