def _replace_interval_with_scalar(expr):
    """
    Good old Depth-First Search to identify the Interval and IntervalValue
    components of the expression and return a comparable scalar expression.

    Parameters
    ----------
    expr : float or expression of intervals
        For example, ``ibis.interval(days=1) + ibis.interval(hours=5)``

    Returns
    -------
    preceding : float or ir.FloatingScalar, depending upon the expr
    """
    try:
        expr_op = expr.op()
    except AttributeError:
        expr_op = None

    if not isinstance(expr, (dt.Interval, ir.IntervalValue)):
        # Literal expressions have op method but native types do not.
        if isinstance(expr_op, ops.Literal):
            return expr_op.value
        else:
            return expr
    elif isinstance(expr, dt.Interval):
        try:
            microseconds = _map_interval_to_microseconds[expr.unit]
            return microseconds
        except KeyError:
            raise ValueError(
                "Expected preceding values of week(), "
                + "day(), hour(), minute(), second(), millisecond(), "
                + "microseconds(), nanoseconds(); got {}".format(expr)
            )
    elif expr_op.args and isinstance(expr, ir.IntervalValue):
        if len(expr_op.args) > 2:
            raise com.NotImplementedError(
                "'preceding' argument cannot be parsed."
            )
        left_arg = _replace_interval_with_scalar(expr_op.args[0])
        right_arg = _replace_interval_with_scalar(expr_op.args[1])
        method = _map_interval_op_to_op[type(expr_op)]
        return method(left_arg, right_arg)
def _replace_interval_with_scalar ( expr ) : try : expr_op = expr . op ( ) except AttributeError : expr_op = None if not isinstance ( expr , ( dt . Interval , ir . IntervalValue ) ) : if isinstance ( expr_op , ops . Literal ) : return expr_op . value else : return expr elif isinstance ( expr , dt . Interval ) : try : microseconds = _map_interval_to_microseconds [ expr . unit ] return microseconds except KeyError : raise ValueError ( "Expected preceding values of week(), " + "day(), hour(), minute(), second(), millisecond(), " + "microseconds(), nanoseconds(); got {}" . format ( expr ) ) elif expr_op . args and isinstance ( expr , ir . IntervalValue ) : if len ( expr_op . args ) > 2 : raise com . NotImplementedError ( "'preceding' argument cannot be parsed." ) left_arg = _replace_interval_with_scalar ( expr_op . args [ 0 ] ) right_arg = _replace_interval_with_scalar ( expr_op . args [ 1 ] ) method = _map_interval_op_to_op [ type ( expr_op ) ] return method ( left_arg , right_arg )
Good old Depth-First Search to identify the Interval and IntervalValue
    components of the expression and return a comparable scalar expression.

    Parameters
    ----------
    expr : float or expression of intervals
        For example, ``ibis.interval(days=1) + ibis.interval(hours=5)``

    Returns
    -------
    preceding : float or ir.FloatingScalar, depending upon the expr