7#include "extractorvalidator.h"
8#include "validator-logging.h"
10#include <KItinerary/BoatTrip>
11#include <KItinerary/BusTrip>
12#include <KItinerary/Event>
13#include <KItinerary/Flight>
14#include <KItinerary/Place>
15#include <KItinerary/ProgramMembership>
16#include <KItinerary/RentalCar>
17#include <KItinerary/Reservation>
18#include <KItinerary/Taxi>
19#include <KItinerary/Ticket>
20#include <KItinerary/TrainTrip>
21#include <KItinerary/Visit>
28class ExtractorValidatorPrivate {
30 bool isSupportedTopLevelType(
const QVariant &elem)
const;
31 bool filterElement(
const QVariant &elem)
const;
34 bool filterAirport(
const Airport &airport)
const;
35 bool filterFlight(
const Flight &flight)
const;
36 bool filterTrainTrip(
const TrainTrip &trip)
const;
37 bool filterBusTrip(
const BusTrip &trip)
const;
38 bool filterBoatTrip(
const BoatTrip &trip)
const;
39 bool filterEvent(
const Event &event)
const;
41 bool filterLocalBusiness(
const LocalBusiness &business)
const;
42 bool filterReservation(
const Reservation &res)
const;
44 bool filterTicket(
const Ticket &ticket)
const;
46 std::vector<const QMetaObject*> m_acceptedTypes;
47 bool m_onlyComplete =
true;
51ExtractorValidator::ExtractorValidator() :
52 d(new ExtractorValidatorPrivate)
55ExtractorValidator::~ExtractorValidator() =
default;
59 d->m_acceptedTypes = std::move(accptedTypes);
64 d->m_onlyComplete = completeOnly;
68bool ExtractorValidatorPrivate::filterLodgingReservation(
const LodgingReservation &res)
const
70 return res.checkinTime().
isValid() && res.checkoutTime().
isValid() && res.checkinTime() <= res.checkoutTime();
73bool ExtractorValidatorPrivate::filterAirport(
const Airport &airport)
const
78bool ExtractorValidatorPrivate::filterFlight(
const Flight &flight)
const
82 return filterAirport(flight.departureAirport())
83 && filterAirport(flight.arrivalAirport())
88static bool filterPlace(
const T &place)
90 return !place.name().isEmpty();
93bool ExtractorValidatorPrivate::filterTrainTrip(
const TrainTrip &trip)
const
95 return filterPlace(trip.departureStation())
96 && filterPlace(trip.arrivalStation())
100bool ExtractorValidatorPrivate::filterBusTrip(
const BusTrip &trip)
const
102 return filterPlace(trip.departureBusStop())
103 && filterPlace(trip.arrivalBusStop())
104 && trip.departureTime().
isValid();
107bool ExtractorValidatorPrivate::filterBoatTrip(
const BoatTrip &trip)
const
109 return filterPlace(trip.departureBoatTerminal())
110 && filterPlace(trip.arrivalBoatTerminal())
111 && trip.departureTime().
isValid()
112 && trip.arrivalTime().
isValid();
115bool ExtractorValidatorPrivate::filterEvent(
const Event &event)
const
117 return !
event.name().isEmpty() &&
event.startDate().isValid();
122 return res.startTime().
isValid();
125bool ExtractorValidatorPrivate::filterLocalBusiness(
const LocalBusiness &business)
const
127 return !business.name().isEmpty();
130bool ExtractorValidatorPrivate::filterReservation(
const Reservation &res)
const
132 if (!m_onlyComplete) {
133 if (res.reservationFor().
isNull()
134 && res.modifiedTime().
isValid()
135 && !res.reservationNumber().
isEmpty()
136 && res.reservationStatus() == Reservation::ReservationCancelled)
142 if (!filterElement(res.reservationFor())) {
143 qCDebug(ValidatorLog) <<
"Reservation element discarded due to rejected reservationFor property:" << res.reservationFor().
typeName();
149bool ExtractorValidatorPrivate::filterProgramMembership(
const ProgramMembership &program)
const
154bool ExtractorValidatorPrivate::filterTicket(
const Ticket &ticket)
const
159template <
typename T,
bool (ExtractorVal
idatorPrivate::*F)(const T&) const>
160static inline bool callFilterWithType(
const ExtractorValidatorPrivate *d,
const QVariant &v)
166#define FILTER(Type, Func) { &Type::staticMetaObject, callFilterWithType<Type, &ExtractorValidatorPrivate::Func> }
169 bool (*filter)(
const ExtractorValidatorPrivate *d,
const QVariant &v);
170}
static const filter_func_map[] {
171 FILTER(
Flight, filterFlight),
173 FILTER(
BusTrip, filterBusTrip),
181 FILTER(
Ticket, filterTicket),
185bool ExtractorValidatorPrivate::filterElement(
const QVariant &elem)
const
189 qCDebug(ValidatorLog) <<
"Element discarded due to non-gadget type:" << elem.
typeName();
193 for (
const auto &f : filter_func_map) {
194 if (f.metaObject != mo) {
197 if (!f.filter(
this, elem)) {
202 mo = mo->superClass();
207bool ExtractorValidatorPrivate::isSupportedTopLevelType(
const QVariant &elem)
const
209 if (m_acceptedTypes.empty()) {
215 qCDebug(ValidatorLog) <<
"Element discarded due to non-gadget top-level type:" << elem.
typeName();
219 const auto it = std::find(m_acceptedTypes.begin(), m_acceptedTypes.end(), mo);
220 if (it != m_acceptedTypes.end()) {
223 mo = mo->superClass();
231 if (!d->isSupportedTopLevelType(elem)) {
232 qCDebug(ValidatorLog) <<
"Element discarded due to unsupported top-level type:" << elem.
typeName();
237 return d->filterElement(elem);
QDate departureDay
The scheduled day of departure.
A restaurant reservation.
A frequent traveler, bonus points or discount scheme program membership.
QString token
KItinerary extension: barcode token for program membership cards having a barcode representation (e....
Abstract base class for reservations.
QString ticketToken
The raw ticket token string.
QDate departureDay
The scheduled day of departure.
bool canConvert(const QVariant &value)
Checks if the given value can be up-cast to T.
Classes for reservation/travel data models, data extraction and data augmentation.
bool isValid(int year, int month, int day)
bool isValid() const const
bool isEmpty() const const
bool isNull() const const
const char * typeName() const const
int userType() const const