#include "expression.h"
#include "query.h"
#include "baseadaptor.h"

bool Expression::canConvert( const QVariant &other )
{
    if( qVariantCanConvert<Expression>( other ) )
        return true;

    return false;
}

Expression Expression::convert( const QVariant &other )
{
    return qVariantValue<Expression>( other );
}

Expression::Expression( const BaseAdaptor *db,
            QString(BaseAdaptor::*call)(const QVariantList& )const,
            const QVariantList &args) : Argument( db, call,args)
{
    m_nativeTypeId = qMetaTypeId<Expression>();
}

Expression Expression::operator +( const QVariant &other ) const
{
    QVariantList args;
    args << toVariant();
    args << other;
    return Expression(m_db,&BaseAdaptor::ADD,args );
}

Expression Expression::operator / ( const QVariant &other ) const
{
    QVariantList args;
    args << toVariant();
    args << other;
    return Expression(m_db,&BaseAdaptor::DIV,args );
}

Expression Expression::operator * ( const QVariant &other ) const
{
    QVariantList args;
    args << toVariant();
    args << other;
    return Expression(m_db,&BaseAdaptor::MUL,args );
}

Expression Expression::operator - ( const QVariant &other ) const
{

    if ( other.type() == QVariant::Int ||
         other.type() == QVariant::Date ||
         other.type() == QVariant::DateTime ||
         other.type() == QVariant::Time ||
         other.type() == QVariant::Double ||
         other.type() == QVariant::LongLong
       )
    {
        QVariantList args;
        args << toVariant();
        args << other;
        return Expression(m_db,&BaseAdaptor::SUB,args);
    }
    else
        qFatal("Subtraction opperation not supported by fieldtype");

}

Expression Expression::operator | ( const QVariant &other ) const
{
    QVariantList args;
    args << toVariant();
    args << other;
    return Expression(m_db,&BaseAdaptor::COMMA,args );
}

Query Expression::operator < ( const QVariant &other ) const
{
    QVariantList args;
    args << toVariant();
    args << other;
    return Query(m_db,&BaseAdaptor::LT,args);
}

Query Expression::operator <=( const QVariant &other ) const
{
    QVariantList args;
    args << toVariant();
    args << other;
    return Query(m_db,&BaseAdaptor::LE,args);
}

Query Expression::operator ==( const QVariant &other ) const
{
    QVariantList args;
    args << toVariant();
    args << other;
    return Query(m_db,&BaseAdaptor::EQ,args);
}

Query Expression::operator !=( const QVariant &other ) const
{
    QVariantList args;
    args << toVariant();
    args << other;
    return Query(m_db,&BaseAdaptor::NE,args);
}

Query Expression::operator > ( const QVariant &other ) const
{
    QVariantList args;
    args << toVariant();
    args << other;
    return Query(m_db,&BaseAdaptor::GT,args);
}

Query Expression::operator >=( const QVariant &other ) const
{
    QVariantList args;
    args << toVariant();
    args << other;
    return Query(m_db,&BaseAdaptor::GE,args);
}

Query Expression::like( const QVariant &other ) const
{
    QVariantList args;
    args << toVariant();
    args << other;
    return Query(m_db,&BaseAdaptor::LIKE,args);
}

Query Expression::belongs( const QVariant &other ) const
{
    QVariantList args;
    args << toVariant();
    args << other;
    return Query(m_db,&BaseAdaptor::BELONGS,args);
}

Expression Expression::operator ! () const
{
    QVariantList args;
    args << toVariant();
    return Expression(m_db,&BaseAdaptor::DESC,args );
}

