Revision 373a84e2
Von Christian Ehringfeld vor mehr als 8 Jahren hinzugefügt
src/entitymanager.cpp | ||
---|---|---|
return schema;
|
||
}
|
||
|
||
void EntityManager::refresh(QSharedPointer<Entity> &entity) {
|
||
void EntityManager::refresh(QSharedPointer<Entity> &entity, const bool resolveRelations) {
|
||
if(entity) {
|
||
auto map = this->findByPk(entity->getId(), entity);
|
||
this->convert(map, entity, true);
|
||
this->convert(map, entity, true, resolveRelations);
|
||
}
|
||
}
|
||
|
||
... | ... | |
}
|
||
|
||
QSharedPointer<Entity> EntityManager::findById(const qint64 &id,
|
||
const QString &classname) {
|
||
const QString &classname, const bool refresh) {
|
||
QSharedPointer<Entity> e = QSharedPointer<Entity>
|
||
(EntityInstanceFactory::createInstance(classname));
|
||
return this->findById(id, e);
|
||
return this->findById(id, e, refresh);
|
||
}
|
||
|
||
void EntityManager::manyToOne(const QSharedPointer<Entity> &entity,
|
||
... | ... | |
QSharedPointer<Entity> ptr = QSharedPointer<Entity>();
|
||
if (refresh || !(this->cache.contains(convertedId, className)
|
||
&& (ptr = this->cache.get(convertedId, className)))) {
|
||
ptr = this->findById(convertedId, className);
|
||
ptr = this->findById(convertedId, className, refresh);
|
||
}
|
||
EntityHelper::setProperty(entity, ptr, attr->getMetaProperty());
|
||
}
|
||
... | ... | |
if (entity.data() && entity->getId() > -1) {
|
||
auto e = QSharedPointer<Entity>(EntityInstanceFactory::createInstance(attr));
|
||
if (e) {
|
||
QSqlQuery q = this->schema->getQueryBuilder()->oneToMany(attr->getRelatedTable(),
|
||
attr->getRelatedColumnName(), entity->getId());
|
||
Query query = this->schema->getQueryBuilder()->oneToMany(
|
||
attr->getRelatedTable(),
|
||
attr->getRelatedColumnName(), entity->getId());
|
||
QSqlQuery q = this->queryInterpreter->build(query);
|
||
auto listMap = this->convertQueryResult(q);
|
||
auto entities = this->convert(listMap, EntityHelper::getClassname(e.data()),
|
||
refresh);
|
||
... | ... | |
} else {
|
||
auto e = QSharedPointer<Entity>(EntityInstanceFactory::createInstance(attr));
|
||
if (e) {
|
||
QSqlQuery q = this->schema->getQueryBuilder()->oneToMany(
|
||
Query query = this->schema->getQueryBuilder()->oneToMany(
|
||
e->getTablename(),
|
||
this->schema->getQueryBuilder()->generateColumnNameID(
|
||
attr->getRelation().getMappedBy()),
|
||
entity->getProperty(entity->getPrimaryKey()).toLongLong(), 1);
|
||
QSqlQuery q = this->queryInterpreter->build(query);
|
||
auto listMap = this->convertQueryResult(q);
|
||
auto entities = this->convert(listMap, EntityHelper::getClassname(e.data()),
|
||
refresh);
|
||
... | ... | |
const QSharedPointer<Entity>
|
||
&entity,
|
||
bool ignoreID) {
|
||
QSqlQuery q = this->schema->getQueryBuilder()->findByAttributes(
|
||
Query query = this->schema->getQueryBuilder()->findByAttributes(
|
||
entity, ignoreID);
|
||
QSqlQuery q = this->queryInterpreter->build(query);
|
||
return this->convertQueryResult(q);
|
||
}
|
||
|
||
QList<QHash <QString, QVariant>> EntityManager::findAllByAttributes(
|
||
const QHash<QString, QVariant> &m, const QString &tblname, bool ignoreID) {
|
||
QSqlQuery q = this->schema->getQueryBuilder()->findByAttributes(m,
|
||
Query query = this->schema->getQueryBuilder()->findByAttributes(m,
|
||
tblname, ignoreID);
|
||
QSqlQuery q = this->queryInterpreter->build(query);
|
||
return this->convertQueryResult(q);
|
||
}
|
||
|
src/entitymanager.h | ||
---|---|---|
bool startup(QString version, QStringList toInitialize,
|
||
bool createIndices = false);
|
||
bool executeQuery(const QString &query);
|
||
QSharedPointer<Entity> findById(const qint64 &id, const QString &classname);
|
||
QSharedPointer<Entity> findById(const qint64 &id, const QString &classname, const bool refresh=false);
|
||
QList<QSharedPointer<Entity>> findEntityByAttributes(const
|
||
QSharedPointer<Entity> &entity,
|
||
bool ignoreID = false, const bool refresh = false, const bool resolveRelations = true);
|
||
... | ... | |
* fetches an entity again from the database
|
||
* @param entity
|
||
*/
|
||
void refresh(QSharedPointer<Entity> &entity);
|
||
void refresh(QSharedPointer<Entity> &entity, const bool resolveRelations=true);
|
||
QList<QHash<QString, QVariant>> selectByQuery(Query &query);
|
||
QList<QHash<QString, QVariant>> selectBySql(const QString &sql);
|
||
quint32 count(Query &query);
|
||
... | ... | |
&attributes, const bool joinBaseClasses = false,
|
||
const bool resolveRelations = true, const bool refresh=false) {
|
||
auto list = this->findAllEntitiesByAttributes<T>(attributes, 1, 0,
|
||
joinBaseClasses, resolveRelations, refresh);
|
||
joinBaseClasses, resolveRelations,refresh);
|
||
if (list.isEmpty()) {
|
||
return QSharedPointer<T>();
|
||
}
|
||
... | ... | |
query.setOffset(offset);
|
||
QSqlQuery q = this->queryInterpreter->build(query);
|
||
auto results = this->convertQueryResult(q);
|
||
auto list = this->convert(results, EntityHelper::getClassname(e.data()), refresh,
|
||
resolveRelations);
|
||
auto list = this->convert(results, EntityHelper::getClassname(e.data()),refresh,resolveRelations);
|
||
return EntityManager::convertList<T>(list);
|
||
}
|
||
return QList<QSharedPointer<T>>();
|
src/expression.cpp | ||
---|---|---|
Expression::Expression(QString expression, QHash<QString, QVariant> params,
|
||
bool onlyColumn) {
|
||
for(auto i = params.begin(); i != params.end(); ++i) {
|
||
expression.replace(":" + i.key(),":" + this->generateParam());
|
||
QString ikey = i.key();
|
||
expression.replace(":" + ikey.replace('.','_'),":" + this->generateParam());
|
||
this->appendParam(i.key(),i.value());
|
||
}
|
||
this->expression = expression;
|
||
... | ... | |
}
|
||
|
||
Expression::Expression(QString expression, QString key, QVariant value, bool onlyColumn) {
|
||
this->expression = expression.replace(":" + key, ":" + this->generateParam());
|
||
this->expression = expression.replace(":" + key.replace('.','_'), ":" + this->generateParam());
|
||
this->appendParam(key, value);
|
||
this->onlyColumn = onlyColumn;
|
||
}
|
||
... | ... | |
|
||
void Expression::appendParam(QString key, const QVariant &value) {
|
||
this->params.insert(this->generateParam(), value);
|
||
/**
|
||
@todo remove
|
||
*/
|
||
this->params.insert(key.replace('.','_'), value);
|
||
}
|
||
|
src/querybuilder.cpp | ||
---|---|---|
}
|
||
|
||
QString QueryBuilder::selectBase(const QStringList &tables,
|
||
const QStringList &columns) const {
|
||
QString r = "SELECT ";
|
||
const QStringList &columns, bool withKeyword) const {
|
||
QString r = "";
|
||
if(withKeyword) {
|
||
r = "SELECT ";
|
||
}
|
||
if (columns.isEmpty()) {
|
||
r += "*";
|
||
} else {
|
||
... | ... | |
entity) + this->limit(limit, offset) + ";");
|
||
}
|
||
|
||
QSqlQuery QueryBuilder::findByAttributes(const QHash<QString, QVariant> &m,
|
||
const QString &tableName,
|
||
const bool &ignoreID, const qint64 limit, const qint64 offset) const {
|
||
QSqlQuery q = this->database->getQuery(this->selectBase(QStringList(
|
||
tableName)) + this->where(m, this->andKeyword(), ignoreID) + this->limit(limit,
|
||
offset));
|
||
this->bindValues(m, q, ignoreID);
|
||
Query QueryBuilder::findByAttributes(const QHash<QString, QVariant> &m,
|
||
const QString &tableName,
|
||
const bool &ignoreID, const qint64 limit, const qint64 offset) const {
|
||
Query q = Query();
|
||
q.setSelect(QStringList(this->selectBase(QStringList(
|
||
tableName),QStringList(),false)));
|
||
q.appendWhere(Expression(this->where(m, this->andKeyword(), ignoreID, "id", false), m));
|
||
q.setLimit(limit);
|
||
q.setOffset(offset);
|
||
// QSqlQuery q = this->database->getQuery(this->selectBase(QStringList(
|
||
// tableName)) + this->where(m, this->andKeyword(), ignoreID) + this->limit(limit,
|
||
// offset));
|
||
// this->bindValues(m, q, ignoreID);
|
||
return q;
|
||
}
|
||
|
||
QSqlQuery QueryBuilder::findByAttributes(const QSharedPointer<Entity> &e,
|
||
bool ignoreID,
|
||
const qint64 limit,
|
||
const qint64 offset) {
|
||
Query QueryBuilder::findByAttributes(const QSharedPointer<Entity> &e,
|
||
bool ignoreID,
|
||
const qint64 limit,
|
||
const qint64 offset) {
|
||
QHash<QString, QVariant> values = EntityHelper::getEntityAttributes(
|
||
EntityHelper::getMetaProperties(e.data()), e);
|
||
return this->findByAttributes(values, e->getTablename(), ignoreID, limit,
|
||
... | ... | |
}
|
||
|
||
|
||
QSqlQuery QueryBuilder::oneToMany(const QString &tableName,
|
||
const QString &attribute,
|
||
const qint64 &id,
|
||
const qint64 &limit) {
|
||
Query QueryBuilder::oneToMany(const QString &tableName,
|
||
const QString &attribute,
|
||
const qint64 &id,
|
||
const qint64 &limit) {
|
||
QHash<QString, QVariant> values = QHash<QString, QVariant>();
|
||
values.insert(attribute, id);
|
||
return this->findByAttributes(values, tableName, false, limit);
|
||
... | ... | |
}
|
||
|
||
QString QueryBuilder::placeHolder(QString key) const {
|
||
//return QString(":" + key.replace('.', '_'));
|
||
return QString(":" + key);
|
||
return QString(":" + key.replace('.', '_'));
|
||
}
|
||
|
||
QString QueryBuilder::where(const QHash<QString, QVariant> &m,
|
||
... | ... | |
}
|
||
|
||
Expression QueryBuilder::equal(QString &key, QVariant &value) {
|
||
Expression exp = Expression(this->where(key, value, false, true, false),key,value);
|
||
Expression exp = Expression(this->where(key, value, false, true, false), key, value);
|
||
return exp;
|
||
}
|
||
|
src/querybuilder.h | ||
---|---|---|
QSqlQuery find(const qint64 &id, const QString &tableName) const;
|
||
QSqlQuery find(const qint64 &id, const QSharedPointer<Entity> &entity,
|
||
qint64 offset = 0, QString pk = "id") const;
|
||
QSqlQuery findByAttributes(const QHash<QString, QVariant> &m,
|
||
Query findByAttributes(const QHash<QString, QVariant> &m,
|
||
const QString &tableName,
|
||
const bool &ignoreID = true, const qint64 limit = 0,
|
||
const qint64 offset = 0) const;
|
||
QSqlQuery findByAttributes(const QSharedPointer<Entity> &e,
|
||
Query findByAttributes(const QSharedPointer<Entity> &e,
|
||
bool ignoreID = true,
|
||
const qint64 limit = 0, const qint64 offset = 0);
|
||
QSqlQuery findAll(const QString &tableName) const;
|
||
... | ... | |
QList<QSqlQuery> merge(const QSharedPointer<Entity> &entity) const;
|
||
QList<QSqlQuery> create(const QSharedPointer<Entity> &entity) const;
|
||
QSqlQuery removeAll(const QString &tableName) const;
|
||
QSqlQuery oneToMany(const QString &tableName, const QString &attribute,
|
||
Query oneToMany(const QString &tableName, const QString &attribute,
|
||
const qint64 &id,
|
||
const qint64 &limit = 0);
|
||
QSqlQuery manyToMany(const QString &tableName, const QString &attribute,
|
||
... | ... | |
|
||
QString joinSuperClasses(const QSharedPointer<Entity> &entity) const;
|
||
virtual QString selectBase(const QStringList &tables,
|
||
const QStringList &columns = QStringList()) const;
|
||
const QStringList &columns = QStringList(), bool withKeyword=true) const;
|
||
virtual QString countFunction(const QString &distinctColumn = "") const;
|
||
virtual QString distinct() const;
|
||
virtual QString notKeyword() const;
|
tests/em/tst_querybuilder.cpp | ||
---|---|---|
QCOMPARE(list.size(), 1);
|
||
QCOMPARE(list.at(0)->getNickName(), QString("Lotta"));
|
||
q = Query();
|
||
q.appendWhere(q.equal(qb, "leader", QVariant(list.at(0))));
|
||
QVariant var;
|
||
var.setValue<QSharedPointer<Employee>>(list.at(0));
|
||
q.appendWhere(q.equal(qb, "leader", var));
|
||
QList<QSharedPointer<Group>> groupList = e->find<Group>(q, false);
|
||
QCOMPARE(groupList.size(), 1);
|
||
QCOMPARE(groupList.at(0)->getName(), QString("Group Health"));
|
||
... | ... | |
QCOMPARE(groupList.at(0)->getName(), QString("Group Psy"));
|
||
QCOMPARE(groupList.at(0)->getPersons().size(), 3);
|
||
}
|
||
|
||
void QuerybuilderTest::testRefresh() {
|
||
auto persons = e->findAll<Person>(false);
|
||
QCOMPARE(persons.first()->getGroups().size(), 0);
|
||
QHash<QString, QVariant> attributes;
|
||
attributes["name"] = QString("Group Health");
|
||
QSharedPointer<Group> g = this->e->findEntityByAttributes<Group>(attributes, false, false,
|
||
false);
|
||
QCOMPARE(g->getPersons().count(), 0);
|
||
auto entity = g.objectCast<Entity>();
|
||
e->refresh(entity, true);
|
||
QCOMPARE(g->getPersons().count(), 1);
|
||
}
|
tests/em/tst_querybuilder.h | ||
---|---|---|
void testQueryBuilderManyToOneRelationAttribute();
|
||
void testQueryBuilderManyToManyRelation();
|
||
void testQueryBuilderManyToManyRelationAttribute();
|
||
void testRefresh();
|
||
|
||
private:
|
||
CuteEntityManager::EntityManager *e;
|
Auch abrufbar als: Unified diff
wip