def not_in other
case other
when Arel::SelectManager
Arel::Nodes::NotIn.new(self, other.ast)
when Range
if other.begin == -Float::INFINITY && other.end == Float::INFINITY
Nodes::In.new self, []
elsif other.end == Float::INFINITY
Nodes::LessThan.new(self, other.begin)
elsif other.begin == -Float::INFINITY && other.exclude_end?
Nodes::GreaterThanOrEqual.new(self, other.end)
elsif other.begin == -Float::INFINITY
Nodes::GreaterThan.new(self, other.end)
elsif other.exclude_end?
left = Nodes::LessThan.new(self, other.begin)
right = Nodes::GreaterThanOrEqual.new(self, other.end)
Nodes::Or.new left, right
else
left = Nodes::LessThan.new(self, other.begin)
right = Nodes::GreaterThan.new(self, other.end)
Nodes::Or.new left, right
end
else
Nodes::NotIn.new self, other
end
end