summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Holland <dominik.holland@pelagicore.com>2019-04-02 16:06:40 +0200
committerDominik Holland <dominik.holland@pelagicore.com>2019-05-07 14:14:00 +0000
commit0e73a6dea0651e4b7df8169d85d3b5b45d11a0b5 (patch)
treee7314dc08aaa23f8ceead4da9ab7622c406fe8c7
parent569268fd6c0fce70348695c9fe8949b17bb69924 (diff)
downloadqtivi-0e73a6dea0651e4b7df8169d85d3b5b45d11a0b5.tar.gz
Make the QIviQueryTerm and QIviOrderTerm classes serializable
This is needed to make a full featured generic async backend for the QIviSearchAndBrowseModel. Change-Id: Ifcbd6d86d45348f92427c78ce8ce48a918beeb6a Reviewed-by: Robert Griebl <robert.griebl@pelagicore.com>
-rw-r--r--src/ivicore/queryparser/qiviqueryterm.cpp116
-rw-r--r--src/ivicore/queryparser/qiviqueryterm.h20
-rw-r--r--src/ivimedia/qiviplayableitem.cpp2
-rw-r--r--tests/auto/core/queryparser/tst_queryparser.cpp11
4 files changed, 149 insertions, 0 deletions
diff --git a/src/ivicore/queryparser/qiviqueryterm.cpp b/src/ivicore/queryparser/qiviqueryterm.cpp
index 360e9a4..7460b12 100644
--- a/src/ivicore/queryparser/qiviqueryterm.cpp
+++ b/src/ivicore/queryparser/qiviqueryterm.cpp
@@ -43,6 +43,12 @@
#include "qiviqueryterm.h"
#include "qiviqueryterm_p.h"
+#include <QDataStream>
+#include <QMetaEnum>
+#include <QtDebug>
+
+QT_BEGIN_NAMESPACE
+
QIviConjunctionTermPrivate::QIviConjunctionTermPrivate()
: m_conjunction(QIviConjunctionTerm::And)
{
@@ -402,3 +408,113 @@ QString QIviOrderTerm::propertyName() const
{
return d->m_propertyName;
}
+
+QDataStream &operator<<(QDataStream &out, QIviConjunctionTerm::Conjunction var)
+{
+ out << int(var);
+ return out;
+}
+
+QDataStream &operator>>(QDataStream &in, QIviConjunctionTerm::Conjunction &var)
+{
+ int val;
+ in >> val;
+ QMetaEnum metaEnum = QMetaEnum::fromType<QIviConjunctionTerm::Conjunction>();
+ if (metaEnum.valueToKey(val) == nullptr)
+ qWarning() << "Received an invalid enum value for type QIviConjunctionTerm::Conjunction, value =" << val;
+ var = QIviConjunctionTerm::Conjunction(val);
+ return in;
+}
+
+QDataStream &operator<<(QDataStream &out, QIviFilterTerm::Operator var)
+{
+ out << int(var);
+ return out;
+}
+
+QDataStream &operator>>(QDataStream &in, QIviFilterTerm::Operator &var)
+{
+ int val;
+ in >> val;
+ QMetaEnum metaEnum = QMetaEnum::fromType<QIviFilterTerm::Operator>();
+ if (metaEnum.valueToKey(val) == nullptr)
+ qWarning() << "Received an invalid enum value for type QIviFilterTerm::Operator, value =" << val;
+ var = QIviFilterTerm::Operator(val);
+ return in;
+}
+
+QDataStream &operator<<(QDataStream &out, QIviAbstractQueryTerm *var)
+{
+ if (var->type() == QIviAbstractQueryTerm::FilterTerm) {
+ auto *term = static_cast<QIviFilterTerm*>(var);
+ out << QStringLiteral("filter");
+ out << term->operatorType();
+ out << term->value();
+ out << term->propertyName();
+ out << term->isNegated();
+ } else if (var->type() == QIviAbstractQueryTerm::ScopeTerm) {
+ auto *term = static_cast<QIviScopeTerm*>(var);
+ out << QStringLiteral("scope");
+ out << term->isNegated();
+ out << term->term();
+ } else {
+ auto *term = static_cast<QIviConjunctionTerm*>(var);
+ out << QStringLiteral("conjunction");
+ out << term->conjunction();
+ const auto subTerms = term->terms();
+ out << subTerms.count();
+ for (const auto subTerm : subTerms)
+ out << subTerm;
+ }
+ return out;
+}
+
+QDataStream &operator>>(QDataStream &in, QIviAbstractQueryTerm **var)
+{
+ QString type;
+ QIviAbstractQueryTerm *aTerm=nullptr;
+ in >> type;
+ if (type == QStringLiteral("filter")) {
+ auto term = new QIviFilterTerm();
+ aTerm = term;
+ in >> term->d_ptr->m_operator;
+ in >> term->d_ptr->m_value;
+ in >> term->d_ptr->m_property;
+ in >> term->d_ptr->m_negated;
+ } else if (type == QStringLiteral("scope")) {
+ auto term = new QIviScopeTerm();
+ aTerm = term;
+ in >> term->d_ptr->m_negated;
+ in >> &term->d_ptr->m_term;
+ } else {
+ Q_ASSERT(type == QStringLiteral("conjunction"));
+ auto term = new QIviConjunctionTerm();
+ aTerm = term;
+ int count = 0;
+ in >> term->d_ptr->m_conjunction;
+ in >> count;
+ for (int i = 0; i < count; ++i) {
+ QIviAbstractQueryTerm *subTerm=nullptr;
+ in >> &subTerm;
+ term->d_ptr->m_terms.append(subTerm);
+ }
+ }
+ *var = aTerm;
+ return in;
+}
+
+QDataStream &operator<<(QDataStream &out, const QIviOrderTerm &var)
+{
+ out << var.propertyName();
+ out << var.isAscending();
+ return out;
+}
+
+QDataStream &operator>>(QDataStream &in, QIviOrderTerm &var)
+{
+ in >> var.d->m_propertyName;
+ in >> var.d->m_ascending;
+ return in;
+}
+
+QT_END_NAMESPACE
diff --git a/src/ivicore/queryparser/qiviqueryterm.h b/src/ivicore/queryparser/qiviqueryterm.h
index d907b37..2cbb4f1 100644
--- a/src/ivicore/queryparser/qiviqueryterm.h
+++ b/src/ivicore/queryparser/qiviqueryterm.h
@@ -69,11 +69,13 @@ public:
class QIviConjunctionTermPrivate;
class Q_QTIVICORE_EXPORT QIviConjunctionTerm : public QIviAbstractQueryTerm
{
+ Q_GADGET
public:
enum Conjunction {
And,
Or
};
+ Q_ENUM(Conjunction)
explicit QIviConjunctionTerm();
~QIviConjunctionTerm() override;
@@ -88,11 +90,13 @@ private:
QIviConjunctionTermPrivate * d_ptr;
Q_DECLARE_PRIVATE(QIviConjunctionTerm)
friend class QIviQueryParser;
+ friend Q_QTIVICORE_EXPORT QDataStream &operator>>(QDataStream &in, QIviAbstractQueryTerm** var);
};
class QIviScopeTermPrivate;
class Q_QTIVICORE_EXPORT QIviScopeTerm : public QIviAbstractQueryTerm
{
+ Q_GADGET
public:
explicit QIviScopeTerm();
@@ -108,11 +112,13 @@ private:
QIviScopeTermPrivate * d_ptr;
Q_DECLARE_PRIVATE(QIviScopeTerm)
friend class QIviQueryParser;
+ friend Q_QTIVICORE_EXPORT QDataStream &operator>>(QDataStream &in, QIviAbstractQueryTerm** var);
};
class QIviFilterTermPrivate;
class Q_QTIVICORE_EXPORT QIviFilterTerm : public QIviAbstractQueryTerm
{
+ Q_GADGET
public:
enum Operator {
Equals,
@@ -123,6 +129,7 @@ public:
LowerThan,
LowerEquals
};
+ Q_ENUM(Operator)
explicit QIviFilterTerm();
~QIviFilterTerm() override;
@@ -139,6 +146,7 @@ private:
QIviFilterTermPrivate * d_ptr;
Q_DECLARE_PRIVATE(QIviFilterTerm)
friend class QIviQueryParser;
+ friend Q_QTIVICORE_EXPORT QDataStream &operator>>(QDataStream &in, QIviAbstractQueryTerm** var);
};
class QIviOrderTermPrivate;
@@ -156,10 +164,22 @@ public:
private:
QSharedDataPointer<QIviOrderTermPrivate> d;
friend class QIviQueryParser;
+ friend Q_QTIVICORE_EXPORT QDataStream &operator>>(QDataStream &in, QIviOrderTerm &var);
};
Q_DECLARE_TYPEINFO(QIviOrderTerm, Q_MOVABLE_TYPE);
+Q_QTIVICORE_EXPORT QDataStream &operator<<(QDataStream &out, QIviConjunctionTerm::Conjunction var);
+Q_QTIVICORE_EXPORT QDataStream &operator>>(QDataStream &in, QIviConjunctionTerm::Conjunction &var);
+Q_QTIVICORE_EXPORT QDataStream &operator<<(QDataStream &out, QIviFilterTerm::Operator var);
+Q_QTIVICORE_EXPORT QDataStream &operator>>(QDataStream &in, QIviFilterTerm::Operator &var);
+Q_QTIVICORE_EXPORT QDataStream &operator<<(QDataStream &out, QIviAbstractQueryTerm *var);
+Q_QTIVICORE_EXPORT QDataStream &operator>>(QDataStream &in, QIviAbstractQueryTerm **var);
+Q_QTIVICORE_EXPORT QDataStream &operator<<(QDataStream &out, const QIviOrderTerm &var);
+Q_QTIVICORE_EXPORT QDataStream &operator>>(QDataStream &in, QIviOrderTerm &var);
+
QT_END_NAMESPACE
+Q_DECLARE_METATYPE(QIviOrderTerm)
+
#endif // QUERYTERM_H
diff --git a/src/ivimedia/qiviplayableitem.cpp b/src/ivimedia/qiviplayableitem.cpp
index 6559fc6..e91f0af 100644
--- a/src/ivimedia/qiviplayableitem.cpp
+++ b/src/ivimedia/qiviplayableitem.cpp
@@ -41,6 +41,8 @@
****************************************************************************/
#include "qiviplayableitem.h"
+#include <QDataStream>
+#include <QDebug>
QT_BEGIN_NAMESPACE
diff --git a/tests/auto/core/queryparser/tst_queryparser.cpp b/tests/auto/core/queryparser/tst_queryparser.cpp
index bcaade2..fb7f21e 100644
--- a/tests/auto/core/queryparser/tst_queryparser.cpp
+++ b/tests/auto/core/queryparser/tst_queryparser.cpp
@@ -155,6 +155,17 @@ void TestQueryParser::validQueries()
CHECK_ERRORSTRING(term->toString(), representationQuery);
+ //Test the searialize functions
+ QByteArray buffer;
+ QDataStream in(&buffer, QIODevice::WriteOnly);
+ in << term;
+
+ QDataStream out(buffer);
+ QIviAbstractQueryTerm *newTerm = nullptr;
+ out >> &newTerm;
+
+ QCOMPARE(term->toString(), newTerm->toString());
+ delete newTerm;
delete term;
}