blob: 38227816594fda237c1973dd5cffa0d0609ac4fc [file] [log] [blame]
/*
*************************************************************************
* Copyright (c) 2009, 2010 Actuate Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Actuate Corporation - initial API and implementation
*
*************************************************************************
*/
package org.eclipse.datatools.connectivity.oda.spec.valueexpr;
import java.sql.Types;
import org.eclipse.datatools.connectivity.oda.OdaException;
import org.eclipse.datatools.connectivity.oda.nls.Messages;
import org.eclipse.datatools.connectivity.oda.spec.ExpressionVariable;
import org.eclipse.datatools.connectivity.oda.spec.ValidationContext;
import org.eclipse.datatools.connectivity.oda.spec.ValueExpression;
/**
* A complex value expression whose value is resolved by combining
* two value expressions with a combined operator.
* @since 3.2.2 (DTP 1.7.2)
*/
public class CombinedValueExpression extends ValueExpression
{
private ValueExpression m_leftExpr;
private ValueExpression m_rightExpr;
private CombinedValueExpressionOperator m_operator;
public CombinedValueExpression( ValueExpression leftExpr,
CombinedValueExpressionOperator operator,
ValueExpression rightExpr )
{
if( leftExpr == null || rightExpr == null || operator == null )
throw new NullPointerException( Messages.bind( Messages.querySpec_NULL_CONSTRUCTOR_3ARGS,
new Object[]{CombinedValueExpression.class.getName(),leftExpr, operator, rightExpr} ));
m_leftExpr = leftExpr;
m_rightExpr = rightExpr;
m_operator = operator;
}
/**
* Returns the left value expression.
* @return an instance of ValueExpression
*/
public ValueExpression getLeftExpression()
{
return m_leftExpr;
}
/**
* Returns the right value expression.
* @return an instance of ValueExpression
*/
public ValueExpression getRightExpression()
{
return m_rightExpr;
}
/**
* Returns the combined operator.
* @return
*/
public CombinedValueExpressionOperator getCombinedOperator()
{
return m_operator;
}
/* (non-Javadoc)
* @see org.eclipse.datatools.connectivity.oda.spec.ValueExpression#validateSyntax(org.eclipse.datatools.connectivity.oda.spec.ValidationContext)
*/
@Override
public void validateSyntax( ValidationContext context ) throws OdaException
{
m_leftExpr.validateSyntax( context );
m_rightExpr.validateSyntax( context );
}
/* (non-Javadoc)
* @see org.eclipse.datatools.connectivity.oda.spec.ValueExpression#getName()
*/
@Override
public String getName()
{
return m_leftExpr.getName() +
ExpressionVariable.ALIAS_SEPARATOR +
m_operator.getLiteral() +
ExpressionVariable.ALIAS_SEPARATOR +
m_rightExpr.getName();
}
/* (non-Javadoc)
* @see org.eclipse.datatools.connectivity.oda.spec.ValueExpression#getOdaDataType()
*/
@Override
public Integer getOdaDataType()
{
// no data type explicitly specified
if( super.getOdaDataType() != null )
return super.getOdaDataType();
// not a built-in combined operator type
if( CombinedValueExpressionOperator.get( m_operator.getId() ) == null )
return UNKNOWN_ODA_DATA_TYPE;
// derive from the combined operator and/or combined expressions
// compare operator by id in case it is a custom contributed instance
if( m_operator.getId().equals( CombinedValueExpressionOperator.CONCATENATE ) ) // string concatenation
return Integer.valueOf( Types.CHAR );
Integer leftOdaDataType = m_leftExpr.getOdaDataType();
Integer rightOdaDataType = m_rightExpr.getOdaDataType();
if( leftOdaDataType == rightOdaDataType ||
(leftOdaDataType != null && leftOdaDataType.equals( rightOdaDataType )) )
return rightOdaDataType;
// for remaining built-in combined operator types
if( leftOdaDataType == null || leftOdaDataType == UNKNOWN_ODA_DATA_TYPE ||
rightOdaDataType == null || rightOdaDataType == UNKNOWN_ODA_DATA_TYPE )
return UNKNOWN_ODA_DATA_TYPE;
if( isNumeric( leftOdaDataType ) && isNumeric( rightOdaDataType ) )
{
int leftOdaDataTypeCode = leftOdaDataType.intValue();
int rightOdaDataTypeCode = rightOdaDataType.intValue();
// combined data type is the most scaled data type of the 2 operands
if( leftOdaDataTypeCode == Types.DECIMAL || rightOdaDataTypeCode == Types.DECIMAL )
return Integer.valueOf( Types.DECIMAL );
if( leftOdaDataTypeCode == Types.DOUBLE || rightOdaDataTypeCode == Types.DOUBLE )
return Integer.valueOf( Types.DOUBLE );
if( leftOdaDataTypeCode == Types.INTEGER || rightOdaDataTypeCode == Types.INTEGER )
return Integer.valueOf( Types.INTEGER );
}
// TODO - handles other data types besides numeric ones
return UNKNOWN_ODA_DATA_TYPE;
}
/*
* (non-Javadoc)
* @see org.eclipse.datatools.connectivity.oda.spec.ValueExpression#toString()
*/
@Override
public String toString()
{
StringBuffer buffer = new StringBuffer( CombinedValueExpression.class.getSimpleName() + SPACE );
buffer.append( m_leftExpr.getName() + SPACE + m_operator.getLiteral() + SPACE + m_rightExpr.getName() );
buffer.append( "\n leftExpr=" + LEFT_CURLY_BRACKET + m_leftExpr + RIGHT_CURLY_BRACKET ); //$NON-NLS-1$
buffer.append( "\n operator= " + m_operator ); //$NON-NLS-1$
buffer.append( "\n rightExpr=" + LEFT_CURLY_BRACKET + m_rightExpr + RIGHT_CURLY_BRACKET ); //$NON-NLS-1$
return buffer.toString();
}
}