From: pavelpa Date: Thu, 21 Jan 2010 13:24:08 +0000 (+0000) Subject: combined EVENT and VIRTUAL_EVENT => 'EVENT' now X-Git-Tag: 0.5.0~232 X-Git-Url: https://git.toastfreeware.priv.at/toast/confclerk.git/commitdiff_plain/7d7659d9245bb55bba9043ed269aa92cbd38e8b0 combined EVENT and VIRTUAL_EVENT => 'EVENT' now - Maemo sqlite doesn't support Full-Text-Search --- diff --git a/src/mvc/event.cpp b/src/mvc/event.cpp index 8bf984d..d327d77 100644 --- a/src/mvc/event.cpp +++ b/src/mvc/event.cpp @@ -1,15 +1,8 @@ #include "event.h" -// 'event' record is splitted into two separate tables 'event' and 'virtual_event' -// for the FTS (Full-Text-Search) support and so, it is necessary to provide/use -// two table names + corresponding parameters/methods, see bellow -QString const Event::sTable1Name = QString("event"); -QString const Event::sTable2Name = QString("virtual_event"); -int const Event::sTable1ColCount = 9; // see 'toRecord()' for more details -int const Event::sTable2ColCount = 5; // see 'toRecord()' for more details +QString const Event::sTableName = QString("event"); QSqlRecord const Event::sColumns = Event::toRecord(QList() - /* 'columns from Table 1 */ << QSqlField("id", QVariant::Int) << QSqlField("xid_conference", QVariant::Int) << QSqlField("start", QVariant::DateTime) @@ -19,7 +12,6 @@ QSqlRecord const Event::sColumns = Event::toRecord(QList() << QSqlField("language", QVariant::String) << QSqlField("favourite", QVariant::Bool) << QSqlField("alarm", QVariant::Bool) - /* 'columns' from Table2 */ << QSqlField("tag", QVariant::String) << QSqlField("title", QVariant::String) << QSqlField("subtitle", QVariant::String) @@ -29,22 +21,18 @@ QSqlRecord const Event::sColumns = Event::toRecord(QList() Event Event::getById(int id, int conferenceId) { + QSqlQuery query; - query.prepare( - selectQueryJoin2T("id") - + QString("WHERE %1.id = :id AND %1.xid_conference = :conf").arg(sTable1Name)); + query.prepare(selectQuery() + "WHERE id = :id AND xid_conference = :conf"); query.bindValue(":id", id); query.bindValue(":conf", conferenceId); - return loadOne(query); } QList Event::getByDate(const QDate& date, int conferenceId, QString orderBy) { QSqlQuery query; - query.prepare( - selectQueryJoin2T("id") - + QString("WHERE %1.xid_conference = :conf AND %1.start >= :start AND %1.start < :end ORDER BY %1.%2").arg(sTable1Name).arg(orderBy)); + query.prepare(selectQuery() + QString("WHERE xid_conference = :conf AND start >= :start AND start < :end ORDER BY %1").arg(orderBy)); query.bindValue(":conf", conferenceId); query.bindValue(":start", convertToDb(date, QVariant::DateTime)); query.bindValue(":end", convertToDb(date.addDays(1), QVariant::DateTime)); @@ -55,9 +43,7 @@ QList Event::getByDate(const QDate& date, int conferenceId, QString order QList Event::getFavByDate(const QDate& date, int conferenceId) { QSqlQuery query; - query.prepare( - selectQueryJoin2T("id") - + QString("WHERE %1.xid_conference = :conf AND %1.start >= :start AND %1.start < :end AND %1.favourite = 1 ORDER BY %1.start").arg(sTable1Name)); + query.prepare(selectQuery() + QString("WHERE xid_conference = :conf AND start >= :start AND start < :end AND favourite = 1 ORDER BY start")); query.bindValue(":conf", conferenceId); query.bindValue(":start", convertToDb(date, QVariant::DateTime)); query.bindValue(":end", convertToDb(date.addDays(1), QVariant::DateTime)); @@ -116,10 +102,8 @@ void Event::setPersons(const QStringList &persons) QList Event::getSearchResultByDate(const QDate& date, int conferenceId, QString orderBy) { - QString strQuery = QString("SELECT %1 FROM EVENT INNER JOIN VIRTUAL_EVENT USING (xid_conference, id) " - "INNER JOIN SEARCH_EVENT USING (xid_conference, id) ").arg( columnsForSelectJoin2T() ); - strQuery += QString( - "WHERE %1.xid_conference = :conf AND %1.start >= :start AND %1.start < :end ORDER BY %1.%2").arg(sTable1Name, orderBy); + QString strQuery = QString("SELECT %1 FROM EVENT INNER JOIN SEARCH_EVENT USING (xid_conference, id) ").arg(columnsForSelect()); + strQuery += QString("WHERE xid_conference = :conf AND start >= :start AND start < :end ORDER BY %1").arg(orderBy); qDebug() << strQuery; QSqlQuery query; query.prepare( strQuery ); diff --git a/src/mvc/event.h b/src/mvc/event.h index 93ca4e3..a667e4f 100644 --- a/src/mvc/event.h +++ b/src/mvc/event.h @@ -18,18 +18,13 @@ class Event : public OrmRecord { public: static const QSqlRecord sColumns; - //static QString const sTableName; - static const QString sTable1Name; - static const QString sTable2Name; - static const int sTable1ColCount; - static const int sTable2ColCount; + static QString const sTableName; public: static Event getById(int id, int conferenceId); static QList getByDate(const QDate & date, int conferenceId, QString orderBy); static QList getFavByDate(const QDate & date, int conferenceId); // get Favourities by Date static QList getSearchResultByDate(const QDate& date, int conferenceId, QString orderBy); public: - // Table 1 int id() const { return value("id").toInt(); } int conferenceId() const { return value("xid_conference").toInt(); } QDateTime start() const { return value("start").toDateTime(); } @@ -40,7 +35,6 @@ public: bool isFavourite() const { return value("favourite").toBool(); } bool hasAlarm() const { return value("alarm").toBool(); } bool hasTimeConflict() const { return true; /*return value("warning").toBool()*/; } //TODO - // Table 2 : virtual table for FTS (Full Text Search) QString tag() const { return value("tag").toString(); } QString title() const { return value("title").toString(); } QString subtitle() const { return value("subtitle").toString(); } @@ -50,7 +44,6 @@ public: QString room() const; QStringList persons() const; - // Table 1 void setId(int id) { setValue("id", id); } void setConferenceId(int conferenceId) { setValue("xid_conference", conferenceId); } void setStart(const QDateTime & start) { setValue("start", start); } @@ -60,7 +53,6 @@ public: void setLanguage(const QString & language) { setValue("language", language); } void setFavourite(bool favourite) { setValue("favourite", (int)((favourite))); } void setHasAlarm(bool alarm) { setValue("alarm", (int)((alarm))); } - // Table 2 : virtual table for FTS (Full Text Search) void setTag(const QString& tag) { setValue("tag", tag); } void setTitle(const QString& title) { setValue("title", title); } void setSubtitle(const QString& subtitle) { setValue("subtitle", subtitle); } diff --git a/src/orm/ormrecord.h b/src/orm/ormrecord.h index 2328549..f3c0fcc 100644 --- a/src/orm/ormrecord.h +++ b/src/orm/ormrecord.h @@ -9,19 +9,6 @@ #include #include -// INFO: -// all record items/columns may be defined in one table (1.), or -// they can be splitted in two separate tables (2.) (eg. for FTS support) -// 1.) you have to define "static QString const sTableName" -// 2.) you have to define two table names: -// "static QString const sTable1Name" -// "static QString const sTable2Name" -// and since all record items/columns are handled by one QSqlRecord, -// you have to also define number of columns that belongs to table 1 (1.), and table 2 (2.) -// 1.) "static int const sTable1ColCount" -// 2.) "static int const sTable2ColCount" -// there are also defined auxiliary methods for 1-Table/2-Tables approach, see bellow - class OrmException { }; @@ -61,9 +48,6 @@ protected: static QString columnsForSelect(const QString& prefix = QString()); static QString selectQuery(); static QString updateQuery(); - // record items/columns are stored in two tables - static QString columnsForSelectJoin2T(); // for joining two tables - static QString selectQueryJoin2T(const QString &key); // for joining two tables static QVariant convertToC(QVariant value, QVariant::Type colType); static QVariant convertToDb(QVariant value, QVariant::Type colType); @@ -170,47 +154,16 @@ QString OrmRecord::columnsForSelect(const QString& prefix) return prefixedColumns.join(","); } -template -QString OrmRecord::columnsForSelectJoin2T() -{ - Q_ASSERT((T::sTable1ColCount+T::sTable2ColCount) == T::sColumns.count()); - - QStringList prefixedColumns; - for (int i=0; i QString OrmRecord::selectQuery() { return QString("SELECT %1 FROM %2 ").arg(columnsForSelect(), T::sTableName); } - -template -QString OrmRecord::selectQueryJoin2T(const QString &key) -{ - return QString("SELECT %1 FROM %2 INNER JOIN %3 ON %4.%5 = %6.%7 ").arg( - columnsForSelectJoin2T(), - T::sTable1Name, - T::sTable2Name, - T::sTable1Name, - key, - T::sTable2Name, - key); -} - template QString OrmRecord::updateQuery() { - return QString("UPDATE %1 ").arg(T::sTable1Name); + return QString("UPDATE %1 ").arg(T::sTableName); } template diff --git a/src/sql/sqlengine.cpp b/src/sql/sqlengine.cpp index a9b482f..6034cc0 100644 --- a/src/sql/sqlengine.cpp +++ b/src/sql/sqlengine.cpp @@ -104,10 +104,8 @@ void SqlEngine::addEventToDB(QHash &aEvent) trackId = track.insert(); /*qDebug() << QString("DEBUG: Track %1 added to DB").arg(name);*/ } - // The items of the Event are divided into the two tables EVENT and VIRTUAL_EVENT - // VIRTUAL_EVENT is for Full-Text-Serach Support QDateTime startDateTime = QDateTime(QDate::fromString(aEvent["date"],DATE_FORMAT),QTime::fromString(aEvent["start"],TIME_FORMAT)); - QString values = QString("'%1', '%2', '%3', '%4', '%5', '%6', '%7', '%8', '%9'") \ + QString values = QString("'%1', '%2', '%3', '%4', '%5', '%6', '%7', ? , ? , ? , ? , ? , '%8', '%9'") \ .arg(aEvent["conference_id"]) \ .arg(aEvent["id"]) \ .arg(QString::number(startDateTime.toTime_t())) \ @@ -118,26 +116,19 @@ void SqlEngine::addEventToDB(QHash &aEvent) .arg("0") \ .arg("0"); - QString query = QString("INSERT INTO EVENT (xid_conference, id, start, duration, xid_track, type, language, favourite, alarm) VALUES (%1)").arg(values); - QSqlQuery result (query, db); - //LOG_AUTOTEST(query); - - // add some(text related) Event's items to VIRTUAL_EVENT table - QString values2 = QString("'%1', '%2', '%3', ? , ? , ? , ? ") \ - .arg(aEvent["conference_id"]) \ - .arg(aEvent["id"]) \ - .arg(aEvent["tag"]); - - QString query2 = QString("INSERT INTO VIRTUAL_EVENT (xid_conference, id, tag, title, subtitle, abstract, description) VALUES (%1)").arg(values2); - - QSqlQuery result2; - result2.prepare(query2); - result2.bindValue(0,aEvent["title"]); - result2.bindValue(1,aEvent["subtitle"]); - result2.bindValue(2,aEvent["abstract"]); - result2.bindValue(3,aEvent["description"]); - result2.exec(); - //LOG_AUTOTEST(query2); + QString query = + QString("INSERT INTO EVENT (xid_conference, id, start, duration, xid_track, type, language, tag, title, subtitle, abstract, description, favourite, alarm) VALUES (%1)") + .arg(values); + + QSqlQuery result; + result.prepare(query); + result.bindValue(0,aEvent["tag"]); + result.bindValue(1,aEvent["title"]); + result.bindValue(2,aEvent["subtitle"]); + result.bindValue(3,aEvent["abstract"]); + result.bindValue(4,aEvent["description"]); + qDebug() << result.lastQuery(); + result.exec(); } } @@ -249,34 +240,16 @@ bool SqlEngine::createTables(QSqlDatabase &aDatabase) xid_track INTEGER NOT NULL REFERENCES TRACK(id), \ type VARCHAR, \ language VARCHAR, \ + tag VARCHAR,title VARCHAR NOT NULL , \ + subtitle VARCHAR, \ + abstract VARCHAR, \ + description VARCHAR, \ favourite INTEGER DEFAULT 0, \ alarm INTEGER DEFAULT 0, \ PRIMARY KEY (xid_conference,id), \ FOREIGN KEY(xid_conference) REFERENCES CONFERENCE(id) \ FOREIGN KEY(xid_track) REFERENCES TRACK(id))"); -#ifdef MAEMO - // TBD: MAEMO Virtual tables compatibility (waiting for Marek). - // MAEMO sqlite Qt driver doesn't provide FTS support by default - use the following HACK - query.exec("CREATE TABLE VIRTUAL_EVENT ( \ - xid_conference INTEGER NOT NULL, \ - id INTEGER NOT NULL , \ - tag VARCHAR,title VARCHAR NOT NULL , \ - subtitle VARCHAR, \ - abstract VARCHAR, \ - description VARCHAR, \ - PRIMARY KEY (xid_conference,id))"); -#else - query.exec("CREATE VIRTUAL TABLE VIRTUAL_EVENT using fts3 ( \ - xid_conference INTEGER NOT NULL, \ - id INTEGER NOT NULL , \ - tag VARCHAR,title VARCHAR NOT NULL , \ - subtitle VARCHAR, \ - abstract VARCHAR, \ - description VARCHAR, \ - PRIMARY KEY (xid_conference,id))"); -#endif - query.exec("CREATE TABLE EVENT_PERSON ( \ xid_conference INTEGER NOT NULL , \ xid_event INTEGER NOT NULL , \