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

View File

@ -48,12 +48,15 @@ public:
~Query();
QList<T *> toList(int count = -1);
int remove();
T *first();
int count();
QList<T *> toList(int count = -1);
template<typename F>
QList<F> select(const FieldPhrase<F> f);
QVariant max(FieldPhrase<int> &f);
QVariant min(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));
QString sql = d->database->sqlGenertor()->selectCommand(
SqlGeneratorBase::SelectALl,
SqlGeneratorBase::SelectAll,
"",
d->wheres,
d->orderPhrases,
@ -179,6 +182,30 @@ Q_OUTOFLINE_TEMPLATE QList<T *> Query<T>::toList(int count)
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>
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
{
switch (t) {
case SelectALl:
case SelectAll:
return "*";
break;
@ -240,6 +240,10 @@ QString SqlGeneratorBase::agregateText(const AgregateType &t, const QString &arg
return "COUNT(" + arg + ")";
break;
case SignleField:
return arg;
break;
default:
return QString::null;
}
@ -309,6 +313,34 @@ QString SqlGeneratorBase::selectCommand(SqlGeneratorBase::AgregateType t, QStrin
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)
{
return selectCommand("*", wheres, orders, tableName, joinClassName);

View File

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