//painter->fillRect(option.rect, option.palette.highlight());
// draw title
- QPointF titlePointF(option.rect.x(),option.rect.y()+option.rect.height()-10);
- QString text = qVariantValue<QString>(index.data());
+ QPointF titlePointF(option.rect.x()+SPACER,option.rect.y()+option.rect.height()-10);
+ QString text;
+ if(index.parent().isValid()) // event
+ text = qVariantValue<QString>(index.data()) + ": " + static_cast<Event*>(index.internalPointer())->title();
+ else // group
+ text = qVariantValue<QString>(index.data());
painter->drawText(titlePointF,text);
painter->restore();
#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 = 8; // see 'toRecord()' for more details
+int const Event::sTable2ColCount = 5; // see 'toRecord()' for more details
+
QSqlRecord const Event::sColumns = Event::toRecord(QList<QSqlField>()
+ /* 'columns from Table 1 */
<< QSqlField("id", QVariant::Int)
<< QSqlField("xid_conference", QVariant::Int)
<< QSqlField("start", QVariant::DateTime)
<< QSqlField("xid_activity", QVariant::Int)
<< QSqlField("type", QVariant::String)
<< QSqlField("language", QVariant::String)
- << QSqlField("favourite", QVariant::Bool));
+ << QSqlField("favourite", QVariant::Bool)
+ /* 'columns' from Table2 */
+ << QSqlField("tag", QVariant::String)
+ << QSqlField("title", QVariant::String)
+ << QSqlField("subtitle", QVariant::String)
+ << QSqlField("abstract", QVariant::String)
+ << QSqlField("description", QVariant::String));
-QString const Event::sTableName = QString("event");
Event Event::getById(int id, int conferenceId)
{
QSqlQuery query;
- query.prepare(selectQuery() + "WHERE id = :id AND xid_conference = :conf");
+ query.prepare(selectQueryJoin2T("id") + "WHERE event.id = :id AND event.xid_conference = :conf");
query.bindValue(":id", id);
query.bindValue(":conf", conferenceId);
+
return loadOne(query);
}
QList<Event> Event::getByDate(const QDate& date, int conferenceId)
{
QSqlQuery query;
- query.prepare(selectQuery() + "WHERE xid_conference = :conf AND start >= :start AND start < :end ORDER BY start");
+ query.prepare(selectQueryJoin2T("id") + "WHERE event.xid_conference = :conf AND event.start >= :start AND event.start < :end ORDER BY event.start");
query.bindValue(":conf", conferenceId);
query.bindValue(":start", convertToDb(date, QVariant::DateTime));
query.bindValue(":end", convertToDb(date.addDays(1), QVariant::DateTime));
{
public:
static QSqlRecord const sColumns;
- static QString const sTableName;
+ //static QString const sTableName;
+ static QString const sTable1Name;
+ static QString const sTable2Name;
+ static int const sTable1ColCount;
+ static int const sTable2ColCount;
public:
static Event getById(int id, int conferenceId);
static QList<Event> getByDate(const QDate& date, int conferenceId);
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(); }
QString type() const { return value("type").toString(); }
QString language() const { return value("language").toString(); }
bool isFavourite() const { return value("favourite").toBool(); }
+ // 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(); }
+ QString abstract() const { return value("abstract").toString(); }
+ QString description() const { return value("description").toString(); }
+ // 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); }
void setType(const QString& type) { setValue("type", type); }
void setLanguage(const QString& language) { setValue("language", language); }
void setFavourite(bool favourite) { setValue("favourite", favourite); }
+ // 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); }
+ void setAbstract(const QString& abstract) { setValue("abstract", abstract); }
+ void setDescription(const QString& description) { setValue("description", description); }
friend class EventTest;
};
#include <QDateTime>
#include <QDebug>
+// 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
{
};
static QList<T> load(QSqlQuery query);
// auxiliary methods
+ static QSqlRecord toRecord(const QList<QSqlField> & columnList);
+ // all record items/columns are in one table
static QString columnsForSelect(const QString& prefix = QString());
static QString selectQuery();
static QString updateQuery();
- static QSqlRecord toRecord(const QList<QSqlField> & columnList);
+ // 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);
return prefixedColumns.join(",");
}
+template <typename T>
+QString OrmRecord<T>::columnsForSelectJoin2T()
+{
+ Q_ASSERT((T::sTable1ColCount+T::sTable2ColCount) == T::sColumns.count());
+
+ QStringList prefixedColumns;
+ for (int i=0; i<T::sTable1ColCount; i++)
+ {
+ prefixedColumns.append(QString("%1.%2").arg(T::sTable1Name, T::sColumns.field(i).name()));
+ }
+ for (int j=0; j<T::sTable2ColCount; j++)
+ {
+ prefixedColumns.append(QString("%1.%2").arg(T::sTable2Name, T::sColumns.field(T::sTable1ColCount+j).name()));
+ }
+ return prefixedColumns.join(",");
+}
+
template <typename T>
QString OrmRecord<T>::selectQuery()
{
return QString("SELECT %1 FROM %2 ").arg(columnsForSelect(), T::sTableName);
}
+template <typename T>
+QString OrmRecord<T>::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 <typename T>
QString OrmRecord<T>::updateQuery()
{
- return QString("UPDATE %1 ").arg(T::sTableName);
+ return QString("UPDATE %1 ").arg(T::sTable1Name);
}
template <typename T>
}
#endif // ORMRECORD_H
+