/**************************************************************************
**
** This file is part of Nut project.
** https://github.com/HamedMasafi/Nut
**
** Nut is free software: you can redistribute it and/or modify
** it under the terms of the GNU Lesser General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** Nut is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public License
** along with Nut. If not, see .
**
**************************************************************************/
#ifndef PHRASE_H
#define PHRASE_H
#include
#include
#include
#include
#include
#include
#include
#include "defines.h"
#include "dbgeography.h"
NUT_BEGIN_NAMESPACE
class SqlGeneratorBase;
class PhraseData{
public:
enum Condition
{
NotAssign = 0,
Equal,
Less,
LessEqual,
Null,
In,
Like,
Not = 10,
NotEqual,
GreaterEqual,
Greater,
NotNull,
NotIn,
NotLike,
And = 20,
Or,
Append,
Set,
Add,
Minus,
Multiple,
Divide,
//special types
Distance
};
enum Type{
Field,
WithVariant,
WithOther,
WithoutOperand
};
Type type;
Condition operatorCond;
QString text;
const PhraseData *left;
const PhraseData *right;
QVariant operand;
PhraseData(const char *className, const char* s);
PhraseData(PhraseData *l, Condition o);
PhraseData(PhraseData *l, Condition o, const PhraseData *r);
PhraseData(PhraseData *l, Condition o, QVariant r);
~PhraseData();
};
class WherePhrase{
protected:
PhraseData *_data;
QSharedPointer _dataPointer;
public:
WherePhrase(const char *className, const char* s);
WherePhrase(const WherePhrase &l);
WherePhrase(WherePhrase *l);
WherePhrase(WherePhrase *l, PhraseData::Condition o);
WherePhrase(WherePhrase *l, PhraseData::Condition o, WherePhrase *r);
WherePhrase(WherePhrase *l, PhraseData::Condition o, QVariant r);
~WherePhrase();
WherePhrase operator ==(const WherePhrase &other);
WherePhrase operator !=(const WherePhrase &other);
WherePhrase operator <(const WherePhrase &other);
WherePhrase operator >(const WherePhrase &other);
WherePhrase operator <=(const WherePhrase &other);
WherePhrase operator >=(const WherePhrase &other);
WherePhrase operator !();
WherePhrase operator =(const WherePhrase &other);
WherePhrase operator +(const WherePhrase &other);
WherePhrase operator -(const WherePhrase &other);
WherePhrase operator *(const WherePhrase &other);
WherePhrase operator /(const WherePhrase &other);
WherePhrase operator &&(const WherePhrase &other);
WherePhrase operator ||(const WherePhrase &other);
WherePhrase operator &(const WherePhrase &other);
WherePhrase operator ==(const QVariant &other);
WherePhrase operator !=(const QVariant &other);
WherePhrase operator <(const QVariant &other);
WherePhrase operator >(const QVariant &other);
WherePhrase operator <=(const QVariant &other);
WherePhrase operator >=(const QVariant &other);
PhraseData *data() const;
};
template
class FieldPhrase: public WherePhrase{
public:
FieldPhrase(const char *className, const char* s);
WherePhrase operator =(const WherePhrase &other);
WherePhrase operator =(const QVariant &other);
WherePhrase operator +(const QVariant &other);
WherePhrase operator !();
WherePhrase isNull();
WherePhrase in(QList list);
// WherePhrase in(QStringList list);
WherePhrase like(QString pattern);
};
template
Q_OUTOFLINE_TEMPLATE FieldPhrase::FieldPhrase(const char *className, const char *s) : WherePhrase(className, s)
{
// qDebug() << "(" << this << ")" << "FieldPhrase ctor" << className << s;
}
template
Q_OUTOFLINE_TEMPLATE WherePhrase FieldPhrase::operator =(const QVariant &other)
{
return WherePhrase(this, PhraseData::Set, other);
}
template
Q_OUTOFLINE_TEMPLATE WherePhrase FieldPhrase::operator =(const WherePhrase &other)
{
return WherePhrase(this, PhraseData::Set, &other);
}
template
Q_OUTOFLINE_TEMPLATE WherePhrase FieldPhrase::operator+(const QVariant &other)
{
return WherePhrase(this, PhraseData::Add, other);
}
template
Q_OUTOFLINE_TEMPLATE WherePhrase FieldPhrase::operator !()
{
if(_data->operatorCond < 20)
_data->operatorCond = (PhraseData::Condition)((_data->operatorCond + 10) % 20);
else
qFatal("Operator ! can not aplied to non condition statements");
return this;//WherePhrase(this, PhraseData::Not);
}
template
Q_OUTOFLINE_TEMPLATE WherePhrase FieldPhrase::isNull(){
return WherePhrase(this, PhraseData::Null);
}
template
Q_OUTOFLINE_TEMPLATE WherePhrase FieldPhrase::in(QList list)
{
QVariantList vlist;
foreach (T t, list)
vlist.append(QVariant::fromValue(t));
return WherePhrase(this, PhraseData::In, vlist);
}
//template
//Q_OUTOFLINE_TEMPLATE WherePhrase FieldPhrase::in(QStringList list)
//{
// return WherePhrase(this, PhraseData::In, list);
//}
template
Q_OUTOFLINE_TEMPLATE WherePhrase FieldPhrase::like(QString pattern)
{
return WherePhrase(this, PhraseData::Like, pattern);
}
// Custom types
template<>
class FieldPhrase: public WherePhrase {
public:
FieldPhrase(const char *className, const char* s) : WherePhrase(className, s){
}
WherePhrase distance(const DbGeography &geo) {
return WherePhrase(this, PhraseData::Distance, QVariant::fromValue(geo));
}
};
// Custom types
template<>
class FieldPhrase: public WherePhrase {
public:
FieldPhrase(const char *className, const char* s) : WherePhrase(className, s){
}
WherePhrase distance(const QPoint &geo) {
return WherePhrase(this, PhraseData::Distance, QVariant::fromValue(geo));
}
WherePhrase operator =(const QPoint &other) {
return WherePhrase(this, PhraseData::Set, other);
}
};
// Custom types
template<>
class FieldPhrase: public WherePhrase {
public:
FieldPhrase(const char *className, const char* s) : WherePhrase(className, s){
}
WherePhrase distance(const QPointF &geo) {
return WherePhrase(this, PhraseData::Distance, QVariant::fromValue(geo));
}
WherePhrase operator =(const QPointF &other) {
return WherePhrase(this, PhraseData::Set, other);
}
};
template<>
class FieldPhrase: public WherePhrase{
public:
FieldPhrase(const char *className, const char* s) : WherePhrase(className, s){
}
WherePhrase operator ==(const bool &other) {
return WherePhrase(this, PhraseData::Equal, other ? 1 : 0);
}
WherePhrase operator =(const bool &other) {
return WherePhrase(this, PhraseData::Set, other ? 1 : 0);
}
WherePhrase operator !() {
return WherePhrase(this, PhraseData::Equal, 0);
}
};
NUT_END_NAMESPACE
#endif // PHRASE_H