commit 8fea42af2ffe30dca862a043fea27805a56b48e7
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Mon Jan 11 23:24:35 2016 +0100

    wip

diff --git a/src/query.cpp b/src/query.cpp
index 2d11f13..b2aa54d 100644
--- a/src/query.cpp
+++ b/src/query.cpp
@@ -17,7 +17,6 @@
 #include "query.h"
 #include "entity.h"
 #include "querybuilder.h"
-#include "entityinstancefactory.h"
 using namespace CuteEntityManager;
 Query::Query() {
 }
diff --git a/src/querybuilder.cpp b/src/querybuilder.cpp
index fc29ee5..e17b798 100644
--- a/src/querybuilder.cpp
+++ b/src/querybuilder.cpp
@@ -121,30 +121,6 @@ bool QueryBuilder::supportsForeignKeys() const {
     return true;
 }
 
-
-//QVariant Query::convertParam(const QVariant val) {
-//    auto typeName = QString(val.typeName());
-//    QVariant r = val;
-//    if(typeName.contains("QSharedPointer")) {
-//        if(typeName.contains("QList")) {
-//            auto entities = EntityInstanceFactory::castQVariantList(r);
-//            QList<QVariant> ids;
-//            for (int i = 0; i < entities.size(); ++i) {
-//                if(entities.at(i)) {
-//                    ids.append(entities.at(i)->getProperty(entities.at(i)->getPrimaryKey()));
-//                }
-//            }
-//            r.setValue<QList<QVariant>>(ids);
-//        } else {
-//            auto entity = EntityInstanceFactory::castQVariant(r);
-//            if(entity && entity->getId() != -1) {
-//                r = entity->getProperty(entity->getPrimaryKey());
-//            }
-//        }
-//    }
-//    return r;
-//}
-
 void QueryBuilder::createRelationFK(QStringList &queries,
                                     const QSharedPointer<Entity> &entity, const Relation &relation,
                                     const QMetaProperty &metaProperty, const QString &update,
diff --git a/src/queryinterpreter.cpp b/src/queryinterpreter.cpp
index 8af3c4d..c8bbbc0 100644
--- a/src/queryinterpreter.cpp
+++ b/src/queryinterpreter.cpp
@@ -21,6 +21,7 @@
 #include "orderby.h"
 #include "expression.h"
 #include "schema.h"
+#include "entityinstancefactory.h"
 using namespace CuteEntityManager;
 
 
@@ -29,6 +30,9 @@ QueryInterpreter::QueryInterpreter(QSharedPointer<AttributeResolver> ar) {
 }
 
 QSqlQuery QueryInterpreter::build(Query &q, const QMetaObject *obj) {
+    if(obj) {
+        this->resolveRelations(q, obj);
+    }
     QList<QString> clauses = QList<QString>();
     clauses.append(this->buildSelect(q, q.getSelect(), q.getDistinct(),
                                      q.getSelectOption()));
@@ -219,9 +223,6 @@ QString QueryInterpreter::buildOrderBy(const QList<OrderBy> &columns) const {
     return sqlOrder;
 }
 
-
-
-
 QString QueryInterpreter::buildCondition(Query &q,
         const QList<Expression> &conditions) const {
     if (conditions.isEmpty()) {
@@ -248,6 +249,40 @@ QString QueryInterpreter::buildCondition(Query &q,
     return sqlCondition;
 }
 
+QVariant QueryInterpreter::convertParamValue(const QVariant val) const {
+    auto typeName = QString(val.typeName());
+    QVariant r = val;
+    if(typeName.contains("QSharedPointer")) {
+        if(typeName.contains("QList")) {
+            auto entities = EntityInstanceFactory::castQVariantList(r);
+            QList<QVariant> ids;
+            for (int i = 0; i < entities.size(); ++i) {
+                if(entities.at(i)) {
+                    ids.append(entities.at(i)->getProperty(entities.at(i)->getPrimaryKey()));
+                }
+            }
+            r.setValue<QList<QVariant>>(ids);
+        } else {
+            auto entity = EntityInstanceFactory::castQVariant(r);
+            if(entity && entity->getId() != -1) {
+                r = entity->getProperty(entity->getPrimaryKey());
+            }
+        }
+    }
+    return r;
+}
+
+void QueryInterpreter::resolveRelations(Query &q, const QMetaObject *obj) {
+    q.getSelect();
+    q.getWhere();
+    q.getGroupBy();
+    q.getHaving();
+}
+
+QList<Expression> QueryInterpreter::resolve(Query &q, const QMetaObject *obj,
+        QList<Expression> exp) {
+}
+
 void QueryInterpreter::convertParams(const QString &prefix,
                                      QHash<QString, QVariant> &params, QString &condition, int &start) const {
     auto keys = params.keys();
@@ -255,7 +290,7 @@ void QueryInterpreter::convertParams(const QString &prefix,
         QString val = prefix + QString::number(start);
         condition.replace(this->ar->getQb()->placeHolder(keys.at(i)),
                           this->ar->getQb()->placeHolder(val));
-        params.insert(val, params.value(keys.at(i)));
+        params.insert(val, this->convertParamValue(params.value(keys.at(i))));
         params.remove(keys.at(i));
         ++start;
     }
diff --git a/src/queryinterpreter.h b/src/queryinterpreter.h
index 622438f..ca058d9 100644
--- a/src/queryinterpreter.h
+++ b/src/queryinterpreter.h
@@ -28,7 +28,7 @@ class AttributeResolver;
 class QueryInterpreter {
   public:
     QueryInterpreter(QSharedPointer<AttributeResolver> ar);
-    QSqlQuery build(Query &q, const QMetaObject *obj=nullptr);
+    QSqlQuery build(Query &q, const QMetaObject *obj = nullptr);
 
   protected:
     QString buildSelect(Query &q, const QList<Expression> &columns,
@@ -45,6 +45,9 @@ class QueryInterpreter {
     QString buildCondition(Query &q, const QList<Expression> &conditions) const;
     void convertParams(const QString &prefix,
                        QHash<QString, QVariant> &params, QString &condition, int &start) const;
+    QVariant convertParamValue(const QVariant val) const;
+    void resolveRelations(Query &q, const QMetaObject *obj);
+    QList<Expression> resolve(Query &q, const QMetaObject *obj, QList<Expression> exp);
 
   private:
     QSharedPointer<AttributeResolver> ar;
