This commit is contained in:
Hamed Masafi 2018-01-15 17:20:40 +03:30
parent f0717cc05b
commit 7e437fd805
5 changed files with 46 additions and 25 deletions

View File

@ -71,7 +71,7 @@ public: \
#define NUT_FOREGION_KEY(type, keytype, name, read, write) \ #define NUT_FOREGION_KEY(type, keytype, name, read, write) \
Q_PROPERTY(type* name READ read WRITE write) \ Q_PROPERTY(type* name READ read WRITE write) \
NUT_DECLARE_FIELD(keytype, name##Id, read##Id, write##Id) \ NUT_DECLARE_FIELD(keytype, name##Id, read##Id, write##Id) \
NUT_INFO(__nut_FOREGION_KEY, name##Id, type) \ NUT_INFO(__nut_FOREGION_KEY, name, type) \
type *m_##name; \ type *m_##name; \
public: \ public: \
type *read() const { return m_##name ; } \ type *read() const { return m_##name ; } \

View File

@ -154,6 +154,7 @@ Q_OUTOFLINE_TEMPLATE QList<T *> Query<T>::toList(int count)
struct LevelData{ struct LevelData{
QList<int> masters; QList<int> masters;
QList<int> slaves; QList<int> slaves;
QList<QString> masterFields;
QString keyFiledname; QString keyFiledname;
QVariant lastKeyValue; QVariant lastKeyValue;
TableModel *table; TableModel *table;
@ -171,20 +172,26 @@ Q_OUTOFLINE_TEMPLATE QList<T *> Query<T>::toList(int count)
data.keyFiledname = data.table->name() + "." + data.table->primaryKey(); data.keyFiledname = data.table->name() + "." + data.table->primaryKey();
data.lastKeyValue = QVariant(); data.lastKeyValue = QVariant();
QSet<QString> masters; QHash<QString, QString> masters;
foreach (RelationModel *rel, d->relations) foreach (RelationModel *rel, d->relations)
if (rel->slaveTable->name() == table->name()) if (rel->slaveTable->name() == table->name())
masters.insert(rel->masterTable->name()); masters.insert(rel->masterTable->name(), rel->localProperty);
for (int j = 0; j < levels.count(); ++j) { for (int j = 0; j < levels.count(); ++j) {
LevelData &dt = levels[j]; LevelData &dt = levels[j];
qDebug() <<"[check]"<<table->name() << dt.table->name(); qDebug() <<"[check]"<<table->name() << dt.table->name();
foreach (QString m, masters)
if (dt.table->name() == m) { QHashIterator<QString, QString> it(masters);
while (it.hasNext()) {
it.next();
if (dt.table->name() == it.key()) {
data.masters.append(j); data.masters.append(j);
data.masterFields.append(it.value());
dt.slaves.append(i); dt.slaves.append(i);
} }
} }
}
qDebug() << data.table->name() <<"added"; qDebug() << data.table->name() <<"added";
levels.append(data); levels.append(data);
}; };
@ -194,6 +201,15 @@ Q_OUTOFLINE_TEMPLATE QList<T *> Query<T>::toList(int count)
add_table(i, rel->slaveTable); add_table(i, rel->slaveTable);
} }
if (!importedTables.count()) {
LevelData data;
data.table = d->database->model().tableByName(d->tableName);
data.keyFiledname = d->tableName + "." + data.table->primaryKey();
data.lastKeyValue = QVariant();
levels.append(data);
}
QVector<bool> checked; QVector<bool> checked;
checked.reserve(levels.count()); checked.reserve(levels.count());
for (int i = 0; i < levels.count(); ++i) for (int i = 0; i < levels.count(); ++i)
@ -243,24 +259,31 @@ Q_OUTOFLINE_TEMPLATE QList<T *> Query<T>::toList(int count)
= QMetaType::metaObjectForType(data.table->typeId()); = QMetaType::metaObjectForType(data.table->typeId());
table = qobject_cast<Table *>(childMetaObject->newInstance()); table = qobject_cast<Table *>(childMetaObject->newInstance());
qDebug() << data.table->name() <<"created";
} }
qDebug() << "table created" << table;
QStringList childFields = data.table->fieldsNames(); QStringList childFields = data.table->fieldsNames();
foreach (QString field, childFields) foreach (QString field, childFields)
table->setProperty(field.toLatin1().data(), table->setProperty(field.toLatin1().data(),
q.value(data.table->name() + "." + field)); q.value(data.table->name() + "." + field));
foreach (int master, data.masters) { for (int i = 0; i < data.masters.count(); ++i) {
int master = data.masters[i];
table->setProperty(data.masterFields[i].toLocal8Bit().data(),
QVariant::fromValue(levels[master].lastRow));
table->setParentTableSet(levels[master].lastRow->childTableSet(data.table->className())); table->setParentTableSet(levels[master].lastRow->childTableSet(data.table->className()));
qDebug() << data.table->name() << "added to" << levels[master].table->name(); TableSetBase *ts = levels[master].lastRow->childTableSet(data.table->className());
qDebug() << table << "added to"
<< levels[master].lastRow
<< ts->childClassName()
<< data.masterFields[i];
} }
table->setStatus(Table::FeatchedFromDB); table->setStatus(Table::FeatchedFromDB);
table->setParent(this); table->setParent(this);
table->clear(); table->clear();
qDebug() << "table created" << table;
//set last created row //set last created row
data.lastRow = table; data.lastRow = table;

View File

@ -223,7 +223,8 @@ TableModel::TableModel(int typeId, QString tableName)
if(type == __nut_FOREGION_KEY){ if(type == __nut_FOREGION_KEY){
RelationModel *fk = new RelationModel; RelationModel *fk = new RelationModel;
fk->slaveTable = this; fk->slaveTable = this;
fk->localColumn = name; fk->localColumn = name + "Id";
fk->localProperty = name;
fk->foregionColumn = value; fk->foregionColumn = value;
fk->masterClassName = value; fk->masterClassName = value;
_foregionKeys.append(fk); _foregionKeys.append(fk);

View File

@ -67,6 +67,7 @@ struct FieldModel{
struct RelationModel{ struct RelationModel{
//slave //slave
QString localColumn; QString localColumn;
QString localProperty;
TableModel *slaveTable; TableModel *slaveTable;
//master //master
QString foregionColumn; QString foregionColumn;

View File

@ -118,20 +118,23 @@ void MainTest::selectPosts()
PRINT(posts.length()); PRINT(posts.length());
PRINT(posts.at(0)->comments()->length()); PRINT(posts.at(0)->comments()->length());
// QTEST_ASSERT(posts.length() == 1); QTEST_ASSERT(posts.length() == 1);
// QTEST_ASSERT(posts.at(0)->comments()->length() == 3); QTEST_ASSERT(posts.at(0)->comments()->length() == 3);
// QTEST_ASSERT(posts.at(0)->title() == "post title"); QTEST_ASSERT(posts.at(0)->title() == "post title");
// QTEST_ASSERT(posts.at(0)->comments()->at(0)->message() == "comment #0"); QTEST_ASSERT(posts.at(0)->comments()->at(0)->message() == "comment #0");
// QTEST_ASSERT(posts.at(0)->comments()->at(1)->message() == "comment #1"); QTEST_ASSERT(posts.at(0)->comments()->at(1)->message() == "comment #1");
// QTEST_ASSERT(posts.at(0)->comments()->at(2)->message() == "comment #2"); QTEST_ASSERT(posts.at(0)->comments()->at(2)->message() == "comment #2");
db.cleanUp(); db.cleanUp();
} }
void MainTest::selectFirst() void MainTest::selectFirst()
{ {
auto posts = db.posts()->query() auto q = db.posts()->query();
->first();
auto posts = q->first();
qDebug() << q->sqlCommand();
QTEST_ASSERT(posts != Q_NULLPTR); QTEST_ASSERT(posts != Q_NULLPTR);
} }
@ -194,13 +197,6 @@ void MainTest::selectWithInvalidRelation()
q->toList(); q->toList();
} }
void MainTest::select10NewstPosts()
{
auto q = db.posts()->query();
q->orderBy(!Post::saveDateField());
q->toList(10);
}
void MainTest::modifyPost() void MainTest::modifyPost()
{ {
auto q = db.posts()->query(); auto q = db.posts()->query();