Files
2026-07-12 14:34:52 +04:00

117 lines
3.2 KiB
C++

#include "sessions_model.h"
#include <QSqlError>
#include <QSqlQuery>
SessionsModel::SessionsModel(QObject *parent, const QSqlDatabase &database)
: BaseSqlTableModel(parent, database) {}
void SessionsModel::initialize() {
setTable("sessions");
// Set up the relationship with the movies and halls tables
setRelation(fieldIndex("movie_id"),
QSqlRelation("movies", "movie_id", "title"));
setRelation(fieldIndex("hall_id"),
QSqlRelation("halls", "hall_id", "hall_name"));
setEditStrategy(QSqlTableModel::OnFieldChange);
bool success = select();
if (!success) {
qWarning() << "Error:" << lastError().text();
}
}
bool SessionsModel::buildHallIdFilterCondition(const QString &inFilter,
QString &outFilter) const {
QSqlQuery query;
query.prepare("SELECT hall_id FROM halls WHERE hall_name LIKE ?");
query.addBindValue("%" + inFilter + "%");
query.exec();
QStringList hallIds;
while (query.next()) {
hallIds << query.value(0).toString();
}
if (hallIds.isEmpty()) {
return false;
}
outFilter = QString("sessions.hall_id IN (%1)").arg(hallIds.join(", "));
return true;
}
bool SessionsModel::buildMovieIdFilterCondition(const QString &inFilter,
QString &outFilter) const {
QSqlQuery query;
query.prepare("SELECT movie_id FROM movies WHERE title LIKE ?");
query.addBindValue("%" + inFilter + "%");
query.exec();
QStringList movieIds;
while (query.next()) {
movieIds << query.value(0).toString();
}
if (movieIds.isEmpty()) {
return false;
}
outFilter = QString("sessions.movie_id IN (%1)").arg(movieIds.join(", "));
return true;
}
QVariant SessionsModel::headerData(int section, Qt::Orientation orientation,
int role) const {
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
switch (section) {
case SessionsColumns::Id:
return tr("ID");
case SessionsColumns::MovieId:
return tr("Movie Title");
case SessionsColumns::HallId:
return tr("Hall Name");
case SessionsColumns::BeginAt:
return tr("Start Time");
case SessionsColumns::TicketPrice:
return tr("Ticket Price");
default:
return QVariant();
}
}
return QSqlRelationalTableModel::headerData(section, orientation, role);
}
QString SessionsModel::createMultiColumnFilter(const QString &filter) const {
QStringList conditions;
QString buffer; // SessionsColumns::HallId And SessionsColumns::MovieId
if (buildHallIdFilterCondition(filter, buffer)) {
conditions.append(buffer);
}
if (buildMovieIdFilterCondition(filter, buffer)) {
conditions.append(buffer);
}
// WARNING: Does not filter these models transmitted through the data method,
// such as QDatetime
using Columns = SessionsColumns;
QStringList columns = {columnName(Columns::Id),
columnName(Columns::TicketPrice)};
#ifndef NO_DATE_TIME_SEARCH
columns.append(columnName(Columns::BeginAt));
#endif
for (const QString &column : columns) {
conditions.append(QString("%1 LIKE '%%2%'").arg(column).arg(filter));
}
return conditions.join(" OR ");
}