commit 2316d17ff8017530773063790e267e1f3f51d92c
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Mon Jan 11 22:55:49 2016 +0100

    querybuilder params get own notations

diff --git a/src/query.cpp b/src/query.cpp
index 2e3e915..2d11f13 100644
--- a/src/query.cpp
+++ b/src/query.cpp
@@ -214,29 +214,6 @@ Expression Query::like(const QSharedPointer<QueryBuilder> &qb,
     return qb->like(conditions, conjunction, jp, wildcard);
 }
 
-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;
-}
-
 QString Query::getSelectOption() const {
     return selectOption;
 }
@@ -306,12 +283,12 @@ void Query::setJoins(const QList<Join> &value) {
 }
 
 void Query::appendParam(const QString &column, QVariant value) {
-    this->params.insert(column, this->convertParam(value));
+    this->params.insert(column, value);
 }
 
 void Query::appendParams(const QHash<QString, QVariant> &params) {
     for (auto i = params.constBegin(); i != params.constEnd(); ++i) {
-        this->params.insert(i.key(), this->convertParam(i.value()));
+        this->params.insert(i.key(), i.value());
     }
 }
 
diff --git a/src/query.h b/src/query.h
index cebf009..b924e33 100644
--- a/src/query.h
+++ b/src/query.h
@@ -165,8 +165,6 @@ class Query {
                     QHash<QString, QVariant> conditions,
                     QString conjunction = QStringLiteral("AND"),
                     JokerPosition jp = JokerPosition::BOTH, QChar wildcard = '%');
-protected:
-    QVariant convertParam(const QVariant val);
 
   private:
     QList<Expression> select;
diff --git a/src/querybuilder.cpp b/src/querybuilder.cpp
index e17b798..fc29ee5 100644
--- a/src/querybuilder.cpp
+++ b/src/querybuilder.cpp
@@ -121,6 +121,30 @@ 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 f76c1b0..8af3c4d 100644
--- a/src/queryinterpreter.cpp
+++ b/src/queryinterpreter.cpp
@@ -70,6 +70,7 @@ QString QueryInterpreter::buildSelect(Query &q,
         return sqlSelect + "*";
     }
     bool first = true;
+    int paramCount = 0;
     for (int i = 0; i < columns.size(); ++i) {
         if (first) {
             first = false;
@@ -77,8 +78,10 @@ QString QueryInterpreter::buildSelect(Query &q,
             sqlSelect += ", ";
         }
         Expression e = columns.at(i);
-        q.appendParams(e.getParams());
         QString nExp = e.getExpression();
+        auto params = e.getParams();
+        this->convertParams("s", params, nExp, paramCount);
+        q.appendParams(params);
         if (e.getOnlyColumn()) {
             sqlSelect += this->ar->getQb()->getSchema()->quoteColumnName(e.getExpression());
         } else if (!nExp.contains("(")) {
@@ -216,6 +219,9 @@ QString QueryInterpreter::buildOrderBy(const QList<OrderBy> &columns) const {
     return sqlOrder;
 }
 
+
+
+
 QString QueryInterpreter::buildCondition(Query &q,
         const QList<Expression> &conditions) const {
     if (conditions.isEmpty()) {
@@ -223,6 +229,7 @@ QString QueryInterpreter::buildCondition(Query &q,
     }
     QString sqlCondition = "";
     bool first = true;
+    int paramCount = 0;
     for (int i = 0; i < conditions.size(); ++i) {
         Expression exp = conditions.at(i);
         QString expression = exp.getExpression();
@@ -233,8 +240,23 @@ QString QueryInterpreter::buildCondition(Query &q,
                 sqlCondition += this->ar->getQb()->getSeparator();
             }
         }
+        auto params = exp.getParams();
+        this->convertParams("p", params, expression, paramCount);
         sqlCondition += expression;
-        q.appendParams(exp.getParams());
+        q.appendParams(params);
     }
     return sqlCondition;
 }
+
+void QueryInterpreter::convertParams(const QString &prefix,
+                                     QHash<QString, QVariant> &params, QString &condition, int &start) const {
+    auto keys = params.keys();
+    for (int i = 0; i < keys.size(); ++i) {
+        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.remove(keys.at(i));
+        ++start;
+    }
+}
diff --git a/src/queryinterpreter.h b/src/queryinterpreter.h
index aa7de4c..622438f 100644
--- a/src/queryinterpreter.h
+++ b/src/queryinterpreter.h
@@ -43,6 +43,8 @@ class QueryInterpreter {
                                  const quint64 &limit, const quint64 &offset) const;
     QString buildOrderBy(const QList<OrderBy> &columns) const;
     QString buildCondition(Query &q, const QList<Expression> &conditions) const;
+    void convertParams(const QString &prefix,
+                       QHash<QString, QVariant> &params, QString &condition, int &start) const;
 
   private:
     QSharedPointer<AttributeResolver> ar;
