wip: select command creation refactoring

This commit is contained in:
blackdal 2017-05-30 12:38:12 +04:30
parent 0d8bd9b96b
commit c65d0e748c
4 changed files with 71 additions and 5 deletions

View File

@ -308,6 +308,7 @@ Database::Database(QObject *parent)
// d->changeLogs->sett // d->changeLogs->sett
DatabasePrivate::lastId++; DatabasePrivate::lastId++;
// m__change_logs = new TableSet<ChangeLogTable>(this); // m__change_logs = new TableSet<ChangeLogTable>(this);
qDebug() << "normal constructor called in database";
} }
Database::Database(const Database &other, QObject *parent) Database::Database(const Database &other, QObject *parent)
@ -323,6 +324,7 @@ Database::Database(const Database &other, QObject *parent)
setUserName(other.userName()); setUserName(other.userName());
setPassword(other.password()); setPassword(other.password());
qDebug() << "copy constructor called in database";
// m__change_logs = new TableSet<ChangeLogTable>(this); // m__change_logs = new TableSet<ChangeLogTable>(this);
} }

View File

@ -48,12 +48,15 @@ public:
~Query(); ~Query();
QList<T *> toList(int count = -1);
int remove(); int remove();
T *first(); T *first();
int count(); int count();
QList<T *> toList(int count = -1);
template<typename F>
QList<F> select(const FieldPhrase<F> f);
QVariant max(FieldPhrase<int> &f); QVariant max(FieldPhrase<int> &f);
QVariant min(FieldPhrase<int> &f); QVariant min(FieldPhrase<int> &f);
QVariant average(FieldPhrase<int> &f); QVariant average(FieldPhrase<int> &f);
@ -104,7 +107,7 @@ Q_OUTOFLINE_TEMPLATE QList<T *> Query<T>::toList(int count)
// QSqlQuery q = d->database->exec(d->database->sqlGenertor()->selectCommand(d->wheres, d->orders, d->tableName, d->joinClassName)); // QSqlQuery q = d->database->exec(d->database->sqlGenertor()->selectCommand(d->wheres, d->orders, d->tableName, d->joinClassName));
QString sql = d->database->sqlGenertor()->selectCommand( QString sql = d->database->sqlGenertor()->selectCommand(
SqlGeneratorBase::SelectALl, SqlGeneratorBase::SelectAll,
"", "",
d->wheres, d->wheres,
d->orderPhrases, d->orderPhrases,
@ -179,6 +182,30 @@ Q_OUTOFLINE_TEMPLATE QList<T *> Query<T>::toList(int count)
return result; return result;
} }
template <typename T>
template <typename F>
Q_OUTOFLINE_TEMPLATE QList<F> Query<T>::select(const FieldPhrase<F> f)
{
Q_D(Query);
QList<F> ret;
QString sql = d->database->sqlGenertor()->selectCommand(
SqlGeneratorBase::SignleField,
f.data()->text,
d->wheres,
d->orderPhrases,
d->tableName,
d->joinClassName);
QSqlQuery q = d->database->exec(sql);
while (q.next()) {
QVariant v = q.value(f.data()->text);
ret.append(v.value<F>());
}
deleteLater();
return ret;
}
template<class T> template<class T>
Q_OUTOFLINE_TEMPLATE T *Query<T>::first() Q_OUTOFLINE_TEMPLATE T *Query<T>::first()
{ {

View File

@ -220,7 +220,7 @@ QString SqlGeneratorBase::deleteRecord(Table *t, QString tableName)
QString SqlGeneratorBase::agregateText(const AgregateType &t, const QString &arg) const QString SqlGeneratorBase::agregateText(const AgregateType &t, const QString &arg) const
{ {
switch (t) { switch (t) {
case SelectALl: case SelectAll:
return "*"; return "*";
break; break;
@ -240,6 +240,10 @@ QString SqlGeneratorBase::agregateText(const AgregateType &t, const QString &arg
return "COUNT(" + arg + ")"; return "COUNT(" + arg + ")";
break; break;
case SignleField:
return arg;
break;
default: default:
return QString::null; return QString::null;
} }
@ -309,6 +313,34 @@ QString SqlGeneratorBase::selectCommand(SqlGeneratorBase::AgregateType t, QStrin
return sql; return sql;
} }
QString SqlGeneratorBase::selectCommand(QString selectPhrase, QString agregateArg,
QList<WherePhrase> &wheres, QList<WherePhrase> &orders,
QString tableName, QString joinClassName)
{
QString where = createWhere(wheres);
QString order = "";
QString from = fromTableText(tableName, joinClassName, order);
foreach(WherePhrase p, orders){
if(order != "")
order.append(", ");
order.append(phraseOrder(p.data()));
}
QString sql = "SELECT " + selectPhrase + " FROM " + from;
if(where != "")
sql.append(" WHERE " + where);
if(order != "")
sql.append(" ORDER BY " + order);
for(int i = 0; i < _database->model().count(); i++)
sql = sql.replace(_database->model().at(i)->className() + "." , _database->model().at(i)->name() + ".");
return sql;
}
QString SqlGeneratorBase::selectCommand(QList<WherePhrase> &wheres, QHash<QString, QString> &orders, QString tableName, QString joinClassName) QString SqlGeneratorBase::selectCommand(QList<WherePhrase> &wheres, QHash<QString, QString> &orders, QString tableName, QString joinClassName)
{ {
return selectCommand("*", wheres, orders, tableName, joinClassName); return selectCommand("*", wheres, orders, tableName, joinClassName);

View File

@ -48,11 +48,12 @@ public:
Delete Delete
}; };
enum AgregateType{ enum AgregateType{
SelectALl, SelectAll,
Count, Count,
Min, Min,
Max, Max,
Average Average,
SignleField
}; };
SqlGeneratorBase(Database *parent); SqlGeneratorBase(Database *parent);
@ -79,6 +80,10 @@ public:
QList<WherePhrase> &wheres, QList<WherePhrase> &orders, QList<WherePhrase> &wheres, QList<WherePhrase> &orders,
QString tableName, QString joinClassName); QString tableName, QString joinClassName);
virtual QString selectCommand(QString selectPhrase, QString agregateArg,
QList<WherePhrase> &wheres, QList<WherePhrase> &orders,
QString tableName, QString joinClassName);
virtual QString selectCommand(QList<WherePhrase> &wheres, QHash<QString, QString> &orders, virtual QString selectCommand(QList<WherePhrase> &wheres, QHash<QString, QString> &orders,
QString tableName, QString joinClassName); QString tableName, QString joinClassName);
virtual QString selectCommand(QString selectPhrase, virtual QString selectCommand(QString selectPhrase,