Revision 1b167b6c
Von Christian Ehringfeld vor mehr als 8 Jahren hinzugefügt
src/queryinterpreter.cpp | ||
---|---|---|
#include "orderby.h"
|
||
#include "expression.h"
|
||
#include "schema.h"
|
||
#include <QDebug>
|
||
using namespace CuteEntityManager;
|
||
|
||
|
||
... | ... | |
this->builder = builder;
|
||
}
|
||
|
||
QSqlQuery QueryInterpreter::build(const Query &q) {
|
||
QSqlQuery QueryInterpreter::build(Query &q) {
|
||
QList<QString> clauses = QList<QString>();
|
||
clauses.append(this->buildSelect(q.getSelect(), q.getDistinct(),
|
||
clauses.append(this->buildSelect(q, q.getSelect(), q.getDistinct(),
|
||
q.getSelectOption()));
|
||
clauses.append(this->buildFrom(q.getFrom()));
|
||
clauses.append(this->buildJoin(q.getJoins()));
|
||
clauses.append(this->buildWhere(q.getWhere()));
|
||
clauses.append(this->buildWhere(q, q.getWhere()));
|
||
clauses.append(this->buildGroupBy(q.getGroupBy()));
|
||
clauses.append(this->buildHaving(q.getHaving()));
|
||
clauses.append(this->buildHaving(q, q.getHaving()));
|
||
QString sql = "";
|
||
bool first = true;
|
||
for (int i = 0; i < clauses.size(); ++i) {
|
||
... | ... | |
q.getOffset());
|
||
QSqlQuery sqlQuery = this->builder->getQuery();
|
||
sqlQuery.prepare(sql);
|
||
qDebug() << "--------------------------------------";
|
||
for (auto i = q.getParams().constBegin(); i != q.getParams().constEnd(); ++i) {
|
||
qDebug() << i.key() << i.value();
|
||
}
|
||
qDebug() << "--------------------------------------";
|
||
|
||
|
||
this->builder->bindValues(q.getParams(), sqlQuery, false);
|
||
return sqlQuery;
|
||
}
|
||
|
||
QString QueryInterpreter::buildSelect(const QList<Expression> &columns,
|
||
QString QueryInterpreter::buildSelect(Query &q,
|
||
const QList<Expression> &columns,
|
||
const bool &distinct, const QString &selectOption) const {
|
||
QString sqlSelect = distinct ? "SELECT DISTINCT" : "SELECT";
|
||
if (!selectOption.isEmpty()) {
|
||
... | ... | |
sqlSelect += ", ";
|
||
}
|
||
Expression e = columns.at(i);
|
||
q.appendParams(e.getParams());
|
||
QString nExp = e.getExpression();
|
||
if (e.getOnlyColumn()) {
|
||
sqlSelect += this->builder->getSchema()->quoteColumnName(e.getExpression());
|
||
... | ... | |
return sqlJoin;
|
||
}
|
||
|
||
QString QueryInterpreter::buildWhere(const QList<Expression> &conditions)
|
||
QString QueryInterpreter::buildWhere(Query &q,
|
||
const QList<Expression> &conditions)
|
||
const {
|
||
QString where = this->buildCondition(conditions);
|
||
QString where = this->buildCondition(q, conditions);
|
||
return where.isEmpty() ? "" : ("WHERE " + where);
|
||
}
|
||
|
||
... | ... | |
groupBy);
|
||
}
|
||
|
||
QString QueryInterpreter::buildHaving(const QList<Expression> &conditions)
|
||
QString QueryInterpreter::buildHaving(Query &q,
|
||
const QList<Expression> &conditions)
|
||
const {
|
||
QString having = this->buildCondition(conditions);
|
||
QString having = this->buildCondition(q, conditions);
|
||
return having.isEmpty() ? "" : ("HAVING " + having);
|
||
}
|
||
|
||
... | ... | |
if (!sqlOrderBy.isEmpty()) {
|
||
sql += this->builder->getSeparator() + sqlOrderBy;
|
||
}
|
||
QString sqlLimit = this->builder->limit(limit, offset);
|
||
QString sqlLimit = this->builder->limit(limit, offset, false);
|
||
if (!sqlLimit.isEmpty()) {
|
||
sql += this->builder->getSeparator() + sqlLimit;
|
||
}
|
||
... | ... | |
return sqlOrder;
|
||
}
|
||
|
||
QString QueryInterpreter::buildCondition(const QList<Expression> &conditions)
|
||
QString QueryInterpreter::buildCondition(Query &q,
|
||
const QList<Expression> &conditions)
|
||
const {
|
||
if (conditions.isEmpty()) {
|
||
return "";
|
||
... | ... | |
}
|
||
}
|
||
sqlCondition += expression;
|
||
q.appendParams(q.getParams());
|
||
}
|
||
return sqlCondition;
|
||
}
|
Auch abrufbar als: Unified diff
improvements