commit 86e5c91751659eac014d5222c008bcf05a183efc
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Sun Aug 2 23:16:04 2015 +0200

    not working wip...

diff --git a/samples/example/main.cpp b/samples/example/main.cpp
index d815693..3627266 100644
--- a/samples/example/main.cpp
+++ b/samples/example/main.cpp
@@ -19,7 +19,7 @@ int main(int argc, char *argv[]) {
     t.start();
     CuteEntityManager::EntityManager *e = new
     CuteEntityManager::EntityManager("QSQLITE",
-                                     QDir::currentPath() + "/db.sqlite");
+                                     QDir::currentPath() + "/db.sqlite","","","",0,true);
 //                CuteEntityManager::EntityManager("QSQLITE",
 //                                                     ":memory:");
 
diff --git a/src/entityhelper.cpp b/src/entityhelper.cpp
index d1f2bff..19a0d24 100644
--- a/src/entityhelper.cpp
+++ b/src/entityhelper.cpp
@@ -218,3 +218,20 @@ QMetaProperty EntityHelper::mappedProperty(const Relation &r,
     }
     return prop;
 }
+
+QHash<QString, QVariant> EntityHelper::getEntityAttributes(
+    const QHash<QString, QMetaProperty>
+    &props,
+    const QSharedPointer<Entity> &entity) {
+    auto map = QHash<QString, QVariant>();
+    auto transientAttrs = entity->getTransientAttributes();
+    auto relations = entity->getRelations();
+    auto i = props.constBegin();
+    while (i != props.constEnd()) {
+        if (!transientAttrs.contains(i.key()) && !relations.contains(i.key())) {
+            map.insert(i.key(), i.value().read(entity.data()));
+        }
+        ++i;
+    }
+    return map;
+}
diff --git a/src/entityhelper.h b/src/entityhelper.h
index 49ebb15..f099744 100644
--- a/src/entityhelper.h
+++ b/src/entityhelper.h
@@ -59,6 +59,9 @@ class EntityHelper {
                             const QString property);
     static QMetaProperty mappedProperty(const Relation &r,
                                         const QSharedPointer<Entity> &foreignEntity);
+    static QHash<QString, QVariant> getEntityAttributes(const QHash<QString, QMetaProperty>
+            &props,
+            const QSharedPointer<Entity> &entity);
 };
 }
 
diff --git a/src/querybuilder.cpp b/src/querybuilder.cpp
index aaf7cbc..825cce8 100644
--- a/src/querybuilder.cpp
+++ b/src/querybuilder.cpp
@@ -574,7 +574,7 @@ QSqlQuery QueryBuilder::findByAttributes(const QSharedPointer<Entity> &e,
         bool ignoreID,
         const qint64 limit,
         const qint64 offset) {
-    QHash<QString, QVariant> values = this->getEntityAttributes(
+    QHash<QString, QVariant> values = EntityHelper::getEntityAttributes(
                                           EntityHelper::getMetaProperties(e.data()), e);
     return this->findByAttributes(values, e->getTablename(), ignoreID, limit,
                                   offset);
@@ -619,7 +619,7 @@ QSqlQuery QueryBuilder::remove(const QString &tableName,
 }
 
 QSqlQuery QueryBuilder::findId(const QSharedPointer<Entity> &entity) const {
-    QHash<QString, QVariant> values = this->getEntityAttributes(
+    QHash<QString, QVariant> values = EntityHelper::getEntityAttributes(
                                           EntityHelper::getMetaProperties(entity.data()),
                                           entity);
     QSqlQuery q = this->database->getQuery(this->selectBase(QStringList(
@@ -632,7 +632,7 @@ QSqlQuery QueryBuilder::findId(const QSharedPointer<Entity> &entity) const {
 
 QSqlQuery QueryBuilder::count(const QSharedPointer<Entity> &entity,
                               bool ignoreID) const {
-    QHash<QString, QVariant> values = this->getEntityAttributes(
+    QHash<QString, QVariant> values = EntityHelper::getEntityAttributes(
                                           EntityHelper::getMetaProperties(entity.data()),
                                           entity);
     QSqlQuery q = this->database->getQuery(this->selectBase(QStringList(
@@ -888,7 +888,7 @@ QHash<QString, QVariant> QueryBuilder::saveAttributes(const
     if (props.isEmpty()) {
         props = EntityHelper::getMetaProperties(entity.data());
     }
-    auto values = this->getEntityAttributes(props, entity);
+    auto values = EntityHelper::getEntityAttributes(props, entity);
     auto relValues = this->getManyToOneAttributes(props, entity, relations);
     auto iterator = relValues.constBegin();
     while (iterator != relValues.constEnd()) {
@@ -971,23 +971,6 @@ QString QueryBuilder::leftJoin(const QString &foreignTable,
                tableName + "." + foreignKey);
 }
 
-QHash<QString, QVariant> QueryBuilder::getEntityAttributes(
-    const QHash<QString, QMetaProperty>
-    &props,
-    const QSharedPointer<Entity> &entity) const {
-    auto map = QHash<QString, QVariant>();
-    auto transientAttrs = entity->getTransientAttributes();
-    auto relations = entity->getRelations();
-    auto i = props.constBegin();
-    while (i != props.constEnd()) {
-        if (!transientAttrs.contains(i.key()) && !relations.contains(i.key())) {
-            map.insert(i.key(), i.value().read(entity.data()));
-        }
-        ++i;
-    }
-    return map;
-}
-
 QHash<QString, QVariant> QueryBuilder::getManyToOneAttributes(
     QHash<QString, QMetaProperty>
     props,
@@ -1059,11 +1042,11 @@ QString QueryBuilder::placeHolder(const QString &key) const {
 
 QString QueryBuilder::where(const QHash<QString, QVariant> &m,
                             const QString &conjunction,
-                            bool ignoreID, const QString &primaryKey) const {
+                            bool ignoreID, const QString &primaryKey, bool withKeyword) const {
     if (m.size() == 0 || (ignoreID && m.contains(primaryKey) && m.size() == 1)) {
         return "";
     }
-    return " WHERE " + this->attributes(m, conjunction, ignoreID, primaryKey);
+    return (withKeyword ? " WHERE " : "") + this->attributes(m, conjunction, ignoreID, primaryKey);
 }
 
 QString QueryBuilder::attributes(const QHash<QString, QVariant> &m,
@@ -1167,12 +1150,11 @@ void QueryBuilder::where(Query &query, QString column, QVariant value) {
 
 void QueryBuilder::where(Query &query, QHash<QString, QVariant> conditions,
                          QString concat) {
-
-}
-
-void QueryBuilder::where(Query &query,
-                         QHash<QString, QList<QVariant> > conditions, QString concat) {
-
+    QString condition = this->where(conditions,concat,false,"id",false);
+    for (auto i = conditions.constBegin(); i != conditions.constEnd(); ++i) {
+        query.appendParam(i.key(),i.value());
+    }
+    query.appendCondition(condition);
 }
 
 void QueryBuilder::between(Query &query, QString column, QVariant firstValue,
@@ -1231,7 +1213,7 @@ void QueryBuilder::orOperator(Query &query,
 QString QueryBuilder::where(const QSharedPointer<Entity> &entity,
                             QString conjunction,
                             bool ignoreID) const {
-    return this->where(this->getEntityAttributes(EntityHelper::getMetaProperties(
+    return this->where(EntityHelper::getEntityAttributes(EntityHelper::getMetaProperties(
                            entity.data()),
                        entity),
                        conjunction, ignoreID, entity->getPrimaryKey());
diff --git a/src/querybuilder.h b/src/querybuilder.h
index 0758666..0c2e86e 100644
--- a/src/querybuilder.h
+++ b/src/querybuilder.h
@@ -38,6 +38,10 @@ enum DbForeignKeyCascade {
 };
 
 class QueryBuilder {
+    /**
+     * EntityManager is a friend class, cause we want a light public api.
+     */
+    friend class EntityManager;
   public:
     QueryBuilder(QSharedPointer<Schema> schema, QSharedPointer<Database> database);
     virtual ~QueryBuilder();
@@ -66,9 +70,6 @@ class QueryBuilder {
                                   QString refTableName,
                                   QStringList refColumns, QString deleteConstraint,
                                   QString updateConstraint) const;
-    QString generateIndexName(const QString &name, const QString &table,
-                              const QString &refColumn, const QString &refTable, const bool fk) const;
-    QString generateColumnNameID(QString name) const;
     virtual QString getForeignKeyCascade(DbForeignKeyCascade cascade) const;
     virtual QString dropForeignKey(QString name, QString tableName) const;
     virtual QString createIndex(QString name, QString tableName,
@@ -76,9 +77,6 @@ class QueryBuilder {
                                 bool unique)const;
     virtual QString dropIndex(QString name, QString tableName)const;
     virtual QString createFkSuperClass(const Entity *e) const;
-    QHash<QString, QVariant> getEntityAttributes(const QHash<QString, QMetaProperty>
-            &props,
-            const QSharedPointer<Entity> &entity) const;
     virtual QStringList relationFks(const QSharedPointer<Entity> &entity) const;
     virtual bool supportsForeignKeys() const;
 
@@ -97,61 +95,30 @@ class QueryBuilder {
     QHash<QString, QString> generateTableDefinition(const QSharedPointer<Entity>
             &entity)
     const;
-    QString generateManyToManyTableName(const QSharedPointer<Entity> &firstEntity,
-                                        const QSharedPointer<Entity> &secondEntity, const Relation &r) const;
-
+    QSqlQuery getQuery() const;
     QString transformTypeToAbstractDbType(QString typeName) const;
     QString transformAbstractTypeToRealDbType(QString typeName) const;
     QString getColumnType(const QString &type) const;
-    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,
-                               const QString &tableName,
-                               const bool &ignoreID = true, const qint64 limit = 0,
-                               const qint64 offset = 0) const;
-    QSqlQuery findByAttributes(const QSharedPointer<Entity> &e,
-                               bool ignoreID = true,
-                               const qint64 limit = 0, const qint64 offset = 0);
-    QSqlQuery findAll(const QString &tableName) const;
-    QSqlQuery findAll(const QSharedPointer<Entity> &entity, const qint64 limit = 0,
-                      qint64 offset = 0);
-    QList<QSqlQuery> remove(const QSharedPointer<Entity> &entity) const;
-    QSqlQuery findId(const QSharedPointer<Entity> &entity) const;
-    QSqlQuery count(const QSharedPointer<Entity> &entity, bool ignoreID) const;
-    QSqlQuery count(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,
-                        const qint64 &id,
-                        const qint64 &limit = 0);
-    QSqlQuery manyToMany(const QString &tableName, const QString &attribute,
-                         const qint64 &id);
-    QSqlQuery manyToManyDelete(const QString &tableName, const QString &attribute,
-                               const qint64 &id);
-    QSqlQuery manyToManyInsert(const QString &tableName, const QString &col1,
-                               const QString &col2) const;
-
-    virtual QString limit(const qint64 &limit, const qint64 &offset) const;
-    QString generateManyToManyColumnName(const QSharedPointer<Entity> &entity)
-    const;
-    QSqlQuery getQuery() const;
     void bindValues(const QHash<QString, QVariant> &h, QSqlQuery &q,
                     bool ignoreID = false, const QString &primaryKey = "id") const;
     void bindValue(const QString &key, const QVariant &value, QSqlQuery &q) const;
     virtual QString placeHolder(const QString &key) const;
     void where(Query &query, QString column, QVariant value);
-    void where(Query &query,QHash<QString, QVariant> conditions, QString concat="AND");
-    void where(Query &query,QHash<QString, QList<QVariant>> conditions, QString concat="AND");
-    void between(Query &query,QString column, QVariant firstValue, QVariant secondValue);
-    void notBetween(Query &query,QString column, QVariant firstValue, QVariant secondValue);
-    void in(Query &query,QString column, QList<QVariant> values);
-    void notIn(Query &query,QString column, QList<QVariant> values);
-    void notOperator(Query &query,QString column, QVariant value);
-    void orOperator(Query &query, QHash<QString, QVariant> conditions, bool like=false);
-    void andOperator(Query &query,QHash<QString, QVariant> conditions);
-    void arbitraryOperator(Query &query,QString op, QString column, QVariant value);
+    void where(Query &query, QHash<QString, QVariant> conditions,
+               QString concat = "AND");
+    //void where(Query &query,QHash<QString, QList<QVariant>> conditions, QString concat="AND");
+    void between(Query &query, QString column, QVariant firstValue,
+                 QVariant secondValue);
+    void notBetween(Query &query, QString column, QVariant firstValue,
+                    QVariant secondValue);
+    void in(Query &query, QString column, QList<QVariant> values);
+    void notIn(Query &query, QString column, QList<QVariant> values);
+    void notOperator(Query &query, QString column, QVariant value);
+    void orOperator(Query &query, QHash<QString, QVariant> conditions,
+                    bool like = false);
+    void andOperator(Query &query, QHash<QString, QVariant> conditions);
+    void arbitraryOperator(Query &query, QString op, QString column,
+                           QVariant value);
 
     void plainOr(Query &query); //adds a simple OR to condition
     void plainAnd(Query &query); //add a simple AND to condition
@@ -167,7 +134,8 @@ class QueryBuilder {
      * @param condition
      * @param concat
      */
-    void like(QHash<QString, QVariant> conditions, QString concat ="AND", JokerPosition = JokerPosition::BOTH);
+    void like(QHash<QString, QVariant> conditions, QString concat = "AND",
+              JokerPosition = JokerPosition::BOTH);
 
 
 
@@ -194,6 +162,35 @@ class QueryBuilder {
         QHash<QString, QVariant> attributes;
     };
 
+    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,
+                               const QString &tableName,
+                               const bool &ignoreID = true, const qint64 limit = 0,
+                               const qint64 offset = 0) const;
+    QSqlQuery findByAttributes(const QSharedPointer<Entity> &e,
+                               bool ignoreID = true,
+                               const qint64 limit = 0, const qint64 offset = 0);
+    QSqlQuery findAll(const QString &tableName) const;
+    QSqlQuery findAll(const QSharedPointer<Entity> &entity, const qint64 limit = 0,
+                      qint64 offset = 0);
+    QList<QSqlQuery> remove(const QSharedPointer<Entity> &entity) const;
+    QSqlQuery findId(const QSharedPointer<Entity> &entity) const;
+    QSqlQuery count(const QSharedPointer<Entity> &entity, bool ignoreID) const;
+    QSqlQuery count(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,
+                        const qint64 &id,
+                        const qint64 &limit = 0);
+    QSqlQuery manyToMany(const QString &tableName, const QString &attribute,
+                         const qint64 &id);
+    QSqlQuery manyToManyDelete(const QString &tableName, const QString &attribute,
+                               const qint64 &id);
+    QSqlQuery manyToManyInsert(const QString &tableName, const QString &col1,
+                               const QString &col2) const;
     QSqlQuery remove(const QString &tableName, const qint64 &id,
                      const QString &primaryKey = "id") const;
     QSqlQuery insert(const QString &tableName, QHash<QString, QVariant> &attributes,
@@ -202,6 +199,10 @@ class QueryBuilder {
                      const QString &primaryKey = "id") const;
     QList<QSqlQuery> createOrMerge(const QSharedPointer<Entity> &entity,
                                    bool insert) const;
+    virtual QString limit(const qint64 &limit, const qint64 &offset) const;
+    QString generateIndexName(const QString &name, const QString &table,
+                              const QString &refColumn, const QString &refTable, const bool fk) const;
+    QString generateColumnNameID(QString name) const;
     virtual void createRelationFK(QStringList &queries,
                                   const QSharedPointer<Entity> &entity, const Relation &relation,
                                   const QMetaProperty &metaProperty, const QString &update,
@@ -219,6 +220,10 @@ class QueryBuilder {
     QHash<QString, QVariant> getPropertyValues(const QHash<QString, QMetaProperty>
             &metaProps,
             const QSharedPointer<Entity> &entity) const;
+    QString generateManyToManyTableName(const QSharedPointer<Entity> &firstEntity,
+                                        const QSharedPointer<Entity> &secondEntity, const Relation &r) const;
+    QString generateManyToManyColumnName(const QSharedPointer<Entity> &entity)
+    const;
     QString buildCreateQuery(QHash<QString, QVariant>::const_iterator i,
                              QHash<QString, QVariant>::const_iterator end,
                              QString &p1, QString &p2) const;
@@ -226,7 +231,8 @@ class QueryBuilder {
                   bool ignoreID = false) const;
     QString where(const QHash<QString, QVariant> &m,
                   const QString &conjunction = ",",
-                  bool ignoreID = false, const QString &primaryKey = "id") const;
+                  bool ignoreID = false, const QString &primaryKey = "id",
+                  bool withKeyword = true) const;
     QString attributes(const QHash<QString, QVariant> &m,
                        const QString &conjunction = ",",
                        bool ignoreID = false, const QString &primaryKey = "id") const;
@@ -257,10 +263,13 @@ class QueryBuilder {
     virtual QString inKeyword() const;
     virtual QString whereKeyword() const;
     virtual QString countKeyword() const;
-    virtual QString inFunction(Query &q, QString column, QList<QVariant> values, bool notOp=false);
-    virtual QString between(QString colName, QString valName1, QString valName2, bool notOp=false);
+    virtual QString inFunction(Query &q, QString column, QList<QVariant> values,
+                               bool notOp = false);
+    virtual QString between(QString colName, QString valName1, QString valName2,
+                            bool notOp = false);
     QString appendNot(bool notOp);
-    virtual void appendCondition(Query &q, QString ph1, QString ph2, QVariant val1, QVariant val2, QString condition);
+    virtual void appendCondition(Query &q, QString ph1, QString ph2, QVariant val1,
+                                 QVariant val2, QString condition);
     QString entityClassname() const;
 
     QSharedPointer<Schema> schema;
