protected IAType getResultType()

in asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/NumericDivideTypeComputer.java [40:131]


    protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) throws AlgebricksException {
        IAType t1 = strippedInputTypes[0];
        IAType t2 = strippedInputTypes[1];
        ATypeTag tag1 = t1.getTypeTag();
        ATypeTag tag2 = t2.getTypeTag();

        IAType type;
        switch (tag1) {
            case DOUBLE:
                switch (tag2) {
                    case TINYINT:
                    case SMALLINT:
                    case INTEGER:
                    case BIGINT:
                    case FLOAT:
                    case DOUBLE:
                        type = BuiltinType.ADOUBLE;
                        break;
                    case ANY:
                        type = BuiltinType.ANY;
                        break;
                    default:
                        return BuiltinType.ANULL;
                }
                break;
            case FLOAT:
                switch (tag2) {
                    case TINYINT:
                    case SMALLINT:
                    case INTEGER:
                    case BIGINT:
                    case FLOAT:
                        type = BuiltinType.AFLOAT;
                        break;
                    case DOUBLE:
                        type = BuiltinType.ADOUBLE;
                        break;
                    case ANY:
                        type = BuiltinType.ANY;
                        break;
                    default:
                        return BuiltinType.ANULL;
                }
                break;
            case BIGINT:
            case INTEGER:
            case SMALLINT:
            case TINYINT:
                switch (tag2) {
                    case TINYINT:
                    case SMALLINT:
                    case INTEGER:
                    case BIGINT:
                    case DOUBLE:
                        type = BuiltinType.ADOUBLE;
                        break;
                    case FLOAT:
                        type = BuiltinType.AFLOAT;
                        break;
                    case ANY:
                        type = BuiltinType.ANY;
                        break;
                    default:
                        return BuiltinType.ANULL;
                }
                break;
            case ANY:
                switch (tag2) {
                    case TINYINT:
                    case SMALLINT:
                    case INTEGER:
                    case BIGINT:
                    case FLOAT:
                    case ANY:
                    case DOUBLE:
                        type = BuiltinType.ANY;
                        break;
                    default:
                        return BuiltinType.ANULL;
                }
                break;
            default:
                return BuiltinType.ANULL;
        }

        if (type.getTypeTag() != ATypeTag.ANY) {
            // returns NULL if division by 0
            type = AUnionType.createNullableType(type);
        }

        return type;
    }