Class ReduceDecimalsRule.ReinterpretExpander

  • Enclosing class:
    ReduceDecimalsRule

    private class ReduceDecimalsRule.ReinterpretExpander
    extends ReduceDecimalsRule.RexExpander
    This expander simplifies reinterpret calls. Consider (1.0+1)*1. The inner operation encodes a decimal (Reinterpret(...)) which the outer operation immediately decodes: (Reinterpret(Reinterpret(...))). Arithmetic overflow is handled by underlying integer operations, so we don't have to consider it. Simply remove the nested Reinterpret.
    • Constructor Detail

      • ReinterpretExpander

        private ReinterpretExpander​(RexBuilder builder)
    • Method Detail

      • canExpand

        public boolean canExpand​(RexCall call)
        Description copied from class: ReduceDecimalsRule.RexExpander
        This defaults to the utility method, RexUtil.requiresDecimalExpansion(RexNode, boolean) which checks general guidelines on whether a rewrite should be considered at all. In general, it is helpful to update the utility method since that method is often used to filter the somewhat expensive rewrite process.

        However, this method provides another place for implementations of RexExpander to make a more detailed analysis before deciding on whether to perform a rewrite.

        Overrides:
        canExpand in class ReduceDecimalsRule.RexExpander
      • canSimplify

        private boolean canSimplify​(RexCall outer,
                                    RexCall inner,
                                    RexNode value)
        Detect, in a generic, but strict way, whether it is possible to simplify a reinterpret cast. The rules are as follows:
        1. If value is not the same basic type as outer, then we cannot simplify
        2. If the value is nullable but the inner or outer are not, then we cannot simplify.
        3. If inner is nullable but outer is not, we cannot simplify.
        4. If an overflow check is required from either inner or outer, we cannot simplify.
        5. Otherwise, given the same type, and sufficient nullability constraints, we can simplify.
        Parameters:
        outer - outer call to reinterpret
        inner - inner call to reinterpret
        value - inner value
        Returns:
        whether the two reinterpret casts can be removed