def lift(self, expr, block=None):
        # This use of id() is OK since only for memoization
        key = id(expr.op()), block

        if self.lift_memo in key:
            return self.lift_memo[key]

        op = expr.op()

        if isinstance(op, ops.ValueNode):
            return self._sub(expr, block=block)
        elif isinstance(op, ops.Selection):
            result = self._lift_Selection(expr, block=block)
        elif isinstance(op, ops.Join):
            result = self._lift_Join(expr, block=block)
        elif isinstance(op, (ops.TableNode, HasSchema)):
            return expr
        else:
            return self._sub(expr, block=block)

        # If we get here, time to record the modified expression in our memo to
        # avoid excessive graph-walking
        self.lift_memo[key] = result
        return result
dataset/ETHPy150Open cloudera/ibis/ibis/expr/analysis.py/ExprSimplifier.lift/swapped operands of `in`