commit ce6994c46019fe70ac52f95eed04241ba56ef77c
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Mon Jun 15 21:25:39 2015 +0200

    ...

diff --git a/src/entityinstancefactory.cpp b/src/entityinstancefactory.cpp
index 3468bb0..084aa15 100644
--- a/src/entityinstancefactory.cpp
+++ b/src/entityinstancefactory.cpp
@@ -79,3 +79,14 @@ const QString EntityInstanceFactory::extractEntityType(const QString &s) {
     }
     return r;
 }
+
+Entity *EntityInstanceFactory::newSuperClassInstance(Entity *e) {
+    Entity *super = 0;
+    if (e) {
+        auto metaObject = e->metaObject()->superClass();
+        if (QString(metaObject->className()) != QString("Entity")) {
+            super = EntityInstanceFactory::createInstance(metaObject->className());
+        }
+    }
+    return super;
+}
diff --git a/src/entityinstancefactory.h b/src/entityinstancefactory.h
index faeefe3..608eeaa 100644
--- a/src/entityinstancefactory.h
+++ b/src/entityinstancefactory.h
@@ -32,6 +32,7 @@ class EntityInstanceFactory {
                                  QHash<QString, QMetaProperty> metaprops);
     static Entity *setAttributes(Entity *e, const QHash<QString, QVariant> &attributes);
     static const QString extractEntityType(const QString &s);
+    static Entity *newSuperClassInstance(Entity *e);
 
     template<typename T>
     static Entity *createInstance() {
diff --git a/src/querybuilder.cpp b/src/querybuilder.cpp
index 8df9256..0f12ea4 100644
--- a/src/querybuilder.cpp
+++ b/src/querybuilder.cpp
@@ -35,21 +35,22 @@ QueryBuilder::~QueryBuilder() {
 
 bool QueryBuilder::createTable(const QSharedPointer<Entity> &entity) const {
     bool rc = false;
-    if(entity.data()) {
+    if (entity.data()) {
         auto tableDefinition = this->generateTableDefinition(entity);
         QString tableName = entity.data()->getTablename();
-    this->schema.data()->containsTable(tableName) ? rc = true : rc = false;
-    if (!rc) {
-        QSqlQuery q = this->database.data()->getQuery(this->createTable(tableName,tableDefinition));
-        if (this->database.data()->transaction(q)) {
-            this->schema.data()->getTableSchema(tableName);
-            rc = true;
-            if(rc) {
-                rc = this->createIndices(entity);
+        this->schema.data()->containsTable(tableName) ? rc = true : rc = false;
+        if (!rc) {
+            QSqlQuery q = this->database.data()->getQuery(this->createTable(tableName,
+                          tableDefinition));
+            if (this->database.data()->transaction(q)) {
+                this->schema.data()->getTableSchema(tableName);
+                rc = true;
+                if (rc) {
+                    rc = this->createIndices(entity);
+                }
             }
         }
     }
-    }
     return rc;
 
 }
@@ -59,7 +60,7 @@ bool QueryBuilder::createIndices(const QSharedPointer<Entity> &entity) const {
     bool ok = true;
     QStringList queries = QStringList();
     QString superIndex = this->createFkSuperClass(e);
-    if(!superIndex.isEmpty()) {
+    if (!superIndex.isEmpty()) {
         queries.append(superIndex);
     }
     queries.append(this->relationIndices(e));
@@ -68,39 +69,65 @@ bool QueryBuilder::createIndices(const QSharedPointer<Entity> &entity) const {
 }
 
 
-QStringList QueryBuilder::relationIndices(const Entity *e) const
-{
+QStringList QueryBuilder::relationIndices(const Entity *e) const {
     QStringList queries = QStringList();
     auto relations = e->getRelations();
+    auto superObject = EntityInstanceFactory::newSuperClassInstance(e);
+    if(superObject) {
+        auto superRelations = superObject->getRelations();
+        auto iterator = superRelations.constBegin();
+        while(iterator != relations.constEnd()) {
+            if(relations.contains(iterator.key())) {
+               relations.remove(iterator.key());
+            }
+            ++iterator;
+        }
+        delete superObject;
+        superObject = 0;
+    }
     auto iterator = relations.constBegin();
-    while(iterator != relations.constEnd()) {
-        
-        
+    while (iterator != relations.constEnd()) {
+        auto relation = iterator.value();
+        if(!relation.getCascadeType().isEmpty()) {
+            switch (relation.getType()) {
+            case ONE_TO_MANY:
+                break;
+            case ONE_TO_ONE:
+                break;
+            case MANY_TO_MANY:
+                break;
+            case MANY_TO_ONE:
+                break;
+            }
+        }
         ++iterator;
     }
     return queries;
 }
 
 
-QString QueryBuilder::createTable(const QString &tableName, const QHash<QString, QString> &tableDefinition) const
-{
+QString QueryBuilder::createTable(const QString &tableName,
+                                  const QHash<QString, QString> &tableDefinition) const {
     return this->createTableQuery(tableName,
-                          tableDefinition);
+                                  tableDefinition);
 }
 
-QString QueryBuilder::createFkSuperClass(const Entity *e) const
-{
+QString QueryBuilder::createFkSuperClass(const Entity *e) const {
     QString r = "";
     auto superMetaObject = e->metaObject()->superClass();
 
     if (e->getInheritanceStrategy() == JOINED_TABLE
             && QString(superMetaObject->className()) != QString("Entity")) {
-        Entity *superClass  = EntityInstanceFactory::createInstance(superMetaObject->className());
-        if(superClass) {
-        QString refColumn = superClass->getPrimaryKey();
-        QString refTable = superClass->getTablename();
-        r = this->addForeignKey(this->generateIndexName(e->getPrimaryKey(),e->getTablename(),refColumn,refTable,true), e->getTablename(),QStringList(e->getPrimaryKey()),refTable,QStringList(refColumn),"CASCADE","CASCADE");
-        delete superClass;
+        Entity *superClass  = EntityInstanceFactory::createInstance(
+                                  superMetaObject->className());
+        if (superClass) {
+            QString refColumn = superClass->getPrimaryKey();
+            QString refTable = superClass->getTablename();
+            r = this->addForeignKey(this->generateIndexName(e->getPrimaryKey(),
+                                    e->getTablename(), refColumn, refTable, true), e->getTablename(),
+                                    QStringList(e->getPrimaryKey()), refTable, QStringList(refColumn), this->getForeignKeyCascade(CASCADE),
+                                    this->getForeignKeyCascade(CASCADE));
+            delete superClass;
         }
     }
     return r;
@@ -187,10 +214,6 @@ QString QueryBuilder::dropPrimaryKey(QString name, QString tableName) const {
            this->schema.data()->quoteColumnName(name);
 }
 
-
-/**
-  RESTRICT, CASCADE, NO ACTION, SET DEFAULT, SET NULL
-*/
 QString QueryBuilder::addForeignKey(QString name, QString tableName,
                                     QStringList columns,
                                     QString refTableName,
@@ -219,6 +242,26 @@ QString QueryBuilder::generateIndexName(const QString &name,
                refColumn).append(refTable);
 }
 
+QString QueryBuilder::getForeignKeyCascade(DbForeignKeyCascade cascade) const {
+    switch (cascade) {
+    case RESTRICT:
+        return "RESTRICT";
+        break;
+    case CASCADE:
+        return "CASCADE";
+        break;
+    case NO_ACTION:
+        return "NO ACTION";
+        break;
+    case SET_DEFAULT:
+        return "SET DEFAULT";
+        break;
+    case SET_NULL:
+        return "SET NULL";
+        break;
+    }
+}
+
 QString QueryBuilder::dropForeignKey(QString name, QString tableName) const {
     return "ALTER TABLE " + this->schema.data()->quoteTableName(
                tableName) + " DROP CONSTRAINT " +
@@ -239,7 +282,7 @@ QString QueryBuilder::createIndex(QString name, QString tableName,
 QString QueryBuilder::dropIndex(QString name, QString tableName) const {
     return "DROP INDEX " + this->schema.data()->quoteTableName(name) + " ON " +
            this->schema.data()->quoteTableName(
-                tableName);
+               tableName);
 }
 
 QSharedPointer<Database> QueryBuilder::getDatabase() const {
diff --git a/src/querybuilder.h b/src/querybuilder.h
index c6143f1..4eeff88 100644
--- a/src/querybuilder.h
+++ b/src/querybuilder.h
@@ -25,6 +25,17 @@ namespace CuteEntityManager {
 class Schema;
 class Entity;
 class Database;
+/**
+  RESTRICT, CASCADE, NO ACTION, SET DEFAULT, SET NULL
+*/
+enum DbForeignKeyCascade {
+    RESTRICT,
+    CASCADE,
+    NO_ACTION,
+    SET_DEFAULT,
+    SET_NULL,
+};
+
 class QueryBuilder {
   public:
     QueryBuilder(QSharedPointer<Schema> schema, QSharedPointer<Database> database);
@@ -54,6 +65,7 @@ class QueryBuilder {
                                   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;
+    virtual QString getForeignKeyCascade(DbForeignKeyCascade cascade) const;
     virtual QString dropForeignKey(QString name, QString tableName) const;
     virtual QString createIndex(QString name, QString tableName,
                                 QStringList columns,
