/*
 * ESTEAM Software GmbH, 22.02.2022
 */
package org.apache.empire.db.expr.column;

import java.util.Set;

import org.apache.empire.commons.StringUtils;
import org.apache.empire.db.DBColumn;
import org.apache.empire.db.DBColumnExpr;
import org.apache.empire.db.DBExpr;
import org.apache.empire.dbms.DBSqlPhrase;

public class DBCoalesceExpr extends DBAbstractFuncExpr
{
    private final Object nullValue;
    
    public DBCoalesceExpr(DBColumnExpr expr, Object nullValue)
    {
        super(expr, expr.getUpdateColumn(), false, expr.getDataType());
        // set the null value
        this.nullValue = nullValue;
    }

    /**
     * This is a transparent wrapper
     */
    @Override
    public boolean isWrapper()
    {   // yep
        return true;
    }

    @Override
    public DBColumnExpr unwrap()
    {
        return expr;
    }

    @Override
    protected String getFunctionName()
    {
        return StringUtils.EMPTY;
    }
    
    /**
     * Returns the column name.
     */
    @Override
    public String getName()
    {
        return expr.getName();
    }
    
    /**
     * Returns the column enum type
     */
    @Override
    public Class<Enum<?>> getEnumType()
    {
        return expr.getEnumType();
    }
    
    /**
     * Returns true if other is equal to this expression  
     */
    @Override
    public boolean equals(Object other)
    {
        if (other==this)
            return true;
        // Check Type
        if (other instanceof DBCoalesceExpr)
        {   // Compare expressions
            DBColumnExpr otherExpr = ((DBCoalesceExpr)other).expr;
            return this.expr.equals(otherExpr);
        }
        return false;
    }

    /**
     * @see org.apache.empire.db.DBExpr#addReferencedColumns(Set)
     */
    @Override
    public void addReferencedColumns(Set<DBColumn> list)
    {
        super.addReferencedColumns(list);
        // add referenced columns
        if (nullValue instanceof DBExpr)
            ((DBExpr)nullValue).addReferencedColumns(list);
    }

    @Override
    public void addSQL(StringBuilder sql, long context)
    {
        // Get the template
        String template = getDbms().getSQLPhrase(DBSqlPhrase.SQL_FUNC_COALESCE);
        // Add SQL
        super.addSQL(sql, template, new Object[] { nullValue }, context);
    }

}
