summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/imports/organizer/plugin.cpp1
-rw-r--r--src/imports/organizer/plugins.qmltypes24
-rw-r--r--src/imports/organizer/qdeclarativeorganizeritemfilter.cpp153
-rw-r--r--src/imports/organizer/qdeclarativeorganizeritemfilter_p.h37
-rw-r--r--src/organizer/filters/filters.pri3
-rw-r--r--src/organizer/filters/qorganizeritemdetailfieldfilter.cpp156
-rw-r--r--src/organizer/filters/qorganizeritemdetailfieldfilter.h76
-rw-r--r--src/organizer/filters/qorganizeritemdetailfieldfilter_p.h136
-rw-r--r--src/organizer/filters/qorganizeritemdetailfilter.cpp89
-rw-r--r--src/organizer/filters/qorganizeritemdetailfilter.h17
-rw-r--r--src/organizer/filters/qorganizeritemdetailfilter_p.h27
-rw-r--r--src/organizer/filters/qorganizeritemfilters.h1
-rw-r--r--src/organizer/qorganizeritemdetail.cpp2
-rw-r--r--src/organizer/qorganizeritemfilter.cpp8
-rw-r--r--src/organizer/qorganizeritemfilter.h1
-rw-r--r--src/organizer/qorganizermanagerengine.cpp44
-rw-r--r--src/plugins/organizer/jsondb/qorganizerjsondbconverter.cpp466
-rw-r--r--src/plugins/organizer/jsondb/qorganizerjsondbconverter.h15
-rw-r--r--src/plugins/organizer/jsondb/qorganizerjsondbengine.cpp99
-rw-r--r--src/plugins/organizer/jsondb/qorganizerjsondbengine.h3
-rw-r--r--src/plugins/organizer/jsondb/qorganizerjsondbrequestthread.cpp10
-rw-r--r--src/plugins/organizer/memory/qorganizeritemmemorybackend_p.h1
-rw-r--r--tests/auto/organizer/qmlorganizer/qmlorganizer.pro1
-rw-r--r--tests/auto/organizer/qmlorganizer/testcases/tst_detailfieldfilter.qml814
-rw-r--r--tests/auto/organizer/qmlorganizer/testcases/tst_detailfilter.qml694
-rw-r--r--tests/auto/organizer/qmlorganizer/testcases/tst_organizermodel.qml6
-rw-r--r--tests/auto/organizer/qorganizeritemasync/unittest/tst_qorganizeritemasync.cpp20
-rw-r--r--tests/auto/organizer/qorganizeritemfilter/tst_qorganizeritemfilter.cpp255
-rw-r--r--tests/auto/organizer/qorganizermanager/tst_qorganizermanager.cpp190
29 files changed, 2511 insertions, 838 deletions
diff --git a/src/imports/organizer/plugin.cpp b/src/imports/organizer/plugin.cpp
index 06a006981..f8615de02 100644
--- a/src/imports/organizer/plugin.cpp
+++ b/src/imports/organizer/plugin.cpp
@@ -112,6 +112,7 @@ public:
qmlRegisterType<QDeclarativeOrganizerItemFilter>(uri, major, minor, "Filter");
qmlRegisterType<QDeclarativeOrganizerItemCollectionFilter>(uri, major, minor, "CollectionFilter");
qmlRegisterType<QDeclarativeOrganizerItemDetailFilter>(uri, major, minor, "DetailFilter");
+ qmlRegisterType<QDeclarativeOrganizerItemDetailFieldFilter>(uri, major, minor, "DetailFieldFilter");
qmlRegisterType<QDeclarativeOrganizerItemDetailRangeFilter>(uri, major, minor, "DetailRangeFilter");
qmlRegisterType<QDeclarativeOrganizerItemIdFilter>(uri, major, minor, "IdFilter");
qmlRegisterType<QDeclarativeOrganizerItemIntersectionFilter>(uri, major, minor, "IntersectionFilter");
diff --git a/src/imports/organizer/plugins.qmltypes b/src/imports/organizer/plugins.qmltypes
index d6e97160d..9736d1458 100644
--- a/src/imports/organizer/plugins.qmltypes
+++ b/src/imports/organizer/plugins.qmltypes
@@ -515,9 +515,9 @@ Module {
}
}
Component {
- name: "QDeclarativeOrganizerItemDetailFilter"
+ name: "QDeclarativeOrganizerItemDetailFieldFilter"
prototype: "QDeclarativeOrganizerItemFilter"
- exports: ["DetailFilter 5.0"]
+ exports: ["DetailFieldFilter 5.0"]
Property { name: "value"; type: "QVariant" }
Property { name: "matchFlags"; type: "QDeclarativeOrganizerItemFilter::MatchFlags" }
Property { name: "field"; type: "int" }
@@ -525,6 +525,13 @@ Module {
Signal { name: "valueChanged"; type: "void" }
}
Component {
+ name: "QDeclarativeOrganizerItemDetailFilter"
+ prototype: "QDeclarativeOrganizerItemFilter"
+ exports: ["DetailFilter 5.0"]
+ Property { name: "detail"; type: "QDeclarativeOrganizerItemDetail"; isPointer: true }
+ Signal { name: "valueChanged"; type: "void" }
+ }
+ Component {
name: "QDeclarativeOrganizerItemDetailRangeFilter"
prototype: "QDeclarativeOrganizerItemFilter"
exports: ["DetailRangeFilter 5.0"]
@@ -631,14 +638,15 @@ Module {
Enum {
name: "FilterType"
values: {
- "DefaultFilter": 7,
+ "DefaultFilter": 8,
"InvalidFilter": 0,
- "IntersectionFilter": 3,
- "UnionFilter": 4,
- "CollectionFilter": 6,
+ "IntersectionFilter": 4,
+ "UnionFilter": 5,
+ "CollectionFilter": 7,
"DetailFilter": 1,
- "DetailRangeFilter": 2,
- "IdFilter": 5
+ "DetailFieldFilter": 2,
+ "DetailRangeFilter": 3,
+ "IdFilter": 6
}
}
Enum {
diff --git a/src/imports/organizer/qdeclarativeorganizeritemfilter.cpp b/src/imports/organizer/qdeclarativeorganizeritemfilter.cpp
index cbb564a2a..9202847bd 100644
--- a/src/imports/organizer/qdeclarativeorganizeritemfilter.cpp
+++ b/src/imports/organizer/qdeclarativeorganizeritemfilter.cpp
@@ -74,8 +74,9 @@ QDeclarativeOrganizerItemFilter::QDeclarativeOrganizerItemFilter(QObject *parent
\li Filter.UnionFilter A filter which matches any organizer item that is matched by any
of the filters it includes.
\li Filter.CollectionFilter A filter which matches any organizer item that is matched by collection.
- \li Filter.DetailFilter A filter which matches organizer items containing one or more details
- of a particular type with a particular value.
+ \li Filter.DetailFilter A filter which matches organizer items containing exactly one given detail.
+ \li Filter.DetailFieldFilter A filter which matches organizer items containing one or more details
+ of a particular type with a particular field having a particular value.
\li Filter.DetailRangeFilter A filter which matches organizer items containing one or more details
of a particular type whose values are within a particular range.
\li Filter.IdFilter A filter which matches any organizer item whose ID is contained in
@@ -324,6 +325,7 @@ QOrganizerItemFilter QDeclarativeOrganizerItemCollectionFilter::filter() const
}
+
/*!
\qmlclass DetailFilter QDeclarativeOrganizerItemDetailFilter
\brief The DetailFilter element provides a filter based around a detail value criterion.
@@ -342,8 +344,113 @@ QOrganizerItemFilter QDeclarativeOrganizerItemCollectionFilter::filter() const
filter: todoFilter
}
+ Type {
+ id: typeDetailToMatch
+ type: Type.Todo
+ }
+
DetailFilter {
id: todoFilter
+ detail: typeDetailToMatch
+ }
+
+ ListView {
+ width: parent.width; height: parent.height;
+ model: organizer.items
+ delegate: Text {text: displayLabel}
+ }
+ }
+ \endcode
+
+ \sa QOrganizerItemDetailFilter
+ */
+
+/*!
+ \internal
+ */
+QDeclarativeOrganizerItemDetailFilter::QDeclarativeOrganizerItemDetailFilter(QObject *parent)
+ : QDeclarativeOrganizerItemFilter(parent)
+ , m_detail(0), m_componentCompleted(false)
+{
+ connect(this, SIGNAL(valueChanged()), SIGNAL(filterChanged()));
+}
+
+/*!
+ \internal
+ */
+void QDeclarativeOrganizerItemDetailFilter::classBegin()
+{
+}
+
+/*!
+ \internal
+ */
+void QDeclarativeOrganizerItemDetailFilter::componentComplete()
+{
+ setDetail();
+ m_componentCompleted = true;
+}
+
+/*!
+ \qmlproperty Detail DetailFilter::detail
+
+ This property holds the detail instance used by this filter for matching.
+ */
+QDeclarativeOrganizerItemDetail *QDeclarativeOrganizerItemDetailFilter::detail() const
+{
+ return m_detail;
+}
+
+void QDeclarativeOrganizerItemDetailFilter::setDetail(QDeclarativeOrganizerItemDetail *detail)
+{
+ if (m_detail != detail) {
+ m_detail = detail;
+ if (m_componentCompleted)
+ setDetail();
+ }
+}
+
+
+/*!
+ \internal
+ */
+QOrganizerItemFilter QDeclarativeOrganizerItemDetailFilter::filter() const
+{
+ return d;
+}
+
+/*!
+ \internal
+ */
+void QDeclarativeOrganizerItemDetailFilter::setDetail()
+{
+ if (m_detail) {
+ d.setDetail(m_detail->detail());
+ emit valueChanged();
+ }
+}
+
+
+/*!
+ \qmlclass DetailFieldFilter QDeclarativeOrganizerItemDetailFieldFilter
+ \brief The DetailFieldFilter element provides a filter based around a detail value criterion.
+ \inqmlmodule QtOrganizer
+ \ingroup qml-organizer-filters
+
+ Simple example how to utilize DetailFieldFilter element together with OrganizerModel and ListView elements:
+ \code
+ Rectangle {
+ height: 400; width: 400;
+
+ OrganizerModel{
+ id: organizer
+ startPeriod: "2009-01-01"
+ endPeriod: "2012-12-31"
+ filter: todoFilter
+ }
+
+ DetailFieldFilter {
+ id: todoFilter
detail: Detail.Type
field: Type.FieldType
value: Type.Todo
@@ -357,13 +464,13 @@ QOrganizerItemFilter QDeclarativeOrganizerItemCollectionFilter::filter() const
}
\endcode
- \sa QOrganizerItemDetailFilter
+ \sa QOrganizerItemDetailFieldFilter
*/
/*!
\internal
*/
-QDeclarativeOrganizerItemDetailFilter::QDeclarativeOrganizerItemDetailFilter(QObject *parent)
+QDeclarativeOrganizerItemDetailFieldFilter::QDeclarativeOrganizerItemDetailFieldFilter(QObject *parent)
: QDeclarativeOrganizerItemFilter(parent)
, m_detail(QDeclarativeOrganizerItemDetail::Undefined)
, m_field(-1)
@@ -375,31 +482,31 @@ QDeclarativeOrganizerItemDetailFilter::QDeclarativeOrganizerItemDetailFilter(QOb
/*!
\internal
*/
-void QDeclarativeOrganizerItemDetailFilter::classBegin()
+void QDeclarativeOrganizerItemDetailFieldFilter::classBegin()
{
}
/*!
\internal
*/
-void QDeclarativeOrganizerItemDetailFilter::componentComplete()
+void QDeclarativeOrganizerItemDetailFieldFilter::componentComplete()
{
setDetail();
m_componentCompleted = true;
}
/*!
- \qmlproperty enum DetailFilter::detail
+ \qmlproperty enum DetailFieldFilter::detail
This property holds the detail type of which the detail filter will be matched to. The value
shuold be the enumeration value of Detail::type.
*/
-QDeclarativeOrganizerItemDetail::DetailType QDeclarativeOrganizerItemDetailFilter::detail() const
+QDeclarativeOrganizerItemDetail::DetailType QDeclarativeOrganizerItemDetailFieldFilter::detail() const
{
return m_detail;
}
-void QDeclarativeOrganizerItemDetailFilter::setDetail(QDeclarativeOrganizerItemDetail::DetailType detail)
+void QDeclarativeOrganizerItemDetailFieldFilter::setDetail(QDeclarativeOrganizerItemDetail::DetailType detail)
{
if (m_detail != detail) {
m_detail = detail;
@@ -409,21 +516,21 @@ void QDeclarativeOrganizerItemDetailFilter::setDetail(QDeclarativeOrganizerItemD
}
/*!
- \qmlproperty enum DetailFilter::field
+ \qmlproperty enum DetailFieldFilter::field
- This property holds the detail field type of which the detail filter will be matched to. The
+ This property holds the detail field type of which the detail field filter will be matched to. The
value should be the filld enumeration value defined in each detail element.
\sa EventTime, JournalTime, TodoTime, TodoProgress, Reminder, AudibleReminder, VisualReminder,
EmailReminder, Comment, Description, DisplayLabel, Guid, Location, Parent, Priority, Recurrence,
Timestamp, ItemType, Tag
*/
-int QDeclarativeOrganizerItemDetailFilter::field() const
+int QDeclarativeOrganizerItemDetailFieldFilter::field() const
{
return m_field;
}
-void QDeclarativeOrganizerItemDetailFilter::setField(int field)
+void QDeclarativeOrganizerItemDetailFieldFilter::setField(int field)
{
if (field != m_field) {
m_field = field;
@@ -433,16 +540,16 @@ void QDeclarativeOrganizerItemDetailFilter::setField(int field)
}
/*!
- \qmlproperty variant DetailFilter::value
+ \qmlproperty variant DetailFieldFilter::value
- This property holds the value criterion of the detail filter.
+ This property holds the value criterion of the detail field filter.
*/
-QVariant QDeclarativeOrganizerItemDetailFilter::value() const
+QVariant QDeclarativeOrganizerItemDetailFieldFilter::value() const
{
return d.value();
}
-void QDeclarativeOrganizerItemDetailFilter::setValue(const QVariant &newValue)
+void QDeclarativeOrganizerItemDetailFieldFilter::setValue(const QVariant &newValue)
{
if (newValue != value()) {
if (QVariant::DateTime == newValue.type()) {
@@ -456,7 +563,7 @@ void QDeclarativeOrganizerItemDetailFilter::setValue(const QVariant &newValue)
}
/*!
- \qmlproperty enumeration DetailFilter::matchFlags
+ \qmlproperty enumeration DetailFieldFilter::matchFlags
This property holds the semantics of the value matching criterion. The valid match flags include:
\list
@@ -468,14 +575,14 @@ void QDeclarativeOrganizerItemDetailFilter::setValue(const QVariant &newValue)
\li MatchCaseSensitive - The search is case sensitive.
\endlist
*/
-QDeclarativeOrganizerItemFilter::MatchFlags QDeclarativeOrganizerItemDetailFilter::matchFlags() const
+QDeclarativeOrganizerItemFilter::MatchFlags QDeclarativeOrganizerItemDetailFieldFilter::matchFlags() const
{
QDeclarativeOrganizerItemFilter::MatchFlags newFlags;
newFlags = ~newFlags & (int)d.matchFlags();
return newFlags;
}
-void QDeclarativeOrganizerItemDetailFilter::setMatchFlags(QDeclarativeOrganizerItemFilter::MatchFlags flags)
+void QDeclarativeOrganizerItemDetailFieldFilter::setMatchFlags(QDeclarativeOrganizerItemFilter::MatchFlags flags)
{
QOrganizerItemFilter::MatchFlags newFlags;
newFlags = ~newFlags & (int)flags;
@@ -488,7 +595,7 @@ void QDeclarativeOrganizerItemDetailFilter::setMatchFlags(QDeclarativeOrganizerI
/*!
\internal
*/
-QOrganizerItemFilter QDeclarativeOrganizerItemDetailFilter::filter() const
+QOrganizerItemFilter QDeclarativeOrganizerItemDetailFieldFilter::filter() const
{
return d;
}
@@ -496,7 +603,7 @@ QOrganizerItemFilter QDeclarativeOrganizerItemDetailFilter::filter() const
/*!
\internal
*/
-void QDeclarativeOrganizerItemDetailFilter::setDetail()
+void QDeclarativeOrganizerItemDetailFieldFilter::setDetail()
{
d.setDetail(static_cast<QOrganizerItemDetail::DetailType>(m_detail), m_field);
emit valueChanged();
@@ -625,7 +732,7 @@ QVariant QDeclarativeOrganizerItemDetailRangeFilter::maxValue() const
\qmlproperty enumeration DetailRangeFilter::matchFlags
This property holds the match flags of the criterion, which define semantics such as case sensitivity, and exact matching.
- \sa DetailFilter::matchFlags
+ \sa DetailFieldFilter::matchFlags
*/
void QDeclarativeOrganizerItemDetailRangeFilter::setMatchFlags(QDeclarativeOrganizerItemFilter::MatchFlags flags)
{
diff --git a/src/imports/organizer/qdeclarativeorganizeritemfilter_p.h b/src/imports/organizer/qdeclarativeorganizeritemfilter_p.h
index 99d4933f6..bc69021cf 100644
--- a/src/imports/organizer/qdeclarativeorganizeritemfilter_p.h
+++ b/src/imports/organizer/qdeclarativeorganizeritemfilter_p.h
@@ -65,6 +65,7 @@ public:
UnionFilter = QOrganizerItemFilter::UnionFilter,
CollectionFilter = QOrganizerItemFilter::CollectionFilter,
DetailFilter = QOrganizerItemFilter::DetailFilter,
+ DetailFieldFilter = QOrganizerItemFilter::DetailFieldFilter,
DetailRangeFilter = QOrganizerItemFilter::DetailRangeFilter,
IdFilter = QOrganizerItemFilter::IdFilter
};
@@ -174,6 +175,37 @@ private:
class QDeclarativeOrganizerItemDetailFilter : public QDeclarativeOrganizerItemFilter, public QQmlParserStatus
{
Q_OBJECT
+ Q_PROPERTY(QDeclarativeOrganizerItemDetail *detail READ detail WRITE setDetail NOTIFY valueChanged)
+ Q_INTERFACES(QQmlParserStatus)
+
+public:
+ QDeclarativeOrganizerItemDetailFilter(QObject *parent = 0);
+
+ // inherited from QQmlParserStatus
+ void classBegin();
+ void componentComplete();
+
+ QDeclarativeOrganizerItemDetail *detail() const;
+ void setDetail(QDeclarativeOrganizerItemDetail *detail);
+
+ // used by model
+ QOrganizerItemFilter filter() const;
+
+signals:
+ void valueChanged();
+
+private:
+ void setDetail();
+
+ QDeclarativeOrganizerItemDetail *m_detail;
+ bool m_componentCompleted;
+ QOrganizerItemDetailFilter d;
+};
+
+
+class QDeclarativeOrganizerItemDetailFieldFilter : public QDeclarativeOrganizerItemFilter, public QQmlParserStatus
+{
+ Q_OBJECT
Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged)
Q_PROPERTY(QDeclarativeOrganizerItemFilter::MatchFlags matchFlags READ matchFlags WRITE setMatchFlags NOTIFY valueChanged)
Q_PROPERTY(int field READ field WRITE setField NOTIFY valueChanged)
@@ -181,7 +213,7 @@ class QDeclarativeOrganizerItemDetailFilter : public QDeclarativeOrganizerItemFi
Q_INTERFACES(QQmlParserStatus)
public:
- QDeclarativeOrganizerItemDetailFilter(QObject *parent = 0);
+ QDeclarativeOrganizerItemDetailFieldFilter(QObject *parent = 0);
// inherited from QQmlParserStatus
void classBegin();
@@ -211,7 +243,7 @@ private:
QDeclarativeOrganizerItemDetail::DetailType m_detail;
int m_field;
bool m_componentCompleted;
- QOrganizerItemDetailFilter d;
+ QOrganizerItemDetailFieldFilter d;
};
@@ -308,6 +340,7 @@ QML_DECLARE_TYPE(QTORGANIZER_PREPEND_NAMESPACE(QDeclarativeOrganizerItemIntersec
QML_DECLARE_TYPE(QTORGANIZER_PREPEND_NAMESPACE(QDeclarativeOrganizerItemUnionFilter))
QML_DECLARE_TYPE(QTORGANIZER_PREPEND_NAMESPACE(QDeclarativeOrganizerItemCollectionFilter))
QML_DECLARE_TYPE(QTORGANIZER_PREPEND_NAMESPACE(QDeclarativeOrganizerItemDetailFilter))
+QML_DECLARE_TYPE(QTORGANIZER_PREPEND_NAMESPACE(QDeclarativeOrganizerItemDetailFieldFilter))
QML_DECLARE_TYPE(QTORGANIZER_PREPEND_NAMESPACE(QDeclarativeOrganizerItemDetailRangeFilter))
QML_DECLARE_TYPE(QTORGANIZER_PREPEND_NAMESPACE(QDeclarativeOrganizerItemIdFilter))
diff --git a/src/organizer/filters/filters.pri b/src/organizer/filters/filters.pri
index 80c406ac9..3b2fbb4cf 100644
--- a/src/organizer/filters/filters.pri
+++ b/src/organizer/filters/filters.pri
@@ -4,6 +4,7 @@ INCLUDEPATH += filters \
PUBLIC_HEADERS += \
filters/qorganizeritemfilters.h \
filters/qorganizeritemdetailfilter.h \
+ filters/qorganizeritemdetailfieldfilter.h \
filters/qorganizeritemdetailrangefilter.h \
filters/qorganizeritemintersectionfilter.h \
filters/qorganizeriteminvalidfilter.h \
@@ -13,6 +14,7 @@ PUBLIC_HEADERS += \
PRIVATE_HEADERS += \
filters/qorganizeritemdetailfilter_p.h \
+ filters/qorganizeritemdetailfieldfilter_p.h \
filters/qorganizeritemdetailrangefilter_p.h \
filters/qorganizeritemintersectionfilter_p.h \
filters/qorganizeritemidfilter_p.h \
@@ -21,6 +23,7 @@ PRIVATE_HEADERS += \
SOURCES += \
filters/qorganizeritemdetailfilter.cpp \
+ filters/qorganizeritemdetailfieldfilter.cpp \
filters/qorganizeritemdetailrangefilter.cpp \
filters/qorganizeritemintersectionfilter.cpp \
filters/qorganizeriteminvalidfilter.cpp \
diff --git a/src/organizer/filters/qorganizeritemdetailfieldfilter.cpp b/src/organizer/filters/qorganizeritemdetailfieldfilter.cpp
new file mode 100644
index 000000000..64cb99209
--- /dev/null
+++ b/src/organizer/filters/qorganizeritemdetailfieldfilter.cpp
@@ -0,0 +1,156 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtOrganizer module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qorganizeritemdetailfieldfilter.h>
+#include <private/qorganizeritemdetailfieldfilter_p.h>
+
+QTORGANIZER_BEGIN_NAMESPACE
+
+/*!
+ \class QOrganizerItemDetailFieldFilter
+ \brief The QOrganizerItemDetailFieldFilter class provides a filter based around a detail value criterion.
+ \inmodule QtOrganizer
+ \ingroup organizer-filters
+
+ It may be used to select organizeritems which contain a detail of a particular type and a particular value.
+ */
+
+Q_IMPLEMENT_ORGANIZERITEMFILTER_PRIVATE(QOrganizerItemDetailFieldFilter)
+
+/*!
+ \fn QOrganizerItemDetailFieldFilter::QOrganizerItemDetailFieldFilter(const QOrganizerItemFilter &other)
+
+ Constructs a copy of \a other if possible, otherwise constructs a new detail filter.
+ */
+
+/*!
+ Constructs a new detail filter.
+ */
+QOrganizerItemDetailFieldFilter::QOrganizerItemDetailFieldFilter()
+ : QOrganizerItemFilter(new QOrganizerItemDetailFieldFilterPrivate)
+{
+}
+
+/*!
+ Sets the type of detail which will be matched to \a detailType, and the field of the detail
+ which will contain the value criterion to \a field.
+
+ \sa detailType(), detailField()
+ */
+void QOrganizerItemDetailFieldFilter::setDetail(QOrganizerItemDetail::DetailType detailType, int field)
+{
+ Q_D(QOrganizerItemDetailFieldFilter);
+ if (detailType != QOrganizerItemDetail::TypeUndefined && field >= 0) {
+ d->m_detailType = detailType;
+ d->m_detailField = field;
+ } else {
+ d->m_detailType = QOrganizerItemDetail::TypeUndefined;
+ d->m_detailField = -1;
+ }
+}
+
+/*!
+ Sets the value criterion of the filter to \a value.
+
+ \sa value()
+ */
+void QOrganizerItemDetailFieldFilter::setValue(const QVariant &value)
+{
+ Q_D(QOrganizerItemDetailFieldFilter);
+ d->m_exactValue = value;
+}
+
+/*!
+ Sets the semantics of the value matching criterion to those defined in \a flags.
+
+ \sa matchFlags()
+ */
+void QOrganizerItemDetailFieldFilter::setMatchFlags(QOrganizerItemFilter::MatchFlags flags)
+{
+ Q_D(QOrganizerItemDetailFieldFilter);
+ d->m_flags = flags;
+}
+
+/*!
+ Returns the semantics of the value matching criterion.
+
+ \sa setMatchFlags()
+ */
+QOrganizerItemFilter::MatchFlags QOrganizerItemDetailFieldFilter::matchFlags() const
+{
+ Q_D(const QOrganizerItemDetailFieldFilter);
+ return d->m_flags;
+}
+
+/*!
+ Returns the type of the detail which will be inspected for matching values.
+
+ \sa setDetail()
+ */
+QOrganizerItemDetail::DetailType QOrganizerItemDetailFieldFilter::detailType() const
+{
+ Q_D(const QOrganizerItemDetailFieldFilter);
+ return d->m_detailType;
+}
+
+/*!
+ Returns the detail field containing the value which will be matched against the value criterion.
+
+ \sa setDetail()
+ */
+int QOrganizerItemDetailFieldFilter::detailField() const
+{
+ Q_D(const QOrganizerItemDetailFieldFilter);
+ return d->m_detailField;
+}
+
+/*!
+ Returns the value criterion of the detail filter.
+
+ \sa setValue()
+ */
+QVariant QOrganizerItemDetailFieldFilter::value() const
+{
+ Q_D(const QOrganizerItemDetailFieldFilter);
+ return d->m_exactValue;
+}
+
+QTORGANIZER_END_NAMESPACE
diff --git a/src/organizer/filters/qorganizeritemdetailfieldfilter.h b/src/organizer/filters/qorganizeritemdetailfieldfilter.h
new file mode 100644
index 000000000..fa53b030a
--- /dev/null
+++ b/src/organizer/filters/qorganizeritemdetailfieldfilter.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtOrganizer module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QORGANIZERITEMDETAILFIELDFILTER_H
+#define QORGANIZERITEMDETAILFIELDFILTER_H
+
+#include <qorganizeritemfilter.h>
+#include <qorganizeritemdetail.h>
+
+QTORGANIZER_BEGIN_NAMESPACE
+
+class QOrganizerItemDetailFieldFilterPrivate;
+
+/* Leaf class */
+
+class Q_ORGANIZER_EXPORT QOrganizerItemDetailFieldFilter : public QOrganizerItemFilter
+{
+public:
+ QOrganizerItemDetailFieldFilter();
+ QOrganizerItemDetailFieldFilter(const QOrganizerItemFilter &other);
+
+ void setDetail(QOrganizerItemDetail::DetailType detailType, int field);
+ QOrganizerItemDetail::DetailType detailType() const;
+ int detailField() const;
+
+ void setMatchFlags(QOrganizerItemFilter::MatchFlags flags);
+ QOrganizerItemFilter::MatchFlags matchFlags() const;
+
+ void setValue(const QVariant &value);
+ QVariant value() const;
+
+private:
+ Q_DECLARE_ORGANIZERITEMFILTER_PRIVATE(QOrganizerItemDetailFieldFilter)
+};
+
+QTORGANIZER_END_NAMESPACE
+
+#endif // QORGANIZERITEMDETAILFIELDFILTER_H
diff --git a/src/organizer/filters/qorganizeritemdetailfieldfilter_p.h b/src/organizer/filters/qorganizeritemdetailfieldfilter_p.h
new file mode 100644
index 000000000..8888fc0e7
--- /dev/null
+++ b/src/organizer/filters/qorganizeritemdetailfieldfilter_p.h
@@ -0,0 +1,136 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtOrganizer module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QORGANIZERITEMDETAILFIELDFILTER_P_H
+#define QORGANIZERITEMDETAILFIELDFILTER_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qorganizeritemfilter_p.h"
+#include <qorganizeritemdetailfilter.h>
+
+QTORGANIZER_BEGIN_NAMESPACE
+
+class QOrganizerItemDetailFieldFilterPrivate : public QOrganizerItemFilterPrivate
+{
+public:
+ QOrganizerItemDetailFieldFilterPrivate()
+ : QOrganizerItemFilterPrivate(), m_detailType(QOrganizerItemDetail::TypeUndefined), m_detailField(-1), m_flags(0)
+ {
+ }
+
+ QOrganizerItemDetailFieldFilterPrivate(const QOrganizerItemDetailFieldFilterPrivate& other)
+ : QOrganizerItemFilterPrivate(other), m_detailType(other.m_detailType), m_detailField(other.m_detailField),
+ m_exactValue(other.m_exactValue), m_flags(other.m_flags)
+ {
+ }
+
+ virtual bool compare(const QOrganizerItemFilterPrivate *other) const
+ {
+ const QOrganizerItemDetailFieldFilterPrivate *od = static_cast<const QOrganizerItemDetailFieldFilterPrivate *>(other);
+ if (od) {
+ return (m_detailType == od->m_detailType) && (m_detailField == od->m_detailField)
+ && (m_exactValue == od->m_exactValue) && (m_flags == od->m_flags);
+ }
+ return false;
+ }
+
+#ifndef QT_NO_DATASTREAM
+ QDataStream &outputToStream(QDataStream &stream, quint8 formatVersion) const
+ {
+ if (formatVersion == 1)
+ stream << m_detailType << m_detailField << m_exactValue << static_cast<quint32>(m_flags);
+ return stream;
+ }
+
+ QDataStream &inputFromStream(QDataStream &stream, quint8 formatVersion)
+ {
+ if (formatVersion == 1) {
+ quint32 flags;
+ quint32 defId;
+ stream >> defId >> m_detailField >> m_exactValue >> flags;
+ m_detailType = static_cast<QOrganizerItemDetail::DetailType>(defId);
+ m_flags = static_cast<QOrganizerItemFilter::MatchFlags>(flags);
+ }
+ return stream;
+ }
+#endif // QT_NO_DATASTREAM
+
+#ifndef QT_NO_DEBUG_STREAM
+ QDebug &debugStreamOut(QDebug &dbg) const
+ {
+ dbg.nospace() << "QOrganizerItemDetailFieldFilter(";
+ dbg.nospace() << "detailType=";
+ dbg.nospace() << m_detailType;
+ dbg.nospace() << ",";
+ dbg.nospace() << "detailField=";
+ dbg.nospace() << m_detailField;
+ dbg.nospace() << ",";
+ dbg.nospace() << "value=";
+ dbg.nospace() << m_exactValue;
+ dbg.nospace() << ",";
+ dbg.nospace() << "matchFlags=";
+ dbg.nospace() << static_cast<quint32>(m_flags);
+ dbg.nospace() << ")";
+ return dbg.maybeSpace();
+ }
+#endif // QT_NO_DEBUG_STREAM
+
+ Q_IMPLEMENT_ORGANIZERITEMFILTER_VIRTUALCTORS(QOrganizerItemDetailFieldFilter, QOrganizerItemFilter::DetailFieldFilter)
+
+ QOrganizerItemDetail::DetailType m_detailType;
+ int m_detailField;
+ QVariant m_exactValue;
+ QOrganizerItemFilter::MatchFlags m_flags;
+};
+
+QTORGANIZER_END_NAMESPACE
+
+#endif // QORGANIZERITEMDETAILFIELDFILTER_P_H
diff --git a/src/organizer/filters/qorganizeritemdetailfilter.cpp b/src/organizer/filters/qorganizeritemdetailfilter.cpp
index 568562c6b..dd31fd609 100644
--- a/src/organizer/filters/qorganizeritemdetailfilter.cpp
+++ b/src/organizer/filters/qorganizeritemdetailfilter.cpp
@@ -50,7 +50,8 @@ QTORGANIZER_BEGIN_NAMESPACE
\inmodule QtOrganizer
\ingroup organizer-filters
- It may be used to select organizeritems which contain a detail of a particular type and a particular value.
+ It may be used to select organizeritems which contain a detail identical to that used by
+ this filter for matching.
*/
Q_IMPLEMENT_ORGANIZERITEMFILTER_PRIVATE(QOrganizerItemDetailFilter)
@@ -70,41 +71,90 @@ QOrganizerItemDetailFilter::QOrganizerItemDetailFilter()
}
/*!
- Sets the type of detail which will be matched to \a detailType, and the field of the detail
- which will contain the value criterion to \a field.
+ Sets the type of detail that will be matched to \a detailType, and the field of the detail
+ that will contain the value criterion to \a field.
+ \warning This method is deprecated because same functionality
+ has been migrated to QOrganizerItemDetailFieldFilter. Use the
+ new QOrganizerItemDetailFieldFilter class instead.
\sa detailType(), detailField()
+ \deprecated
*/
void QOrganizerItemDetailFilter::setDetail(QOrganizerItemDetail::DetailType detailType, int field)
{
+ qWarning("%s is deprecated, use QOrganizerItemDetailFieldFilter::setDetail() instead."
+ , Q_FUNC_INFO);
Q_D(QOrganizerItemDetailFilter);
+ int fieldId;
if (detailType != QOrganizerItemDetail::TypeUndefined && field >= 0) {
d->m_detailType = detailType;
- d->m_detailField = field;
+ fieldId = field;
} else {
d->m_detailType = QOrganizerItemDetail::TypeUndefined;
- d->m_detailField = -1;
+ fieldId = -1;
}
+ if (d->m_detailFields.isEmpty())
+ d->m_detailFields.append(fieldId);
+ else
+ d->m_detailFields[0] = fieldId;
+}
+
+/*!
+ Sets the detail that will be matched to \a detail.
+
+ \sa detail()
+ */
+void QOrganizerItemDetailFilter::setDetail(const QOrganizerItemDetail &detail)
+{
+ Q_D(QOrganizerItemDetailFilter);
+ d->m_detail = detail;
+}
+
+/*!
+ Returns the detail which will be matched by this filter.
+
+ \sa setDetail()
+ */
+QOrganizerItemDetail QOrganizerItemDetailFilter::detail() const
+{
+ Q_D(const QOrganizerItemDetailFilter);
+ return d->m_detail;
}
/*!
Sets the value criterion of the filter to \a value.
+ \warning This method is deprecated because same functionality
+ has been migrated to QOrganizerItemDetailFieldFilter. Use the
+ new QOrganizerItemDetailFieldFilter class instead.
\sa value()
+ \deprecated
*/
void QOrganizerItemDetailFilter::setValue(const QVariant &value)
{
+ qWarning("%s is deprecated, use QOrganizerItemDetailFieldFilter::setValue() instead."
+ , Q_FUNC_INFO);
Q_D(QOrganizerItemDetailFilter);
- d->m_exactValue = value;
+ if (!value.isNull()) {
+ if (d->m_exactValues.isEmpty())
+ d->m_exactValues.append(value);
+ else
+ d->m_exactValues[0] = value;
+ }
}
/*!
Sets the semantics of the value matching criterion to those defined in \a flags.
+ \warning This method is deprecated because same functionality
+ has been migrated to QOrganizerItemDetailFieldFilter. Use the
+ new QOrganizerItemDetailFieldFilter class instead.
\sa matchFlags()
*/
void QOrganizerItemDetailFilter::setMatchFlags(QOrganizerItemFilter::MatchFlags flags)
{
+ qWarning("%s is deprecated, use QOrganizerItemDetailFieldFilter::setMatchFlags() instead."
+ , Q_FUNC_INFO);
Q_D(QOrganizerItemDetailFilter);
d->m_flags = flags;
}
@@ -112,10 +162,15 @@ void QOrganizerItemDetailFilter::setMatchFlags(QOrganizerItemFilter::MatchFlags
/*!
Returns the semantics of the value matching criterion.
+ \warning This method is deprecated because same functionality
+ has been migrated to QOrganizerItemDetailFieldFilter. Use the
+ new QOrganizerItemDetailFieldFilter class instead.
\sa setMatchFlags()
*/
QOrganizerItemFilter::MatchFlags QOrganizerItemDetailFilter::matchFlags() const
{
+ qWarning("%s is deprecated, use QOrganizerItemDetailFieldFilter::matchFlags() instead."
+ , Q_FUNC_INFO);
Q_D(const QOrganizerItemDetailFilter);
return d->m_flags;
}
@@ -123,10 +178,16 @@ QOrganizerItemFilter::MatchFlags QOrganizerItemDetailFilter::matchFlags() const
/*!
Returns the type of the detail which will be inspected for matching values.
+ \warning This method is deprecated because same functionality
+ has been migrated to QOrganizerItemDetailFieldFilter. Use the
+ new QOrganizerItemDetailFieldFilter class instead.
\sa setDetail()
+ \deprecated
*/
QOrganizerItemDetail::DetailType QOrganizerItemDetailFilter::detailType() const
{
+ qWarning("%s is deprecated, use QOrganizerItemDetailFieldFilter::detailType() instead."
+ , Q_FUNC_INFO);
Q_D(const QOrganizerItemDetailFilter);
return d->m_detailType;
}
@@ -134,23 +195,35 @@ QOrganizerItemDetail::DetailType QOrganizerItemDetailFilter::detailType() const
/*!
Returns the detail field containing the value which will be matched against the value criterion.
+ \warning This method is deprecated because same functionality
+ has been migrated to QOrganizerItemDetailFieldFilter. Use the
+ new QOrganizerItemDetailFieldFilter class instead.
\sa setDetail()
+ \deprecated
*/
int QOrganizerItemDetailFilter::detailField() const
{
+ qWarning("%s is deprecated, use QOrganizerItemDetailFieldFilter::detailField() instead."
+ , Q_FUNC_INFO);
Q_D(const QOrganizerItemDetailFilter);
- return d->m_detailField;
+ return d->m_detailFields.isEmpty() ? -1 : d->m_detailFields.first() ;
}
/*!
Returns the value criterion of the detail filter.
+ \warning This method is deprecated because same functionality
+ has been migrated to QOrganizerItemDetailFieldFilter. Use the
+ new QOrganizerItemDetailFieldFilter class instead.
\sa setValue()
+ \deprecated
*/
QVariant QOrganizerItemDetailFilter::value() const
{
+ qWarning("%s is deprecated, use QOrganizerItemDetailFieldFilter::value() instead."
+ , Q_FUNC_INFO);
Q_D(const QOrganizerItemDetailFilter);
- return d->m_exactValue;
+ return d->m_exactValues.isEmpty() ? QVariant() : d->m_exactValues.first();
}
QTORGANIZER_END_NAMESPACE
diff --git a/src/organizer/filters/qorganizeritemdetailfilter.h b/src/organizer/filters/qorganizeritemdetailfilter.h
index 21e40d253..e6d33ee83 100644
--- a/src/organizer/filters/qorganizeritemdetailfilter.h
+++ b/src/organizer/filters/qorganizeritemdetailfilter.h
@@ -57,15 +57,18 @@ public:
QOrganizerItemDetailFilter();
QOrganizerItemDetailFilter(const QOrganizerItemFilter &other);
- void setDetail(QOrganizerItemDetail::DetailType detailType, int field);
- QOrganizerItemDetail::DetailType detailType() const;
- int detailField() const;
+ QT_DEPRECATED void setDetail(QOrganizerItemDetail::DetailType detailType, int field);
+ void setDetail(const QOrganizerItemDetail &detail);
- void setMatchFlags(QOrganizerItemFilter::MatchFlags flags);
- QOrganizerItemFilter::MatchFlags matchFlags() const;
+ QT_DEPRECATED QOrganizerItemDetail::DetailType detailType() const;
+ QT_DEPRECATED int detailField() const;
+ QOrganizerItemDetail detail() const;
- void setValue(const QVariant &value);
- QVariant value() const;
+ QT_DEPRECATED void setMatchFlags(QOrganizerItemFilter::MatchFlags flags);
+ QT_DEPRECATED QOrganizerItemFilter::MatchFlags matchFlags() const;
+
+ QT_DEPRECATED void setValue(const QVariant &value);
+ QT_DEPRECATED QVariant value() const;
private:
Q_DECLARE_ORGANIZERITEMFILTER_PRIVATE(QOrganizerItemDetailFilter)
diff --git a/src/organizer/filters/qorganizeritemdetailfilter_p.h b/src/organizer/filters/qorganizeritemdetailfilter_p.h
index 426bc8eb8..cf2c4f27b 100644
--- a/src/organizer/filters/qorganizeritemdetailfilter_p.h
+++ b/src/organizer/filters/qorganizeritemdetailfilter_p.h
@@ -62,13 +62,13 @@ class QOrganizerItemDetailFilterPrivate : public QOrganizerItemFilterPrivate
{
public:
QOrganizerItemDetailFilterPrivate()
- : QOrganizerItemFilterPrivate(), m_detailType(QOrganizerItemDetail::TypeUndefined), m_detailField(-1), m_flags(0)
+ : QOrganizerItemFilterPrivate(), m_detailType(QOrganizerItemDetail::TypeUndefined), m_detailFields(QList<int>()), m_flags(0)
{
}
QOrganizerItemDetailFilterPrivate(const QOrganizerItemDetailFilterPrivate& other)
- : QOrganizerItemFilterPrivate(other), m_detailType(other.m_detailType), m_detailField(other.m_detailField),
- m_exactValue(other.m_exactValue), m_flags(other.m_flags)
+ : QOrganizerItemFilterPrivate(other), m_detailType(other.m_detailType), m_detailFields(other.m_detailFields),
+ m_exactValues(other.m_exactValues), m_flags(other.m_flags)
{
}
@@ -76,8 +76,8 @@ public:
{
const QOrganizerItemDetailFilterPrivate *od = static_cast<const QOrganizerItemDetailFilterPrivate *>(other);
if (od) {
- return (m_detailType == od->m_detailType) && (m_detailField == od->m_detailField)
- && (m_exactValue == od->m_exactValue) && (m_flags == od->m_flags);
+ return (m_detailType == od->m_detailType) && (m_detailFields == od->m_detailFields)
+ && (m_exactValues == od->m_exactValues) && (m_flags == od->m_flags);
}
return false;
}
@@ -86,7 +86,7 @@ public:
QDataStream &outputToStream(QDataStream &stream, quint8 formatVersion) const
{
if (formatVersion == 1)
- stream << m_detailType << m_detailField << m_exactValue << static_cast<quint32>(m_flags);
+ stream << m_detailType << m_detailFields << m_exactValues << static_cast<quint32>(m_flags);
return stream;
}
@@ -95,7 +95,7 @@ public:
if (formatVersion == 1) {
quint32 flags;
quint32 defId;
- stream >> defId >> m_detailField >> m_exactValue >> flags;
+ stream >> defId >> m_detailFields >> m_exactValues >> flags;
m_detailType = static_cast<QOrganizerItemDetail::DetailType>(defId);
m_flags = static_cast<QOrganizerItemFilter::MatchFlags>(flags);
}
@@ -110,11 +110,11 @@ public:
dbg.nospace() << "detailType=";
dbg.nospace() << m_detailType;
dbg.nospace() << ",";
- dbg.nospace() << "detailField=";
- dbg.nospace() << m_detailField;
+ dbg.nospace() << "detailFields=";
+ dbg.nospace() << m_detailFields;
dbg.nospace() << ",";
- dbg.nospace() << "value=";
- dbg.nospace() << m_exactValue;
+ dbg.nospace() << "values=";
+ dbg.nospace() << m_exactValues;
dbg.nospace() << ",";
dbg.nospace() << "matchFlags=";
dbg.nospace() << static_cast<quint32>(m_flags);
@@ -125,9 +125,10 @@ public:
Q_IMPLEMENT_ORGANIZERITEMFILTER_VIRTUALCTORS(QOrganizerItemDetailFilter, QOrganizerItemFilter::DetailFilter)
+ QOrganizerItemDetail m_detail;
QOrganizerItemDetail::DetailType m_detailType;
- int m_detailField;
- QVariant m_exactValue;
+ QList<int> m_detailFields;
+ QVariantList m_exactValues;
QOrganizerItemFilter::MatchFlags m_flags;
};
diff --git a/src/organizer/filters/qorganizeritemfilters.h b/src/organizer/filters/qorganizeritemfilters.h
index 5fe1d69db..f2ea7651a 100644
--- a/src/organizer/filters/qorganizeritemfilters.h
+++ b/src/organizer/filters/qorganizeritemfilters.h
@@ -47,6 +47,7 @@
#include <qorganizeritemunionfilter.h>
#include <qorganizeritemdetailfilter.h>
+#include <qorganizeritemdetailfieldfilter.h>
#include <qorganizeritemdetailrangefilter.h>
#include <qorganizeritemintersectionfilter.h>
#include <qorganizeriteminvalidfilter.h>
diff --git a/src/organizer/qorganizeritemdetail.cpp b/src/organizer/qorganizeritemdetail.cpp
index ecfd365d3..9a9ba2a54 100644
--- a/src/organizer/qorganizeritemdetail.cpp
+++ b/src/organizer/qorganizeritemdetail.cpp
@@ -97,7 +97,7 @@ QTORGANIZER_BEGIN_NAMESPACE
// otherLabel.type() == QOrganizerItemDetail::TypeDisplayLabel
\endcode
- \sa QOrganizerItem, QOrganizerItemDetailFilter, QOrganizerItemDetailRangeFilter
+ \sa QOrganizerItem, QOrganizerItemDetailFilter, QOrganizerItemDetailFieldFilter, QOrganizerItemDetailRangeFilter
*/
/*!
diff --git a/src/organizer/qorganizeritemfilter.cpp b/src/organizer/qorganizeritemfilter.cpp
index 88545287c..ff7a0ffb2 100644
--- a/src/organizer/qorganizeritemfilter.cpp
+++ b/src/organizer/qorganizeritemfilter.cpp
@@ -57,8 +57,10 @@
This enumeration describes the type of the filter.
\value InvalidFilter An invalid filter which matches nothing.
- \value DetailFilter A filter which matches items containing a detail of a particular type
- and value.
+ \value DetailFilter A filter which matches items containing a detail identical to that
+ used by the filter for matching.
+ \value DetailFieldFilter A filter which matches items containing a detail of a particular type,
+ having a given value for a particular field.
\value DetailRangeFilter A filter which matches items containing a detail of a particular type,
whose values are within a particular range.
\value IntersectionFilter A filter which matches all items that are matched by all filters it includes.
@@ -195,6 +197,8 @@ QDataStream &operator>>(QDataStream &in, QOrganizerItemFilter &filter)
break;
case QOrganizerItemFilter::DetailFilter:
filter = QOrganizerItemDetailFilter();
+ case QOrganizerItemFilter::DetailFieldFilter:
+ filter = QOrganizerItemDetailFieldFilter();
break;
case QOrganizerItemFilter::DetailRangeFilter:
filter = QOrganizerItemDetailRangeFilter();
diff --git a/src/organizer/qorganizeritemfilter.h b/src/organizer/qorganizeritemfilter.h
index b6c8a6441..13252cef5 100644
--- a/src/organizer/qorganizeritemfilter.h
+++ b/src/organizer/qorganizeritemfilter.h
@@ -71,6 +71,7 @@ public:
enum FilterType {
InvalidFilter = 0,
DetailFilter,
+ DetailFieldFilter,
DetailRangeFilter,
IntersectionFilter,
UnionFilter,
diff --git a/src/organizer/qorganizermanagerengine.cpp b/src/organizer/qorganizermanagerengine.cpp
index fdbe003a6..77b8df113 100644
--- a/src/organizer/qorganizermanagerengine.cpp
+++ b/src/organizer/qorganizermanagerengine.cpp
@@ -580,8 +580,8 @@ bool QOrganizerManagerEngine::removeCollection(const QOrganizerCollectionId& col
\li An empty QOrganizerItemUnionFilter will be replaced with a QOrganizerItemInvalidFilter
\li An empty QOrganizerItemIdFilter will be replaced with a QOrganizerItemInvalidFilter
\li An intersection or union filter with a single entry will be replaced by that entry
- \li A QOrganizerItemDetailFilter or QOrganizerItemDetailRangeFilter with no definition name will be replaced with a QOrganizerItemInvalidFilter
- \li A QOrganizerItemDetailRangeFilter with no range specified will be converted to a QOrganizerItemDetailFilter
+ \li A QOrganizerItemDetailFieldFilter or QOrganizerItemDetailRangeFilter with no definition name will be replaced with a QOrganizerItemInvalidFilter
+ \li A QOrganizerItemDetailRangeFilter with no range specified will be converted to a QOrganizerItemDetailFieldFilter
\endlist
*/
QOrganizerItemFilter QOrganizerManagerEngine::canonicalizedFilter(const QOrganizerItemFilter &filter)
@@ -662,7 +662,7 @@ QOrganizerItemFilter QOrganizerManagerEngine::canonicalizedFilter(const QOrganiz
&& f.rangeFlags() == (QOrganizerItemDetailRangeFilter::ExcludeLower | QOrganizerItemDetailRangeFilter::ExcludeUpper))
return QOrganizerItemInvalidFilter();
if ((f.minValue().isNull() && f.maxValue().isNull()) || (f.minValue() == f.maxValue())) {
- QOrganizerItemDetailFilter df;
+ QOrganizerItemDetailFieldFilter df;
df.setDetail(f.detailType(), f.detailField());
df.setMatchFlags(f.matchFlags());
df.setValue(f.minValue());
@@ -671,9 +671,9 @@ QOrganizerItemFilter QOrganizerManagerEngine::canonicalizedFilter(const QOrganiz
}
break; // fall through to return at end
- case QOrganizerItemFilter::DetailFilter:
+ case QOrganizerItemFilter::DetailFieldFilter:
{
- QOrganizerItemDetailFilter f(filter);
+ QOrganizerItemDetailFieldFilter f(filter);
if (f.detailType() == QOrganizerItemDetail::TypeUndefined)
return QOrganizerItemInvalidFilter();
}
@@ -769,10 +769,42 @@ bool QOrganizerManagerEngine::testFilter(const QOrganizerItemFilter &filter, con
}
// Fall through to end
break;
-
case QOrganizerItemFilter::DetailFilter:
{
const QOrganizerItemDetailFilter cdf(filter);
+
+ //Compatibility with obsoleted API
+ //TODO: Remove when detailFilter API is cleaned up
+ if ( (cdf.detailType() != QOrganizerItemDetail::TypeUndefined) &&
+ (cdf.detailField() != -1) ) {
+ QOrganizerItemDetailFieldFilter newFilter;
+ newFilter.setDetail(cdf.detailType(), cdf.detailField());
+ newFilter.setMatchFlags(cdf.matchFlags());
+ newFilter.setValue(cdf.value());
+ return testFilter(newFilter, item);
+ }
+
+ QOrganizerItemDetail matchingDetail = cdf.detail();
+ if ( (matchingDetail.isEmpty()) || (matchingDetail.type() == QOrganizerItemDetail::TypeUndefined) )
+ return false;
+
+ /* See if this organizer item has one of these details in it */
+ const QList<QOrganizerItemDetail>& details = item.details(cdf.detail().type());
+ if (details.count() == 0)
+ return false; /* can't match */
+
+ /* Value equality test */
+ for (int j=0; j < details.count(); j++) {
+ if (details.at(j) == matchingDetail)
+ return true;
+ }
+ return false;
+ }
+ // Fall through to end
+ break;
+ case QOrganizerItemFilter::DetailFieldFilter:
+ {
+ const QOrganizerItemDetailFieldFilter cdf(filter);
if (cdf.detailType() == QOrganizerItemDetail::TypeUndefined)
return false;
diff --git a/src/plugins/organizer/jsondb/qorganizerjsondbconverter.cpp b/src/plugins/organizer/jsondb/qorganizerjsondbconverter.cpp
index 005c33c4d..9614a42a7 100644
--- a/src/plugins/organizer/jsondb/qorganizerjsondbconverter.cpp
+++ b/src/plugins/organizer/jsondb/qorganizerjsondbconverter.cpp
@@ -42,7 +42,7 @@
#include "qorganizerjsondbconverter.h"
#include "qorganizerjsondbid.h"
#include "qorganizerjsondbstring.h"
-
+#include "qorganizerjsondbengine.h"
#include <QtOrganizer/qorganizermanagerengine.h>
#include <QtOrganizer/qorganizeritemfilters.h>
@@ -52,6 +52,75 @@ QTORGANIZER_BEGIN_NAMESPACE
const int QOrganizerJsonDbConverter::enumMapEnd(-1212);
+const QMap<int, QString> QOrganizerJsonDbConverter::filterablePropertyNames()
+{
+ static QMap<int, QString> filterableProperties;
+ if (filterableProperties.isEmpty()) {
+ filterableProperties.insert(QOrganizerItemComment::FieldComment,
+ QOrganizerJsonDbStr::itemComments());
+ filterableProperties.insert(QOrganizerItemDescription::FieldDescription,
+ QOrganizerJsonDbStr::itemDescription());
+ filterableProperties.insert(QOrganizerItemDisplayLabel::FieldLabel,
+ QOrganizerJsonDbStr::itemDisplayName());
+ filterableProperties.insert(QOrganizerEventRsvp::FieldOrganizerEmail,
+ QOrganizerJsonDbStr::eventRsvpOrganizerEmail());
+ filterableProperties.insert(QOrganizerEventRsvp::FieldOrganizerName,
+ QOrganizerJsonDbStr::eventRsvpOrganizerName());
+ filterableProperties.insert(QOrganizerEventRsvp::FieldParticipationRole,
+ QOrganizerJsonDbStr::eventRsvpParticipationRole());
+ filterableProperties.insert(QOrganizerEventRsvp::FieldParticipationStatus,
+ QOrganizerJsonDbStr::eventRsvpParticipationStatus());
+ filterableProperties.insert(QOrganizerEventRsvp::FieldResponseDate,
+ QOrganizerJsonDbStr::eventRsvpResponseDate());
+ filterableProperties.insert(QOrganizerEventRsvp::FieldResponseDeadline,
+ QOrganizerJsonDbStr::eventRsvpResponseDeadline());
+ filterableProperties.insert(QOrganizerEventRsvp::FieldResponseRequirement,
+ QOrganizerJsonDbStr::eventRsvpResponseRequirement());
+ filterableProperties.insert(QOrganizerEventTime::FieldAllDay,
+ QOrganizerJsonDbStr::eventIsAllDay());
+ filterableProperties.insert(QOrganizerEventTime::FieldEndDateTime,
+ QOrganizerJsonDbStr::eventEndDateTime());
+ filterableProperties.insert(QOrganizerEventTime::FieldStartDateTime,
+ QOrganizerJsonDbStr::eventStartDateTime());
+ filterableProperties.insert(QOrganizerItemGuid::FieldGuid,
+ QOrganizerJsonDbStr::itemGuid());
+ filterableProperties.insert(QOrganizerItemLocation::FieldLabel,
+ QString(QStringLiteral("%1.%2")
+ .arg(QOrganizerJsonDbStr::eventLocation())
+ .arg(QOrganizerJsonDbStr::eventLocationDisplayName()))
+ );
+ filterableProperties.insert(QOrganizerItemLocation::FieldLatitude,
+ QString(QStringLiteral("%1.%2.%3")
+ .arg(QOrganizerJsonDbStr::eventLocation())
+ .arg(QOrganizerJsonDbStr::eventLocationGeo())
+ .arg(QOrganizerJsonDbStr::eventLocationGeoLatitude()))
+ );
+ filterableProperties.insert(QOrganizerItemLocation::FieldLongitude,
+ QString(QStringLiteral("%1.%2.%3")
+ .arg(QOrganizerJsonDbStr::eventLocation())
+ .arg(QOrganizerJsonDbStr::eventLocationGeo())
+ .arg(QOrganizerJsonDbStr::eventLocationGeoLongitude()))
+ );
+ filterableProperties.insert(QOrganizerItemPriority::FieldPriority,
+ QOrganizerJsonDbStr::itemPriority());
+ filterableProperties.insert(QOrganizerItemTag::FieldTag,
+ QOrganizerJsonDbStr::itemTags());
+ filterableProperties.insert(QOrganizerTodoProgress::FieldFinishedDateTime,
+ QOrganizerJsonDbStr::todoFinishedDateTime());
+ filterableProperties.insert(QOrganizerTodoProgress::FieldPercentageComplete,
+ QOrganizerJsonDbStr::todoProgressPercentage());
+ filterableProperties.insert(QOrganizerTodoProgress::FieldStatus,
+ QOrganizerJsonDbStr::todoStatus());
+ filterableProperties.insert(QOrganizerTodoTime::FieldAllDay,
+ QOrganizerJsonDbStr::todoIsAllDay());
+ filterableProperties.insert(QOrganizerTodoTime::FieldDueDateTime,
+ QOrganizerJsonDbStr::todoDueDateTime());
+ filterableProperties.insert(QOrganizerTodoTime::FieldStartDateTime,
+ QOrganizerJsonDbStr::todoStartDateTime());
+ };
+ return filterableProperties;
+}
+
const QOrganizerJsonDbEnumConversionData *QOrganizerJsonDbConverter::organizerPriorityEnumMap()
{
static const QOrganizerJsonDbEnumConversionData map[] = {
@@ -1613,6 +1682,9 @@ bool QOrganizerJsonDbConverter::singleFilterToJsondbQuery(const QOrganizerItemFi
case QOrganizerItemFilter::IdFilter:
isValidFilter = idFilterToJsondbQuery(filter, jsonDbQueryStr);
break;
+ case QOrganizerItemFilter::DetailFieldFilter:
+ isValidFilter = detailFieldFilterToJsondbQuery(filter, jsonDbQueryStr, typeFilterFlag);
+ break;
case QOrganizerItemFilter::DetailFilter:
isValidFilter = detailFilterToJsondbQuery(filter, jsonDbQueryStr, typeFilterFlag);
break;
@@ -1702,12 +1774,12 @@ bool QOrganizerJsonDbConverter::idFilterToJsondbQuery(const QOrganizerItemFilter
return isValidFilter;
}
-bool QOrganizerJsonDbConverter::isSupportedDetailFilter(
- const QOrganizerItemDetailFilter &filter, QOrganizerItemDetail::DetailType detailType, int detailFieldName) const
+bool QOrganizerJsonDbConverter::isSupportedDetailFieldFilter(
+ const QVariant &fieldValue, QOrganizerItemDetail::DetailType detailType, int detailFieldName, QOrganizerItemFilter::MatchFlags matchFlags) const
{
bool isValidFilter = true;
- if (detailType == QOrganizerItemDetail::TypeUndefined && detailFieldName == -1 && filter.value().toString().isEmpty()) {
+ if (detailType == QOrganizerItemDetail::TypeUndefined && detailFieldName == -1 && fieldValue.toString().isEmpty()) {
// no support when any of the fields is empty
isValidFilter = false;
} else if (QOrganizerItemDetail::TypeJournalTime == detailType
@@ -1720,7 +1792,7 @@ bool QOrganizerJsonDbConverter::isSupportedDetailFilter(
|| QOrganizerItemDetail::TypeEventAttendee == detailType) {
// filtering certain details/definitions are currently not supported
isValidFilter = false;
- } else if (QOrganizerItemFilter::MatchExactly != filter.matchFlags()
+ } else if (QOrganizerItemFilter::MatchExactly != matchFlags
&& (QOrganizerItemDetail::TypeEventTime == detailType
|| QOrganizerItemDetail::TypeTodoTime == detailType
|| QOrganizerItemDetail::TypeTodoProgress == detailType
@@ -1738,7 +1810,7 @@ bool QOrganizerJsonDbConverter::isSupportedDetailFilter(
|| QOrganizerItemDetail::TypeParent == detailType)) {
// filtering matchflags are not supported for all the types
isValidFilter = false;
- } else if (QVariant::String == filter.value().type()
+ } else if (QVariant::String == fieldValue.type()
&& !(QOrganizerItemDetail::TypeComment == detailType
|| QOrganizerItemDetail::TypeDescription == detailType
|| QOrganizerItemDetail::TypeDisplayLabel == detailType
@@ -1757,8 +1829,58 @@ bool QOrganizerJsonDbConverter::isSupportedDetailFilter(
bool QOrganizerJsonDbConverter::detailFilterToJsondbQuery(const QOrganizerItemFilter &filter, QString *jsonDbQueryStr, int *typeFilterFlag) const
{
+ const QOrganizerItemDetailFilter df(filter);
+ const QOrganizerItemDetail detail(df.detail());
+ const QOrganizerItemDetail::DetailType detailType (detail.type());
+
+ //We do not currently support detailFilter on Comment or Tag details
+ if ( (detailType == QOrganizerItemDetail::TypeComment) ||
+ (detailType == QOrganizerItemDetail::TypeTag) ||
+ (detail.values().isEmpty()) )
+ return false;
+
+ if (detailType == QOrganizerItemDetail::TypeExtendedDetail) {
+ if (detail.values().size() != 2) {
+ //Both Name and Data fields should be present, otherwise filter is invalid
+ return false;
+ } else {
+ QVariant extDetailDataValue = detail.value(QOrganizerItemExtendedDetail::FieldData);
+ QString extDetailValueString = extDetailDataValue.toString();
+ QVariant::Type dataValueType = extDetailDataValue.type();
+ QJsonValue jsonVal = QJsonValue::fromVariant(extDetailDataValue);
+ if ( jsonVal.isString())
+ extDetailValueString = QString(QStringLiteral("\"%1\"").arg(extDetailValueString));
+ jsonDbQueryStr->append(QStringLiteral("[?%1=%2]")
+ .arg(detail.value(QOrganizerItemExtendedDetail::FieldName).toString())
+ .arg(extDetailValueString));
+ return true;
+ }
+ }
+
+ QMap<int, QVariant>::const_iterator fieldsIterator = detail.values().constBegin();
+ QVariant fieldValue;
+ foreach (int field, QOrganizerJsonDbEngine::supportedDetailFields(detailType)) {
+ if (detail.hasValue(field)) {
+ fieldValue = detail.value(field);
+ if (isSupportedDetailFieldFilter(fieldValue, detailType, field, QOrganizerItemFilter::MatchExactly)) {
+ addFieldToFilterQuery(detailType, field,
+ fieldValue, jsonDbQueryStr,
+ QOrganizerItemFilter::MatchExactly,
+ typeFilterFlag);
+ } else {
+ return false;
+ }
+ } else {
+ jsonDbQueryStr->append(QStringLiteral("[?%1 notExists]").arg(filterablePropertyNames().value(field)));
+ }
+ }
+ return true;
+}
+
+bool QOrganizerJsonDbConverter::detailFieldFilterToJsondbQuery(const QOrganizerItemFilter &filter, QString *jsonDbQueryStr, int *typeFilterFlag) const
+{
/*
- Jsondb backend specific notes related to OrganizerItemDetailFilter
+ Jsondb backend specific notes related to OrganizerItemDetailFieldFilter
Detail specific:
- Currently supported details; EventTime, TodoTime, Comment, Description, DisplayLabel,
@@ -1782,178 +1904,184 @@ bool QOrganizerJsonDbConverter::detailFilterToJsondbQuery(const QOrganizerItemFi
- Works only if MatchExactly or MatchFixedString are not set
*/
- const QOrganizerItemDetailFilter df(filter);
- const QOrganizerItemDetail::DetailType detailType(df.detailType());
- const int detailField(df.detailField());
- const QString valueString(df.value().toString());
-
- bool isValidFilter = isSupportedDetailFilter(filter, detailType, detailField);
-
- if (isValidFilter) { // proceed with jsondb query construction, if filter is valid
- const QString equalsQueryTemplate(QStringLiteral("[?%1=\"%2\"]"));
- const QString equalsQueryTemplate2(QStringLiteral("[?%1=%2]"));
- const QString equalsQueryTemplate3(QStringLiteral("[?%1.%2.%3=%4]"));
- const QString containsQueryTemplate(QStringLiteral("[?%1 contains \"%2\"]"));
- const QString matchFlagQueryTemplate(QStringLiteral("[?%1%2\"]"));
- const QString matchFlagQueryTemplate2(QStringLiteral("[?%1.%2%3\"]"));
- const QString existsQueryTemplate(QStringLiteral("[?%1 exists]"));
-
- if (QOrganizerItemDetail::TypeEventTime == detailType) {
- if (QOrganizerEventTime::FieldStartDateTime == detailField) {
- jsonDbQueryStr->append(equalsQueryTemplate
- .arg(QOrganizerJsonDbStr::eventStartDateTime()).arg(df.value().toDateTime().toUTC().toString(Qt::ISODate)));
- } else if (QOrganizerEventTime::FieldEndDateTime == detailField) {
- jsonDbQueryStr->append(equalsQueryTemplate
- .arg(QOrganizerJsonDbStr::eventEndDateTime()).arg(df.value().toDateTime().toUTC().toString(Qt::ISODate)));
- } else if (QOrganizerEventTime::FieldAllDay == detailField) {
- jsonDbQueryStr->append(equalsQueryTemplate2
- .arg(QOrganizerJsonDbStr::eventIsAllDay()).arg(valueString));
- }
+ const QOrganizerItemDetailFieldFilter dff(filter);
+ const QOrganizerItemDetail::DetailType detailType(dff.detailType());
+ const int detailField(dff.detailField());
- } else if (QOrganizerItemDetail::TypeTodoTime == detailType) {
- if (QOrganizerTodoTime::FieldStartDateTime == detailField) {
- jsonDbQueryStr->append(equalsQueryTemplate
- .arg(QOrganizerJsonDbStr::todoStartDateTime()).arg(df.value().toDateTime().toUTC().toString(Qt::ISODate)));
- } else if (QOrganizerTodoTime::FieldDueDateTime == detailField) {
- jsonDbQueryStr->append(equalsQueryTemplate
- .arg(QOrganizerJsonDbStr::todoDueDateTime()).arg(df.value().toDateTime().toUTC().toString(Qt::ISODate)));
- } else if (QOrganizerTodoTime::FieldAllDay == detailField) {
- jsonDbQueryStr->append(equalsQueryTemplate2
- .arg(QOrganizerJsonDbStr::todoIsAllDay()).arg(valueString));
- }
-
- } else if (QOrganizerItemDetail::TypeTodoProgress == detailType) {
- if (QOrganizerTodoProgress::FieldFinishedDateTime == detailField) {
- jsonDbQueryStr->append(equalsQueryTemplate
- .arg(QOrganizerJsonDbStr::todoFinishedDateTime())
- .arg(df.value().toDateTime().toUTC().toString(Qt::ISODate)));
- } else if (QOrganizerTodoProgress::FieldPercentageComplete == detailField) {
- jsonDbQueryStr->append(equalsQueryTemplate2
- .arg(QOrganizerJsonDbStr::todoProgressPercentage())
- .arg(df.value().toInt()));
- } else if (QOrganizerTodoProgress::FieldStatus == detailField) {
- jsonDbQueryStr->append(equalsQueryTemplate
- .arg(QOrganizerJsonDbStr::todoStatus())
- .arg(enumToString(organizerTodoStatusMap(), df.value().toInt())));
- }
+ if (isSupportedDetailFieldFilter(dff.value(), detailType, detailField, dff.matchFlags())) {
+ addFieldToFilterQuery(detailType, detailField, dff.value(), jsonDbQueryStr, dff.matchFlags(), typeFilterFlag);
+ return true;
+ } else {
+ return false;
+ }
+}
- } else if (QOrganizerItemDetail::TypeComment == detailType
- && QOrganizerItemComment::FieldComment == detailField) {
- jsonDbQueryStr->append(containsQueryTemplate.arg(QOrganizerJsonDbStr::itemComments()).arg(valueString));
-
- } else if (QOrganizerItemDetail::TypeDescription == detailType
- && QOrganizerItemDescription::FieldDescription == detailField) {
- jsonDbQueryStr->append(matchFlagQueryTemplate
- .arg(QOrganizerJsonDbStr::itemDescription()).arg(createMatchFlagQuery(valueString, df.matchFlags())));
-
- } else if (QOrganizerItemDetail::TypeDisplayLabel == detailType
- && QOrganizerItemDisplayLabel::FieldLabel == detailField) {
- jsonDbQueryStr->append(matchFlagQueryTemplate
- .arg(QOrganizerJsonDbStr::itemDisplayName())
- .arg(createMatchFlagQuery(valueString, df.matchFlags())));
-
- } else if (QOrganizerItemDetail::TypeGuid == detailType
- && QOrganizerItemGuid::FieldGuid == detailField) {
- jsonDbQueryStr->append(matchFlagQueryTemplate
- .arg(QOrganizerJsonDbStr::itemGuid())
- .arg(createMatchFlagQuery(valueString, df.matchFlags())));
-
- } else if (QOrganizerItemDetail::TypeLocation == detailType) {
- if (QOrganizerItemLocation::FieldLabel == detailField) {
- jsonDbQueryStr->append(matchFlagQueryTemplate2
- .arg(QOrganizerJsonDbStr::eventLocation())
- .arg(QOrganizerJsonDbStr::eventLocationDisplayName())
- .arg(createMatchFlagQuery(valueString, df.matchFlags())));
- } else if (QOrganizerItemLocation::FieldLongitude == detailField) {
- jsonDbQueryStr->append(equalsQueryTemplate3
- .arg(QOrganizerJsonDbStr::eventLocation())
- .arg(QOrganizerJsonDbStr::eventLocationGeo())
- .arg(QOrganizerJsonDbStr::eventLocationGeoLongitude())
- .arg(valueString));
- } else if (QOrganizerItemLocation::FieldLatitude == detailField) {
- jsonDbQueryStr->append(equalsQueryTemplate3
- .arg(QOrganizerJsonDbStr::eventLocation())
- .arg(QOrganizerJsonDbStr::eventLocationGeo())
- .arg(QOrganizerJsonDbStr::eventLocationGeoLatitude())
- .arg(valueString));
- }
+void QOrganizerJsonDbConverter::addFieldToFilterQuery(QOrganizerItemDetail::DetailType detailType,
+ int detailField, const QVariant &fieldValue,
+ QString *jsonDbQueryStr,
+ QOrganizerItemFilter::MatchFlags matchFlags,
+ int *typeFilterFlag) const
+{
+ const QString equalsQueryTemplate(QStringLiteral("[?%1=\"%2\"]"));
+ const QString equalsQueryTemplate2(QStringLiteral("[?%1=%2]"));
+ const QString equalsQueryTemplate3(QStringLiteral("[?%1.%2.%3=%4]"));
+ const QString containsQueryTemplate(QStringLiteral("[?%1 contains \"%2\"]"));
+ const QString matchFlagQueryTemplate(QStringLiteral("[?%1%2\"]"));
+ const QString matchFlagQueryTemplate2(QStringLiteral("[?%1.%2%3\"]"));
+ const QString existsQueryTemplate(QStringLiteral("[?%1 exists]"));
+ const QString valueString(fieldValue.toString());
+
+ if (QOrganizerItemDetail::TypeEventTime == detailType) {
+ if (QOrganizerEventTime::FieldStartDateTime == detailField) {
+ jsonDbQueryStr->append(equalsQueryTemplate
+ .arg(QOrganizerJsonDbStr::eventStartDateTime()).arg(fieldValue.toDateTime().toUTC().toString(Qt::ISODate)));
+ } else if (QOrganizerEventTime::FieldEndDateTime == detailField) {
+ jsonDbQueryStr->append(equalsQueryTemplate
+ .arg(QOrganizerJsonDbStr::eventEndDateTime()).arg(fieldValue.toDateTime().toUTC().toString(Qt::ISODate)));
+ } else if (QOrganizerEventTime::FieldAllDay == detailField) {
+ jsonDbQueryStr->append(equalsQueryTemplate2
+ .arg(QOrganizerJsonDbStr::eventIsAllDay()).arg(valueString));
+ }
- } else if (QOrganizerItemDetail::TypePriority == detailType
- && QOrganizerItemPriority::FieldPriority == detailField) {
+ } else if (QOrganizerItemDetail::TypeTodoTime == detailType) {
+ if (QOrganizerTodoTime::FieldStartDateTime == detailField) {
jsonDbQueryStr->append(equalsQueryTemplate
- .arg(QOrganizerJsonDbStr::itemPriority())
- .arg(enumToString(organizerPriorityEnumMap(), df.value().toInt())));
+ .arg(QOrganizerJsonDbStr::todoStartDateTime()).arg(fieldValue.toDateTime().toUTC().toString(Qt::ISODate)));
+ } else if (QOrganizerTodoTime::FieldDueDateTime == detailField) {
+ jsonDbQueryStr->append(equalsQueryTemplate
+ .arg(QOrganizerJsonDbStr::todoDueDateTime()).arg(fieldValue.toDateTime().toUTC().toString(Qt::ISODate)));
+ } else if (QOrganizerTodoTime::FieldAllDay == detailField) {
+ jsonDbQueryStr->append(equalsQueryTemplate2
+ .arg(QOrganizerJsonDbStr::todoIsAllDay()).arg(valueString));
+ }
- } else if (QOrganizerItemDetail::TypeItemType == detailType
- && QOrganizerItemType::FieldType == detailField) {
+ } else if (QOrganizerItemDetail::TypeTodoProgress == detailType) {
+ if (QOrganizerTodoProgress::FieldFinishedDateTime == detailField) {
jsonDbQueryStr->append(equalsQueryTemplate
- .arg(QOrganizerJsonDbStr::jsonDbType())
- .arg(QOrganizerJsonDbStr::jsonDbSchemaPrefix() + enumToString(organizerItemTypeMap(), df.value().toInt())));
- *typeFilterFlag = 0x01 << (df.value().toInt() - QOrganizerItemType::TypeUndefined);
-
- } else if (QOrganizerItemDetail::TypeTag == detailType
- && QOrganizerItemTag::FieldTag == detailField) {
- jsonDbQueryStr->append(containsQueryTemplate.arg(QOrganizerJsonDbStr::itemTags()).arg(valueString));
-
- } else if (QOrganizerItemDetail::TypeParent == detailType) {
- if (QOrganizerItemParent::FieldParentId == detailField) {
- const QOrganizerItemEngineId *itemIdPtr = QOrganizerManagerEngine::engineItemId(df.value().value<QOrganizerItemId>());
- if (!itemIdPtr) {
- isValidFilter = false;
- } else {
- jsonDbQueryStr->append(equalsQueryTemplate
- .arg(QOrganizerJsonDbStr::itemOccurrenceParent())
- .arg(itemIdPtr->toString()));
- }
- } else if (QOrganizerItemParent::FieldOriginalDate == detailField) {
- jsonDbQueryStr->append(equalsQueryTemplate
- .arg(QOrganizerJsonDbStr::itemOccurrenceOriginalDate()).arg(df.value().toDate().toString(Qt::ISODate)));
- }
+ .arg(QOrganizerJsonDbStr::todoFinishedDateTime())
+ .arg(fieldValue.toDateTime().toUTC().toString(Qt::ISODate)));
+ } else if (QOrganizerTodoProgress::FieldPercentageComplete == detailField) {
+ jsonDbQueryStr->append(equalsQueryTemplate2
+ .arg(QOrganizerJsonDbStr::todoProgressPercentage())
+ .arg(fieldValue.toInt()));
+ } else if (QOrganizerTodoProgress::FieldStatus == detailField) {
+ jsonDbQueryStr->append(equalsQueryTemplate
+ .arg(QOrganizerJsonDbStr::todoStatus())
+ .arg(enumToString(organizerTodoStatusMap(), fieldValue.toInt())));
+ }
+
+ } else if (QOrganizerItemDetail::TypeComment == detailType
+ && QOrganizerItemComment::FieldComment == detailField) {
+ jsonDbQueryStr->append(containsQueryTemplate.arg(QOrganizerJsonDbStr::itemComments()).arg(valueString));
+
+ } else if (QOrganizerItemDetail::TypeDescription == detailType
+ && QOrganizerItemDescription::FieldDescription == detailField) {
+ jsonDbQueryStr->append(matchFlagQueryTemplate
+ .arg(QOrganizerJsonDbStr::itemDescription()).arg(createMatchFlagQuery(valueString, matchFlags)));
+
+ } else if (QOrganizerItemDetail::TypeDisplayLabel == detailType
+ && QOrganizerItemDisplayLabel::FieldLabel == detailField) {
+ jsonDbQueryStr->append(matchFlagQueryTemplate
+ .arg(QOrganizerJsonDbStr::itemDisplayName())
+ .arg(createMatchFlagQuery(valueString, matchFlags)));
+
+ } else if (QOrganizerItemDetail::TypeGuid == detailType
+ && QOrganizerItemGuid::FieldGuid == detailField) {
+ jsonDbQueryStr->append(matchFlagQueryTemplate
+ .arg(QOrganizerJsonDbStr::itemGuid())
+ .arg(createMatchFlagQuery(valueString, matchFlags)));
+
+ } else if (QOrganizerItemDetail::TypeLocation == detailType) {
+ if (QOrganizerItemLocation::FieldLabel == detailField) {
+ jsonDbQueryStr->append(matchFlagQueryTemplate2
+ .arg(QOrganizerJsonDbStr::eventLocation())
+ .arg(QOrganizerJsonDbStr::eventLocationDisplayName())
+ .arg(createMatchFlagQuery(valueString, matchFlags)));
+ } else if (QOrganizerItemLocation::FieldLongitude == detailField) {
+ jsonDbQueryStr->append(equalsQueryTemplate3
+ .arg(QOrganizerJsonDbStr::eventLocation())
+ .arg(QOrganizerJsonDbStr::eventLocationGeo())
+ .arg(QOrganizerJsonDbStr::eventLocationGeoLongitude())
+ .arg(valueString));
+ } else if (QOrganizerItemLocation::FieldLatitude == detailField) {
+ jsonDbQueryStr->append(equalsQueryTemplate3
+ .arg(QOrganizerJsonDbStr::eventLocation())
+ .arg(QOrganizerJsonDbStr::eventLocationGeo())
+ .arg(QOrganizerJsonDbStr::eventLocationGeoLatitude())
+ .arg(valueString));
+ }
- } else if (QOrganizerItemDetail::TypeExtendedDetail == detailType
- && QOrganizerItemExtendedDetail::FieldName == detailField) {
- jsonDbQueryStr->append(existsQueryTemplate.arg(valueString));
-
- } else if (QOrganizerItemDetail::TypeEventRsvp == detailType) {
- if (QOrganizerEventRsvp::FieldParticipationStatus == detailField) {
- jsonDbQueryStr->append(matchFlagQueryTemplate2
- .arg(QOrganizerJsonDbStr::eventRsvp())
- .arg(QOrganizerJsonDbStr::eventRsvpParticipationStatus())
- .arg(createMatchFlagQuery(enumToString(organizerParticipationStatusMap(), df.value().toInt()), df.matchFlags())));
- } else if (QOrganizerEventRsvp::FieldParticipationRole == detailField) {
- jsonDbQueryStr->append(matchFlagQueryTemplate2
- .arg(QOrganizerJsonDbStr::eventRsvp())
- .arg(QOrganizerJsonDbStr::eventRsvpParticipationRole())
- .arg(createMatchFlagQuery(enumToString(organizerParticipationRoleMap(), df.value().toInt()), df.matchFlags())));
- } else if (QOrganizerEventRsvp::FieldResponseRequirement == detailField) {
- jsonDbQueryStr->append(matchFlagQueryTemplate2
- .arg(QOrganizerJsonDbStr::eventRsvp())
- .arg(QOrganizerJsonDbStr::eventRsvpResponseRequirement())
- .arg(createMatchFlagQuery(enumToString(organizerResponseRequirementMap(), df.value().toInt()), df.matchFlags())));
- } else if (QOrganizerEventRsvp::FieldResponseDeadline == detailField) {
- jsonDbQueryStr->append(matchFlagQueryTemplate2
- .arg(QOrganizerJsonDbStr::eventRsvp())
- .arg(QOrganizerJsonDbStr::eventRsvpResponseDeadline())
- .arg(createMatchFlagQuery(df.value().toDate().toString(Qt::ISODate), df.matchFlags())));
- } else if (QOrganizerEventRsvp::FieldResponseDate == detailField) {
- jsonDbQueryStr->append(matchFlagQueryTemplate2
- .arg(QOrganizerJsonDbStr::eventRsvp())
- .arg(QOrganizerJsonDbStr::eventRsvpResponseDate())
- .arg(createMatchFlagQuery(df.value().toDate().toString(Qt::ISODate), df.matchFlags())));
- } else if (QOrganizerEventRsvp::FieldOrganizerName == detailField) {
- jsonDbQueryStr->append(matchFlagQueryTemplate2
- .arg(QOrganizerJsonDbStr::eventRsvp())
- .arg(QOrganizerJsonDbStr::eventRsvpOrganizerName())
- .arg(createMatchFlagQuery(valueString, df.matchFlags())));
- } else if (QOrganizerEventRsvp::FieldOrganizerEmail == detailField) {
- jsonDbQueryStr->append(matchFlagQueryTemplate2
- .arg(QOrganizerJsonDbStr::eventRsvp())
- .arg(QOrganizerJsonDbStr::eventRsvpOrganizerEmail())
- .arg(createMatchFlagQuery(valueString, df.matchFlags())));
+ } else if (QOrganizerItemDetail::TypePriority == detailType
+ && QOrganizerItemPriority::FieldPriority == detailField) {
+ jsonDbQueryStr->append(equalsQueryTemplate
+ .arg(QOrganizerJsonDbStr::itemPriority())
+ .arg(enumToString(organizerPriorityEnumMap(), fieldValue.toInt())));
+
+ } else if (QOrganizerItemDetail::TypeItemType == detailType
+ && QOrganizerItemType::FieldType == detailField) {
+ jsonDbQueryStr->append(equalsQueryTemplate
+ .arg(QOrganizerJsonDbStr::jsonDbType())
+ .arg(QOrganizerJsonDbStr::jsonDbSchemaPrefix() + enumToString(organizerItemTypeMap(), fieldValue.toInt())));
+ *typeFilterFlag = 0x01 << (fieldValue.toInt() - QOrganizerItemType::TypeUndefined);
+
+ } else if (QOrganizerItemDetail::TypeTag == detailType
+ && QOrganizerItemTag::FieldTag == detailField) {
+ jsonDbQueryStr->append(containsQueryTemplate.arg(QOrganizerJsonDbStr::itemTags()).arg(valueString));
+
+ } else if (QOrganizerItemDetail::TypeParent == detailType) {
+ if (QOrganizerItemParent::FieldParentId == detailField) {
+ const QOrganizerItemEngineId *itemIdPtr = QOrganizerManagerEngine::engineItemId(fieldValue.value<QOrganizerItemId>());
+ if (itemIdPtr) {
+ jsonDbQueryStr->append(equalsQueryTemplate
+ .arg(QOrganizerJsonDbStr::itemOccurrenceParent())
+ .arg(itemIdPtr->toString()));
}
+ } else if (QOrganizerItemParent::FieldOriginalDate == detailField) {
+ jsonDbQueryStr->append(equalsQueryTemplate
+ .arg(QOrganizerJsonDbStr::itemOccurrenceOriginalDate()).arg(fieldValue.toDate().toString(Qt::ISODate)));
+ }
+ } else if (QOrganizerItemDetail::TypeExtendedDetail == detailType
+ && QOrganizerItemExtendedDetail::FieldName == detailField) {
+ jsonDbQueryStr->append(existsQueryTemplate.arg(valueString));
+
+ } else if (QOrganizerItemDetail::TypeEventRsvp == detailType) {
+ if (QOrganizerEventRsvp::FieldParticipationStatus == detailField) {
+ jsonDbQueryStr->append(matchFlagQueryTemplate2
+ .arg(QOrganizerJsonDbStr::eventRsvp())
+ .arg(QOrganizerJsonDbStr::eventRsvpParticipationStatus())
+ .arg(createMatchFlagQuery(enumToString(organizerParticipationStatusMap(), fieldValue.toInt()), matchFlags)));
+ } else if (QOrganizerEventRsvp::FieldParticipationRole == detailField) {
+ jsonDbQueryStr->append(matchFlagQueryTemplate2
+ .arg(QOrganizerJsonDbStr::eventRsvp())
+ .arg(QOrganizerJsonDbStr::eventRsvpParticipationRole())
+ .arg(createMatchFlagQuery(enumToString(organizerParticipationRoleMap(), fieldValue.toInt()), matchFlags)));
+ } else if (QOrganizerEventRsvp::FieldResponseRequirement == detailField) {
+ jsonDbQueryStr->append(matchFlagQueryTemplate2
+ .arg(QOrganizerJsonDbStr::eventRsvp())
+ .arg(QOrganizerJsonDbStr::eventRsvpResponseRequirement())
+ .arg(createMatchFlagQuery(enumToString(organizerResponseRequirementMap(), fieldValue.toInt()), matchFlags)));
+ } else if (QOrganizerEventRsvp::FieldResponseDeadline == detailField) {
+ jsonDbQueryStr->append(matchFlagQueryTemplate2
+ .arg(QOrganizerJsonDbStr::eventRsvp())
+ .arg(QOrganizerJsonDbStr::eventRsvpResponseDeadline())
+ .arg(createMatchFlagQuery(fieldValue.toDate().toString(Qt::ISODate), matchFlags)));
+ } else if (QOrganizerEventRsvp::FieldResponseDate == detailField) {
+ jsonDbQueryStr->append(matchFlagQueryTemplate2
+ .arg(QOrganizerJsonDbStr::eventRsvp())
+ .arg(QOrganizerJsonDbStr::eventRsvpResponseDate())
+ .arg(createMatchFlagQuery(fieldValue.toDate().toString(Qt::ISODate), matchFlags)));
+ } else if (QOrganizerEventRsvp::FieldOrganizerName == detailField) {
+ jsonDbQueryStr->append(matchFlagQueryTemplate2
+ .arg(QOrganizerJsonDbStr::eventRsvp())
+ .arg(QOrganizerJsonDbStr::eventRsvpOrganizerName())
+ .arg(createMatchFlagQuery(valueString, matchFlags)));
+ } else if (QOrganizerEventRsvp::FieldOrganizerEmail == detailField) {
+ jsonDbQueryStr->append(matchFlagQueryTemplate2
+ .arg(QOrganizerJsonDbStr::eventRsvp())
+ .arg(QOrganizerJsonDbStr::eventRsvpOrganizerEmail())
+ .arg(createMatchFlagQuery(valueString, matchFlags)));
}
}
- return isValidFilter;
}
QString QOrganizerJsonDbConverter::createMatchFlagQuery(const QString &value, QOrganizerItemFilter::MatchFlags flags) const
diff --git a/src/plugins/organizer/jsondb/qorganizerjsondbconverter.h b/src/plugins/organizer/jsondb/qorganizerjsondbconverter.h
index 67e3819f1..d0ebbf4dc 100644
--- a/src/plugins/organizer/jsondb/qorganizerjsondbconverter.h
+++ b/src/plugins/organizer/jsondb/qorganizerjsondbconverter.h
@@ -57,6 +57,7 @@
#include <QtOrganizer/qorganizermanager.h>
#include <QtOrganizer/qorganizeritemdetails.h>
#include <QtOrganizer/qorganizeritemdetailfilter.h>
+#include <QtOrganizer/qorganizeritemdetailfieldfilter.h>
#include <QtJsonDb/qjsondbconnection.h>
#include <QtJsonDb/qjsondbreadrequest.h>
@@ -136,11 +137,21 @@ private:
bool collectionFilterToJsondbQuery(const QOrganizerItemFilter &filter, QString *jsonDbQueryStr) const;
bool idFilterToJsondbQuery(const QOrganizerItemFilter &filter, QString *jsonDbQueryStr) const;
bool detailFilterToJsondbQuery(const QOrganizerItemFilter &filter, QString *jsonDbQueryStr, int *typeFilterFlag) const;
- bool isSupportedDetailFilter(
- const QOrganizerItemDetailFilter &filter, QOrganizerItemDetail::DetailType detailType, int detailFieldName) const;
+ bool detailFieldFilterToJsondbQuery(const QOrganizerItemFilter &filter, QString *jsonDbQueryStr, int *typeFilterFlag) const;
+ bool isSupportedDetailFieldFilter(const QVariant &fieldValue,
+ QOrganizerItemDetail::DetailType detailType,
+ int detailFieldName,
+ QOrganizerItemFilter::MatchFlags matchFlags) const;
QString createMatchFlagQuery(const QString &value, QOrganizerItemFilter::MatchFlags flags) const;
+ void addFieldToFilterQuery(QOrganizerItemDetail::DetailType detailType,
+ int detailField,
+ const QVariant &fieldValue,
+ QString *jsonDbQueryStr,
+ QOrganizerItemFilter::MatchFlags matchFlags,
+ int *typeFilterFlag) const;
static const int enumMapEnd;
+ static const QMap<int, QString> filterablePropertyNames();
static const QOrganizerJsonDbEnumConversionData *organizerPriorityEnumMap();
static const QOrganizerJsonDbEnumConversionData *organizerFrequencyEnumMap();
static const QOrganizerJsonDbEnumConversionData *organizerDayEnumMap();
diff --git a/src/plugins/organizer/jsondb/qorganizerjsondbengine.cpp b/src/plugins/organizer/jsondb/qorganizerjsondbengine.cpp
index 3ed652521..b54178141 100644
--- a/src/plugins/organizer/jsondb/qorganizerjsondbengine.cpp
+++ b/src/plugins/organizer/jsondb/qorganizerjsondbengine.cpp
@@ -435,6 +435,7 @@ QList<QOrganizerItemFilter::FilterType> QOrganizerJsonDbEngine::supportedFilters
supported << QOrganizerItemFilter::InvalidFilter
<< QOrganizerItemFilter::DetailFilter
+ << QOrganizerItemFilter::DetailFieldFilter
<< QOrganizerItemFilter::IntersectionFilter
<< QOrganizerItemFilter::UnionFilter
<< QOrganizerItemFilter::IdFilter
@@ -511,6 +512,104 @@ QList<QOrganizerItemType::ItemType> QOrganizerJsonDbEngine::supportedItemTypes()
return ret;
}
+const QList<int> QOrganizerJsonDbEngine::supportedDetailFields(QOrganizerItemDetail::DetailType detailType)
+{
+ static QMap<int, QList<int> > supportedFieldsByType;
+ if (supportedFieldsByType.isEmpty()) {
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeAudibleReminder,
+ QList<int>() << QOrganizerItemAudibleReminder::FieldDataUrl
+ << QOrganizerItemAudibleReminder::FieldRepetitionCount
+ << QOrganizerItemAudibleReminder::FieldRepetitionDelay
+ << QOrganizerItemAudibleReminder::FieldSecondsBeforeStart);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeClassification,
+ QList<int>() << QOrganizerItemClassification::FieldClassification);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeComment,
+ QList<int>() << QOrganizerItemComment::FieldComment);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeDescription,
+ QList<int>() << QOrganizerItemDescription::FieldDescription);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeDisplayLabel,
+ QList<int>() << QOrganizerItemDisplayLabel::FieldLabel);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeEmailReminder,
+ QList<int>() << QOrganizerItemEmailReminder::FieldAttachments
+ << QOrganizerItemEmailReminder::FieldBody
+ << QOrganizerItemEmailReminder::FieldRecipients
+ << QOrganizerItemEmailReminder::FieldRepetitionCount
+ << QOrganizerItemEmailReminder::FieldRepetitionDelay
+ << QOrganizerItemEmailReminder::FieldSecondsBeforeStart
+ << QOrganizerItemEmailReminder::FieldSubject);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeEventAttendee,
+ QList<int>() << QOrganizerEventAttendee::FieldAttendeeId
+ << QOrganizerEventAttendee::FieldEmailAddress
+ << QOrganizerEventAttendee::FieldName
+ << QOrganizerEventAttendee::FieldParticipationRole
+ << QOrganizerEventAttendee::FieldParticipationStatus);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeEventRsvp,
+ QList<int>() << QOrganizerEventRsvp::FieldOrganizerEmail
+ << QOrganizerEventRsvp::FieldOrganizerName
+ << QOrganizerEventRsvp::FieldParticipationRole
+ << QOrganizerEventRsvp::FieldParticipationStatus
+ << QOrganizerEventRsvp::FieldResponseDate
+ << QOrganizerEventRsvp::FieldResponseDeadline
+ << QOrganizerEventRsvp::FieldResponseRequirement);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeEventTime,
+ QList<int>() << QOrganizerEventTime::FieldAllDay
+ << QOrganizerEventTime::FieldEndDateTime
+ << QOrganizerEventTime::FieldStartDateTime);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeExtendedDetail,
+ QList<int>() << QOrganizerItemExtendedDetail::FieldData
+ << QOrganizerItemExtendedDetail::FieldName);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeGuid,
+ QList<int>() << QOrganizerItemGuid::FieldGuid);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeItemType,
+ QList<int>() << QOrganizerItemType::FieldType);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeJournalTime,
+ QList<int>() << QOrganizerJournalTime::FieldEntryDateTime);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeLocation,
+ QList<int>() << QOrganizerItemLocation::FieldLabel
+ << QOrganizerItemLocation::FieldLatitude
+ << QOrganizerItemLocation::FieldLongitude);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeParent,
+ QList<int>() << QOrganizerItemParent::FieldOriginalDate
+ << QOrganizerItemParent::FieldParentId);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypePriority,
+ QList<int>() << QOrganizerItemPriority::FieldPriority);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeRecurrence,
+ QList<int>() << QOrganizerItemRecurrence::FieldExceptionDates
+ << QOrganizerItemRecurrence::FieldExceptionRules
+ << QOrganizerItemRecurrence::FieldRecurrenceDates
+ << QOrganizerItemRecurrence::FieldRecurrenceRules);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeReminder,
+ QList<int>() << QOrganizerItemReminder::FieldRepetitionCount
+ << QOrganizerItemReminder::FieldRepetitionDelay
+ << QOrganizerItemReminder::FieldSecondsBeforeStart);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeTag,
+ QList<int>() << QOrganizerItemTag::FieldTag);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeTimestamp,
+ QList<int>() << QOrganizerItemTimestamp::FieldCreated
+ << QOrganizerItemTimestamp::FieldLastModified);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeTodoProgress,
+ QList<int>() << QOrganizerTodoProgress::FieldFinishedDateTime
+ << QOrganizerTodoProgress::FieldPercentageComplete
+ << QOrganizerTodoProgress::FieldStatus);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeTodoTime,
+ QList<int>() << QOrganizerTodoTime::FieldAllDay
+ << QOrganizerTodoTime::FieldDueDateTime
+ << QOrganizerTodoTime::FieldStartDateTime);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeUndefined,
+ QList<int>());
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeVersion,
+ QList<int>() << QOrganizerItemVersion::FieldExtendedVersion
+ << QOrganizerItemVersion::FieldVersion);
+ supportedFieldsByType.insert(QOrganizerItemDetail::TypeVisualReminder,
+ QList<int>() << QOrganizerItemVisualReminder::FieldDataUrl
+ << QOrganizerItemVisualReminder::FieldMessage
+ << QOrganizerItemVisualReminder::FieldRepetitionCount
+ << QOrganizerItemVisualReminder::FieldRepetitionDelay
+ << QOrganizerItemVisualReminder::FieldSecondsBeforeStart);
+ }
+ return supportedFieldsByType.value(detailType, QList<int>());
+}
+
#include "moc_qorganizerjsondbengine.cpp"
QTORGANIZER_END_NAMESPACE
diff --git a/src/plugins/organizer/jsondb/qorganizerjsondbengine.h b/src/plugins/organizer/jsondb/qorganizerjsondbengine.h
index 15ae030dd..17ec047ce 100644
--- a/src/plugins/organizer/jsondb/qorganizerjsondbengine.h
+++ b/src/plugins/organizer/jsondb/qorganizerjsondbengine.h
@@ -162,6 +162,9 @@ public:
bool cancelRequest(QOrganizerAbstractRequest* req);
bool waitForRequestFinished(QOrganizerAbstractRequest* req, int msecs);
+ /* JsonDb Engine internal capability reporting */
+ static const QList<int> supportedDetailFields(QOrganizerItemDetail::DetailType detailType);
+
signals:
void requestReceived(QOrganizerAbstractRequest* req);
diff --git a/src/plugins/organizer/jsondb/qorganizerjsondbrequestthread.cpp b/src/plugins/organizer/jsondb/qorganizerjsondbrequestthread.cpp
index fbdf6b1ce..ad4d34a81 100644
--- a/src/plugins/organizer/jsondb/qorganizerjsondbrequestthread.cpp
+++ b/src/plugins/organizer/jsondb/qorganizerjsondbrequestthread.cpp
@@ -937,7 +937,7 @@ QOrganizerItem QOrganizerJsonDbRequestThread::fetchParentItem(const QOrganizerIt
}
// if parent was not found based on id, try with guid
if (!occurrence.guid().isEmpty()) {
- QOrganizerItemDetailFilter guidFilter;
+ QOrganizerItemDetailFieldFilter guidFilter;
guidFilter.setDetail(QOrganizerItemDetail::TypeGuid, QOrganizerItemGuid::FieldGuid);
guidFilter.setValue(occurrence.guid());
@@ -1296,10 +1296,10 @@ void QOrganizerJsonDbRequestThread::removeItems(const QList<QOrganizerItemId> &i
QOrganizerItemUnionFilter unionFilter;
for (int i = 0; i < removedParentIds.size(); i++) {
- QOrganizerItemDetailFilter detailFilter;
- detailFilter.setDetail(QOrganizerItemDetail::TypeParent, QOrganizerItemParent::FieldParentId);
- detailFilter.setValue(QVariant::fromValue(removedParentIds[i]));
- unionFilter.append(detailFilter);
+ QOrganizerItemDetailFieldFilter detailFieldFilter;
+ detailFieldFilter.setDetail(QOrganizerItemDetail::TypeParent, QOrganizerItemParent::FieldParentId);
+ detailFieldFilter.setValue(QVariant::fromValue(removedParentIds[i]));
+ unionFilter.append(detailFieldFilter);
}
tmpError = QOrganizerManager::NoError;
diff --git a/src/plugins/organizer/memory/qorganizeritemmemorybackend_p.h b/src/plugins/organizer/memory/qorganizeritemmemorybackend_p.h
index e2233ce59..860fd70d1 100644
--- a/src/plugins/organizer/memory/qorganizeritemmemorybackend_p.h
+++ b/src/plugins/organizer/memory/qorganizeritemmemorybackend_p.h
@@ -230,6 +230,7 @@ public:
supported << QOrganizerItemFilter::InvalidFilter
<< QOrganizerItemFilter::DetailFilter
+ << QOrganizerItemFilter::DetailFieldFilter
<< QOrganizerItemFilter::DetailRangeFilter
<< QOrganizerItemFilter::IntersectionFilter
<< QOrganizerItemFilter::UnionFilter
diff --git a/tests/auto/organizer/qmlorganizer/qmlorganizer.pro b/tests/auto/organizer/qmlorganizer/qmlorganizer.pro
index 01db44208..2eda328df 100644
--- a/tests/auto/organizer/qmlorganizer/qmlorganizer.pro
+++ b/tests/auto/organizer/qmlorganizer/qmlorganizer.pro
@@ -6,6 +6,7 @@ OTHER_FILES += testcases/addEvent.qml \
testcases/QOrganizerTestUtility.qml \
testcases/tst_afirstthingtorun.qml \
testcases/tst_detailfilter.qml \
+ testcases/tst_detailfieldfilter.qml \
testcases/tst_organizeritem.qml \
testcases/tst_organizeritems.qml \
testcases/tst_organizermodel.qml \
diff --git a/tests/auto/organizer/qmlorganizer/testcases/tst_detailfieldfilter.qml b/tests/auto/organizer/qmlorganizer/testcases/tst_detailfieldfilter.qml
new file mode 100644
index 000000000..98a7bd119
--- /dev/null
+++ b/tests/auto/organizer/qmlorganizer/testcases/tst_detailfieldfilter.qml
@@ -0,0 +1,814 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtTest 1.0
+import QtOrganizer 5.0
+
+TestCase {
+ name: "detailFieldFilterTests"
+ id: detailFieldFilterTests
+
+ property OrganizerModel organizerModel;
+ property int spyWaitDelay: 250
+
+ QOrganizerTestUtility {
+ id: utility
+ }
+
+ // UTILITIES
+
+ // There is currently some problem with static
+ // SignalSpy and changing the target (QTBUG-21083).
+ // As a workaround recreating the spy dynamicly.
+ function create_spy(targetObj, signalName) {
+ var spy = Qt.createQmlObject( "import QtTest 1.0 \nSignalSpy {}", detailFieldFilterTests);
+ spy.target = targetObj;
+ spy.signalName = signalName;
+ return spy;
+ }
+
+ function createModel(managerName) {
+ var model = Qt.createQmlObject(
+ "import QtOrganizer 5.0;"
+ + "OrganizerModel {"
+ + " manager: \"qtorganizer:" + managerName + ":id=qml\";"
+ + " startPeriod:'2009-01-01';"
+ + " endPeriod:'2012-12-31';"
+ + " autoUpdate:true; }"
+ , detailFieldFilterTests);
+ utility.init(model);
+ utility.waitModelChange();
+ utility.empty_calendar();
+ return model;
+ }
+
+ function create_testobject(ctorString) {
+ var newObject = Qt.createQmlObject(ctorString, detailFieldFilterTests);
+ verify(newObject != undefined, 'Object creation failed');
+ return newObject;
+ }
+
+ function addEventsToModel(ctrStrings) {
+ for (var i=0;i<ctrStrings.length;i++) {
+ var event = create_testobject(ctrStrings[i]);
+ organizerModel.saveItem(event);
+ utility.waitModelChange();
+ }
+ }
+
+ function addDetailWithoutConvenienceAPI(constructionString) {
+ // not all details have convenience API
+ var modelChangedSpy = create_spy(organizerModel, "modelChanged");
+ var detail = create_testobject(constructionString);
+ var detailEvent = create_testobject("import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Event {\n"
+ + " startDateTime:new Date('2011-10-25')\n"
+ + " endDateTime:new Date('2011-10-26')\n"
+ + " }");
+ detailEvent.setDetail(detail);
+ organizerModel.saveItem(detailEvent);
+ modelChangedSpy.wait();
+ }
+
+ function applyFilter(data) {
+ var filterChangedSpy = create_spy(organizerModel, "filterChanged");
+ var filter = create_detailFieldFilter();
+ filter.detail = data.filterDetail;
+ if (data.filterField != undefined)
+ filter.field = data.filterField;
+ if (data.filterValue != undefined)
+ filter.value = data.filterValue;
+ if (data.matchFlags != undefined)
+ filter.matchFlags = data.matchFlags
+ compare(organizerModel.error, "NoError");
+ organizerModel.filter = filter;
+ filterChangedSpy.wait();
+ compare(filterChangedSpy.count, 1);
+ }
+
+ // DETAILFIELDFILTER OWN API
+
+ function create_detailFieldFilter() {
+ var ctorString = "import QtQuick 2.0 \n"
+ + "import QtOrganizer 5.0\n"
+ + "DetailFieldFilter {\n"
+ + "}\n"
+ var newDetailFieldFilter = Qt.createQmlObject(ctorString, detailFieldFilterTests);
+ verify(newDetailFieldFilter != undefined, 'DetailFieldFilter creation failed');
+ return newDetailFieldFilter;
+ }
+
+ // creation
+ function test_creation_data() {
+ return [
+ {tag: "empty definition",
+ code: "import QtQuick 2.0 \n"
+ + "import QtOrganizer 5.0\n"
+ + "DetailFieldFilter {\n"
+ + "}\n"
+ },
+ {tag: "full definition",
+ code: "import QtQuick 2.0 \n"
+ + "import QtOrganizer 5.0\n"
+ + "DetailFieldFilter {\n"
+ + "detail:Detail.Description\n"
+ + "field:Description.FieldDescription\n"
+ + "value: 'my value'\n"
+ + "matchFlags: Filter.MatchContains\n"
+ + "}\n"
+ }
+ ]
+ }
+ function test_creation(data) {
+ console.log("");//to print out test tags for every data set
+ var newDetailFieldFilter = create_testobject(data.code, detailFieldFilterTests);
+ }
+
+ // detail API
+ function test_detail_data() {
+ return [
+ {tag: "empty field", testValue: -1},
+ {tag: "enum detail", testValue: Detail.Priority}
+ ]
+ }
+ function test_detail(data) {
+ var detailFieldFilter = create_detailFieldFilter();
+ var valueChangedSpy = create_spy(detailFieldFilter, "valueChanged");
+ var filterChangedSpy = create_spy(detailFieldFilter, "filterChanged");
+ // change
+ detailFieldFilter.detail = data.testValue;
+ compare(valueChangedSpy.count, 1);
+ compare(filterChangedSpy.count, 1);
+ compare(detailFieldFilter.detail, data.testValue);
+ // change without change
+ detailFieldFilter.detail = data.testValue;
+ compare(valueChangedSpy.count, 1);
+ compare(filterChangedSpy.count, 1);
+ compare(detailFieldFilter.detail, data.testValue);
+ }
+
+ // field API
+ function test_field_data() {
+ return [
+ {tag: "empty field", testValue: -1},
+ {tag: "enum field", testValue: Type.FieldType},
+ ]
+ }
+ function test_field(data) {
+ var detailFieldFilter = create_detailFieldFilter();
+ var valueChangedSpy = create_spy(detailFieldFilter, "valueChanged");
+ var filterChangedSpy = create_spy(detailFieldFilter, "filterChanged");
+ // change
+ detailFieldFilter.field = data.testValue;
+ compare(valueChangedSpy.count, data.testValue == -1 ? 0 : 1);
+ compare(filterChangedSpy.count, data.testValue == -1 ? 0 : 1);
+ compare(detailFieldFilter.field, data.testValue);
+ // change without change
+ detailFieldFilter.field = data.testValue;
+ compare(valueChangedSpy.count, data.testValue == -1 ? 0 : 1);
+ compare(filterChangedSpy.count, data.testValue == -1 ? 0 : 1);
+ compare(detailFieldFilter.field, data.testValue);
+ }
+
+
+ // value API
+ function test_value_data() {
+ return [
+ {tag: "empty value", testValue: ""},
+ {tag: "string value", testValue: "something"},
+ {tag: "numeric detail", testValue: 42},
+ // do not fully trust to date test, since java layer is doing also some conversions
+ {tag: "date value", testValue: new Date("2010-10-23T15:48:00")}
+ ]
+ }
+ function test_value(data) {
+ var detailFieldFilter = create_detailFieldFilter();
+ var valueChangedSpy = create_spy(detailFieldFilter, "valueChanged");
+ var filterChangedSpy = create_spy(detailFieldFilter, "filterChanged");
+ // change
+ detailFieldFilter.value = data.testValue;
+ compare(valueChangedSpy.count, 1);
+ compare(filterChangedSpy.count, 1);
+ compare(detailFieldFilter.value, data.testValue);
+ // change without change
+ detailFieldFilter.value = data.testValue;
+ compare(valueChangedSpy.count, 1);
+ compare(filterChangedSpy.count, 1);
+ compare(detailFieldFilter.value, data.testValue);
+ }
+
+ // matchflags API - single key
+ function test_matchflags_singlekey_data() {
+ return [
+ {tag: "MatchExactly", key: Filter.MatchExactly},
+ {tag: "MatchContains", key: Filter.MatchContains},
+ {tag: "MatchStartsWith", key: Filter.MatchStartsWith},
+ {tag: "MatchEndsWith", key: Filter.MatchEndsWith},
+ {tag: "MatchFixedString", key: Filter.MatchFixedString},
+ {tag: "MatchCaseSensitive", key: Filter.MatchCaseSensitive}
+ ]
+ }
+ function test_matchflags_singlekey(data) {
+ var detailFieldFilter = create_detailFieldFilter();
+ var valueChangedSpy = create_spy(detailFieldFilter, "valueChanged");
+ var filterChangedSpy = create_spy(detailFieldFilter, "filterChanged");
+
+ var initialKey = detailFieldFilter.matchFlags;
+ compare(initialKey, Filter.MatchExactly);
+ var initialEqualsTestedKey = data.key == initialKey;
+
+ // change
+ detailFieldFilter.matchFlags = data.key
+ compare(valueChangedSpy.count, initialEqualsTestedKey ? 0 : 1);
+ compare(filterChangedSpy.count, initialEqualsTestedKey ? 0 : 1);
+ compare(detailFieldFilter.matchFlags, data.key);
+ // change without change
+ detailFieldFilter.matchFlags = data.key;
+ compare(valueChangedSpy.count, initialEqualsTestedKey ? 0 : 1);
+ compare(filterChangedSpy.count, initialEqualsTestedKey ? 0 : 1);
+ compare(detailFieldFilter.matchFlags, data.key);
+ }
+
+ // matchflags API - combined key
+ function test_matchflags_combinedkey_data() {
+ return [
+ {tag: "same keys - MatchExactly", key1: Filter.MatchExactly, key2: Filter.MatchExactly},
+ {tag: "same keys - MatchContains", key1: Filter.MatchContains, key2: Filter.MatchContains},
+ {tag: "different keys - MatchExactly & MatchEndsWith", key1: Filter.MatchExactly, key2: Filter.MatchEndsWith},
+ {tag: "different keys - MatchCaseSensitive & MatchContains", key1: Filter.MatchCaseSensitive, key2: Filter.MatchContains}
+ ]
+ }
+ function test_matchflags_combinedkey(data) {
+ var detailFieldFilter = create_detailFieldFilter();
+ var valueChangedSpy = create_spy(detailFieldFilter, "valueChanged");
+ var filterChangedSpy = create_spy(detailFieldFilter, "filterChanged");
+
+ var initialKey = detailFieldFilter.matchFlags;
+ var combinedKey = data.key1 | data.key2;
+ var initialEqualsCombinedKey = initialKey == combinedKey;
+
+ // change - combined key
+ detailFieldFilter.matchFlags = combinedKey;
+ compare(valueChangedSpy.count, initialEqualsCombinedKey ? 0 : 1);
+ compare(filterChangedSpy.count, initialEqualsCombinedKey ? 0 : 1);
+ compare(detailFieldFilter.matchFlags, combinedKey);
+ }
+
+ // FILTERING TESTS
+
+ function filterTestItems() {
+ return [
+ // events
+ "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Event {\n"
+ + " startDateTime:'2011-10-25'\n"
+ + " endDateTime:'2011-10-26'\n"
+ + " description: 'just basic event'\n"
+ + " }",
+ "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Event {\n"
+ + " startDateTime: new Date('2011-10-23T16:42:00')\n" //notice, date-object
+ + " endDateTime: new Date('2011-10-23T17:42:00')\n" //notice, date-object
+ + " description: 'for exact filter - EventTime.StartDateTime'\n"
+ + " }",
+ "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Event {\n"
+ + " startDateTime: '2011-09-23T16:42:00'\n" //notice, string to date-object
+ + " endDateTime: new Date('2011-10-23T21:00:00')\n"
+ + " description: 'for exact filter - EventTime.EndDateTime'\n"
+ + " }",
+ "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Event {\n"
+ + " startDateTime: '2011-10-23T15:00:00'\n"
+ + " endDateTime: '2011-10-23T16:00:00'\n"
+ + " allDay: true\n"
+ + " description: 'for exact filter - EventTime.AllDayEvent'\n"
+ + " }",
+ "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Event {\n"
+ + " startDateTime:'2011-10-23T15:00:00'\n"
+ + " endDateTime: '2011-11-23T16:00:00'\n"
+ + " description: 'for exact filter - Description'\n"
+ + " }",
+ "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Event {\n"
+ + " startDateTime:'2011-10-23T15:00:00Z'\n"
+ + " endDateTime: '2011-11-23T16:00:00'\n"
+ + " displayLabel: 'my displayLabel'\n"
+ + " description: 'for exact filter - DisplayLabel'\n"
+ + " }",
+ "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Event {\n"
+ + " startDateTime:'2011-10-23T15:00:00Z'\n"
+ + " endDateTime: '2011-11-23T16:00:00'\n"
+ + " guid: 'my guid'\n"
+ + " description: 'for exact filter - Guid'\n"
+ + " }",
+ "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Event {\n"
+ + " startDateTime:'2011-10-23T15:00:00Z'\n"
+ + " endDateTime: '2011-11-23T16:00:00'\n"
+ + " location: 'my location'\n"
+ + " description: 'for exact filter - Location'\n"
+ + " }",
+ "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Event {\n"
+ + " startDateTime:'2011-10-23T15:00:00Z'\n"
+ + " endDateTime: '2011-11-23T16:00:00'\n"
+ + " priority: Priority.VeryHigh\n"
+ + " description: 'for exact filter - Priority'\n"
+ + " }",
+ // todos
+ "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Todo {\n"
+ + " dueDateTime:'2010-10-23T15:00:00Z'\n"
+ + " status:TodoProgress.InProgress\n"
+ + " percentageComplete:89\n"
+ + " description: 'for exact filter - Type'\n"
+ + " }",
+ "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Todo {\n"
+ + " startDateTime: new Date('2010-10-23T15:48:00')\n"
+ + " percentageComplete:89\n"
+ + " description: 'for exact filter - TodoTime.StartDateTime'\n"
+ + " }",
+ "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Todo {\n"
+ + " startDateTime:new Date('2010-10-22T15:47:00')\n"
+ + " dueDateTime: new Date('2010-10-25T15:49:00')\n"
+ + " description: 'for exact filter - TodoTime.DueDateTime'\n"
+ + " }",
+ "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Todo {\n"
+ + " startDateTime:new Date('2010-10-22T15:50:00')\n"
+ + " description: 'for exact filter - TodoTime.AllDay'\n"
+ + " allDay: true\n"
+ + " }",
+ ]
+ }
+
+ function test_filtering_data() {
+ return [
+ {tag: "no filter", expectedItemsAmount: filterTestItems().length },
+ {tag: "exact filter - EventTime.StartDateTime", expectedItemsAmount: 1,
+ filterDetail: Detail.EventTime, filterField: EventTime.FieldStartDateTime, filterValue: new Date("2011-10-23T16:42:00")},//notice, date-object
+ {tag: "exact filter - EventTime.EndDateTime", expectedItemsAmount: 1,
+ filterDetail: Detail.EventTime, filterField: EventTime.FieldEndDateTime, filterValue: new Date("2011-10-23T21:00:00")},
+ {tag: "exact filter - EventTime.AllDayEvent", expectedItemsAmount: 1, expectedItemsAmount_Jsondb: 2,
+ filterDetail: Detail.EventTime, filterField: EventTime.FieldAllDay, filterValue: true},
+ {tag: "exact filter - TodoTime.StartDateTime", expectedItemsAmount: 1,
+ filterDetail: Detail.TodoTime, filterField: TodoTime.FieldStartDateTime, filterValue: new Date("2010-10-23T15:48:00")},
+ {tag: "exact filter - TodoTime.DueDateTime", expectedItemsAmount: 1,
+ filterDetail: Detail.TodoTime, filterField: TodoTime.FieldDueDateTime, filterValue: new Date("2010-10-25T15:49:00")},
+ {tag: "exact filter - TodoTime.AllDay", expectedItemsAmount: 1, expectedItemsAmount_Jsondb: 2,
+ filterDetail: Detail.TodoTime, filterField: TodoTime.FieldAllDay, filterValue: true},
+ {tag: "exact filter - TodoProgress.Status", expectedItemsAmount: 1,
+ filterDetail: Detail.TodoProgress, filterField: TodoProgress.FieldStatus, filterValue: TodoProgress.InProgress},
+ {tag: "exact filter - TodoProgress.PercentageComplete", expectedItemsAmount: 2,
+ filterDetail: Detail.TodoProgress, filterField: TodoProgress.FieldPercentageComplete, filterValue: 89},
+ {tag: "exact filter - Comment", expectedItemsAmount: 1,
+ filterDetail: Detail.Comment, filterField: Comment.FieldComment, filterValue: "my comment",
+ separateDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Comment {\n"
+ + " comment: 'my comment'\n"
+ + " }"},
+ {tag: "exact filter - Description", expectedItemsAmount: 1,
+ filterDetail: Detail.Description, filterField: Description.FieldDescription, filterValue: "for exact filter - Description"},
+ {tag: "exact filter - DisplayLabel", expectedItemsAmount: 1,
+ filterDetail: Detail.DisplayLabel, filterField: DisplayLabel.FieldLabel, filterValue: "my displayLabel"},
+ {tag: "exact filter - Guid", expectedItemsAmount: 1,
+ filterDetail: Detail.Guid, filterField: Guid.FieldGuid, filterValue: "my guid"},
+ {tag: "exact filter - Location.Label", expectedItemsAmount: 1,
+ filterDetail: Detail.Location, filterField: Location.FieldLabel, filterValue: "my location"},
+ {tag: "exact filter - Location.Longitude", expectedItemsAmount: 1,
+ filterDetail: Detail.Location, filterField: Location.FieldLongitude, filterValue: 12345.12345,
+ separateDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Location {\n"
+ + " label: 'my place'\n"
+ + " longitude: 12345.12345\n"
+ + " }"},
+ {tag: "exact filter - Location.Latitude", expectedItemsAmount: 1,
+ filterDetail: Detail.Location, filterField: Location.FieldLatitude, filterValue: 54321.54321,
+ separateDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Location {\n"
+ + " label: 'my 2nd place'\n"
+ + " latitude: 54321.54321\n"
+ + " }"},
+ {tag: "exact filter - Priority", expectedItemsAmount: 1,
+ filterDetail: Detail.Priority, filterField: Priority.FieldPriority, filterValue: Priority.VeryHigh},
+ {tag: "exact filter - Type enum", expectedItemsAmount: 4,//amount of todos
+ filterDetail: Detail.ItemType, filterField: Type.FieldType, filterValue: Type.Todo},
+ {tag: "exact filter - Tag", expectedItemsAmount: 1,
+ filterDetail: Detail.Tag, filterField: Tag.FieldTag, filterValue: "my tag",
+ separateDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Tag {\n"
+ + " tag: 'my tag'\n"
+ + " }"},
+ {tag: "exact filter - ExtendedDetail", expectedItemsAmount: 1,
+ filterDetail: Detail.ExtendedDetail, filterField: ExtendedDetail.FieldName, filterValue: "myField",
+ separateDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " ExtendedDetail {\n"
+ + " name: 'myField'\n"
+ + " data: 42\n"
+ + " }"},
+ {tag: "exact filter - EventRsvp.ParticipationStatus", expectedItemsAmount: 1,
+ filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldParticipationStatus, filterValue: EventAttendee.StatusAccepted,
+ separateDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " EventRsvp {\n"
+ + " participationStatus: EventAttendee.StatusAccepted\n"
+ + " }"},
+ {tag: "exact filter - EventRsvp.ParticipationRole", expectedItemsAmount: 1,
+ filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldParticipationRole, filterValue: EventAttendee.RoleHost,
+ separateDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " EventRsvp {\n"
+ + " participationRole: EventAttendee.RoleHost\n"
+ + " }"},
+ {tag: "exact filter - EventRsvp.ResponseRequirement", expectedItemsAmount: 1,
+ filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldResponseRequirement, filterValue: EventRsvp.ResponseRequired,
+ separateDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " EventRsvp {\n"
+ + " responseRequirement: EventRsvp.ResponseRequired\n"
+ + " }"},
+ {tag: "exact filter - EventRsvp.ResponseDeadline", expectedItemsAmount: 1,
+ filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldResponseDeadline, filterValue: new Date("2008-12-28"),
+ separateDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " EventRsvp {\n"
+ + " responseDeadline: new Date(\"2008-12-28\")\n"
+ + " }"},
+ {tag: "exact filter - EventRsvp.ResponseDate", expectedItemsAmount: 1,
+ filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldResponseDate, filterValue: new Date("2008-12-28"),
+ separateDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " EventRsvp {\n"
+ + " responseDate: new Date(\"2008-12-28\")\n"
+ + " }"},
+ {tag: "exact filter - EventRsvp.OrganizerName", expectedItemsAmount: 1,
+ filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldOrganizerName, filterValue: "QtPim",
+ separateDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " EventRsvp {\n"
+ + " organizerName: \"QtPim\"\n"
+ + " }"},
+ {tag: "exact filter - EventRsvp.OrganizerEmail", expectedItemsAmount: 1,
+ filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldOrganizerEmail, filterValue: "pim@qt-project.org",
+ separateDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " EventRsvp {\n"
+ + " organizerEmail: \"pim@qt-project.org\"\n"
+ + " }"}
+ ]
+ }
+
+ function test_filtering(data) {
+ //preparations
+ var managers = utility.getManagerList();
+ for (var i=0;i<managers.length;i++) {
+
+ var managerToBeTested = managers[i];
+ console.log("## Testing plugin: " + managerToBeTested);
+ organizerModel = createModel(managerToBeTested);
+
+ addEventsToModel(filterTestItems());
+ compare(organizerModel.items.length, filterTestItems().length);
+
+ if (data.separateDetailCtrStr) {
+ addDetailWithoutConvenienceAPI(data.separateDetailCtrStr);
+ }
+ if (data.tag != "no filter") {
+ applyFilter(data);
+ wait(spyWaitDelay);
+
+ //console.log("organizerModel.filter: "+ organizerModel.filter.detail + "/" + organizerModel.filter.field + "/" + organizerModel.filter.value)
+ //console.log("filtered amount: " + organizerModel.items.length);
+ }
+
+ if (managerToBeTested == "jsondb" ) {
+ // in some cases the stored details are utilising the same field on the backend, which means the amount of matches to be different
+ compare(organizerModel.items.length, data.expectedItemsAmount_Jsondb ? data.expectedItemsAmount_Jsondb : data.expectedItemsAmount);
+ } else {
+ compare(organizerModel.items.length, data.expectedItemsAmount);
+ }
+
+ organizerModel.destroy();
+ }
+ }
+
+ // FILTERING MATCHFLAG TESTS
+
+ function matchflagTestItems() {
+ return [
+ "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Event {\n"
+ + " startDateTime:new Date('2010-10-20')\n"
+ + " endDateTime:new Date('2010-10-21')\n"
+ + " description: 'aa bb cc'\n"
+ + " EventRsvp {\n"
+ + " organizerName: 'QtPim'\n"
+ + " organizerEmail: 'pim@qt-project.org'\n"
+ + " }"
+ + " }",
+ "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Event {\n"
+ + " startDateTime:new Date('2011-10-22')\n"
+ + " endDateTime:new Date('2011-10-23')\n"
+ + " description: 'bB cc dd'\n"
+ + " EventRsvp {\n"
+ + " organizerName: 'random organizer name'\n"
+ + " organizerEmail: 'random organizer email'\n"
+ + " }"
+ + " }",
+ "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Todo {\n"
+ + " dueDateTime:new Date('2010-12-22')\n"
+ + " description: 'cc dd ee'\n"
+ + " }"
+ ]
+ }
+
+ function test_matchflags_data() {
+ return [
+ {tag: "Filter set, Description - MatchExactly", expectedItemsAmount: 1,
+ filterDetail: Detail.Description, filterField: Description.FieldDescription, filterValue: "aa bb cc",
+ matchFlags: Filter.MatchExactly},
+ {tag: "Filter set, Description - MatchFixedString", expectedItemsAmount: 0,
+ filterDetail: Detail.Description, filterField: Description.FieldDescription, filterValue: "bb",
+ matchFlags: Filter.MatchEndsWith | Filter.MatchFixedString},
+ {tag: "Filter set, Description - MatchContains case insensitive", expectedItemsAmount: 2,
+ filterDetail: Detail.Description, filterField: Description.FieldDescription, filterValue: "bb",
+ matchFlags: Filter.MatchContains},
+ {tag: "Filter set, Description - MatchContains case sensitive", expectedItemsAmount: 1,
+ filterDetail: Detail.Description, filterField: Description.FieldDescription, filterValue: "bb",
+ matchFlags: Filter.MatchContains | Filter.MatchCaseSensitive},
+ {tag: "Filter set, Description - MatchStartsWith", expectedItemsAmount: 1,
+ filterDetail: Detail.Description, filterField: Description.FieldDescription, filterValue: "bb",
+ matchFlags: Filter.MatchStartsWith},
+ {tag: "Filter set, Description - MatchEndsWith", expectedItemsAmount: 1,
+ filterDetail: Detail.Description, filterField: Description.FieldDescription, filterValue: "ee",
+ matchFlags: Filter.MatchEndsWith},
+ {tag: "Filter set, Comment - MatchExactly", expectedItemsAmount: 1,
+ filterDetail: Detail.Comment, filterField: Comment.FieldComment, filterValue: "my great comment",
+ matchFlags: Filter.MatchExactly,
+ separateDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Comment {\n"
+ + " comment: 'my great comment'\n"
+ + " }"},
+ {tag: "Filter set, Comment - MatchStartsWith", expectedItemsAmount: 1,
+ filterDetail: Detail.Comment, filterField: Comment.FieldComment, filterValue: "my",
+ matchFlags: Filter.MatchStartsWith,
+ // jsondb, depends on detail created in previous data set
+ // mem, needs to create again
+ separateDetailCtrStrMemory: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Comment {\n"
+ + " comment: 'my great comment'\n"
+ + " }"},
+ {tag: "Filter set, Comment - MatchContains", expectedItemsAmount: 1,
+ filterDetail: Detail.Comment, filterField: Comment.FieldComment, filterValue: "great",
+ matchFlags: Filter.MatchContains,
+ // jsondb, depends on detail created in previous data set
+ // mem, needs to create again
+ separateDetailCtrStrMemory: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Comment {\n"
+ + " comment: 'my great comment'\n"
+ + " }"},
+ {tag: "Filter set, Comment - MatchEndsWith", expectedItemsAmount: 1,
+ filterDetail: Detail.Comment, filterField: Comment.FieldComment, filterValue: "comment",
+ matchFlags: Filter.MatchEndsWith,
+ // jsondb, depends on detail created in previous data set
+ // mem, needs to create again
+ separateDetailCtrStrMemory: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Comment {\n"
+ + " comment: 'my great comment'\n"
+ + " }"},
+ {tag: "Filter set, Tag - MatchContains", expectedItemsAmount: 1,
+ filterDetail: Detail.Tag, filterField: Tag.FieldTag, filterValue: "excellent",
+ matchFlags: Filter.MatchContains,
+ separateDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Tag {\n"
+ + " tag: 'my excellent tag'\n"
+ + " }"},
+ {tag: "Filter set, Description - tighten filter", expectedItemsAmount: 2,
+ filterDetail: Detail.Description, filterField: Description.FieldDescription, filterValue: "bb",
+ matchFlags: Filter.MatchContains, matchFlagsTighter: Filter.MatchContains | Filter.MatchCaseSensitive},
+ {tag: "Filter set, EventRsvp.OrganizerName - MatchExactly", expectedItemsAmount: 1,
+ filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldOrganizerName, filterValue: "QtPim",
+ matchFlags: Filter.MatchExactly},
+ {tag: "Filter set, EventRsvp.OrganizerName - MatchStartsWith", expectedItemsAmount: 1,
+ filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldOrganizerName, filterValue: "Qt",
+ matchFlags: Filter.MatchStartsWith},
+ {tag: "Filter set, EventRsvp.OrganizerName - MatchContains", expectedItemsAmount: 1,
+ filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldOrganizerName, filterValue: "tP",
+ matchFlags: Filter.MatchContains},
+ {tag: "Filter set, EventRsvp.OrganizerName - MatchEndsWith", expectedItemsAmount: 1,
+ filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldOrganizerName, filterValue: "im",
+ matchFlags: Filter.MatchEndsWith},
+ {tag: "Filter set, EventRsvp.OrganizerEmail - MatchExactly", expectedItemsAmount: 1,
+ filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldOrganizerEmail, filterValue: "pim@qt-project.org",
+ matchFlags: Filter.MatchExactly},
+ {tag: "Filter set, EventRsvp.OrganizerEmail - MatchStartsWith", expectedItemsAmount: 1,
+ filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldOrganizerEmail, filterValue: "pim",
+ matchFlags: Filter.MatchStartsWith},
+ {tag: "Filter set, EventRsvp.OrganizerEmail - MatchContains", expectedItemsAmount: 1,
+ filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldOrganizerEmail, filterValue: "@qt-",
+ matchFlags: Filter.MatchContains},
+ {tag: "Filter set, EventRsvp.OrganizerEmail - MatchEndsWith", expectedItemsAmount: 1,
+ filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldOrganizerEmail, filterValue: ".org",
+ matchFlags: Filter.MatchEndsWith}
+ ]
+ }
+
+ function test_matchflags(data) {
+ //preparations
+ var managers = utility.getManagerList();
+
+ for (var i=0;i<managers.length;i++) {
+
+ var managerToBeTested = managers[i];
+ console.log("## Testing plugin: " + managerToBeTested);
+ organizerModel = createModel(managerToBeTested);
+
+ addEventsToModel(matchflagTestItems());
+ compare(organizerModel.items.length, matchflagTestItems().length);
+
+ // for all backends
+ if (data.separateDetailCtrStr) {
+ addDetailWithoutConvenienceAPI(data.separateDetailCtrStr);
+ }
+ // for memory backend tests
+ if (data.separateDetailCtrStrMemory && managerToBeTested == "memory") {
+ addDetailWithoutConvenienceAPI(data.separateDetailCtrStrMemory);
+ }
+
+ applyFilter(data);
+ wait(spyWaitDelay);
+
+ //console.log("organizerModel.filter: "+ organizerModel.filter.detail + "/" + organizerModel.filter.field + "/" + organizerModel.filter.value + "/" + organizerModel.filter.matchFlags)
+ //console.log("filtered amount: " + organizerModel.items.length);
+ expectFail("Filter set, Comment - MatchStartsWith", "\nNot working before indexing starts to work");
+ expectFail("Filter set, Comment - MatchContains", "\nNot working before indexing starts to work");
+ expectFail("Filter set, Comment - MatchEndsWith", "\nNot working before indexing starts to work");
+ expectFail("Filter set, Tag - MatchContains", "\nNot working before indexing starts to work");
+ compare(organizerModel.items.length, data.expectedItemsAmount);
+
+ if (data.matchFlagsTighter) {
+ // testing the case where we have had a filter and then were making the filtering rules tighter
+ var filterChangedSpy = create_spy(organizerModel, "filterChanged");
+ organizerModel.filter.matchFlags = data.matchFlagsTighter;
+ filterChangedSpy.wait();
+ wait(spyWaitDelay);
+ compare(organizerModel.items.length, data.expectedItemsAmount - 1);
+ }
+
+ organizerModel.destroy();
+ }
+ }
+
+ function test_errors_data() {
+ return [
+ // filtering certain details/definitions are currently not supported
+ {tag: "Unsupported details, JournalTime", filterDetail: Detail.JournalTime },
+ {tag: "Unsupported details, Reminder", filterDetail: Detail.Reminder },
+ {tag: "Unsupported details, AudibleReminder", filterDetail: Detail.AudibleReminder },
+ {tag: "Unsupported details, VisualReminder", filterDetail: Detail.VisualReminder },
+ {tag: "Unsupported details, EmailReminder", filterDetail: Detail.EmailReminder },
+ {tag: "Unsupported details, Parent", filterDetail: Detail.Parent },
+ {tag: "Unsupported details, Recurrence", filterDetail: Detail.Recurrence },
+ {tag: "Unsupported details, Timestamp", filterDetail: Detail.Timestamp },
+ // filtering matchflags are not supported for all the types
+ {tag: "Unsupported matchflag, EventTime", filterDetail: Detail.EventTime, matchFlags: Filter.MatchContains },
+ {tag: "Unsupported matchflag, TodoTime", filterDetail: Detail.TodoTime, matchFlags: Filter.MatchStartsWith },
+ {tag: "Unsupported matchflag, TodoProgress", filterDetail: Detail.TodoProgress, matchFlags: Filter.MatchStartsWith },
+ {tag: "Unsupported matchflag, Comment", filterDetail: Detail.Comment, matchFlags: Filter.MatchContains },
+ {tag: "Unsupported matchflag, Location - Longitude", filterDetail: Detail.Location,
+ filterField: Location.FieldLongitude, matchFlags: Filter.MatchEndsWith },
+ {tag: "Unsupported matchflag, Location - Latitude", filterDetail: Detail.Location,
+ filterField: Location.FieldLatitude, matchFlags: Filter.MatchEndsWith },
+ {tag: "Unsupported matchflag, Priority", filterDetail: Detail.Priority, matchFlags: Filter.MatchStartsWith },
+ {tag: "Unsupported matchflag, Type", filterDetail: Detail.ItemType, matchFlags: Filter.MatchFixedString },
+ {tag: "Unsupported matchflag, Tag", filterDetail: Detail.Tag, matchFlags: Filter.MatchCaseSensitive },
+ {tag: "Unsupported matchflag, ExtendedDetail", filterDetail: Detail.ExtendedDetail, matchFlags: Filter.MatchFixedString },
+ // filtering with QString needs extra attention, not allowed for all the types
+ {tag: "Unsupported string value, EventTime - StartDateTime",
+ filterDetail: Detail.EventTime, filterField: EventTime.FieldStartDateTime, filterValue: "mystringie" },
+ {tag: "Unsupported string value, EventTime - EndDateTime",
+ filterDetail: Detail.EventTime, filterField: EventTime.FieldEndDateTime, filterValue: "mystringie" },
+ {tag: "Unsupported string value, EventTime - AllDay",
+ filterDetail: Detail.EventTime, filterField: EventTime.FieldAllDay, filterValue: "mystringie" },
+ {tag: "Unsupported string value, JournalTime - EntryDateTime",
+ filterDetail: Detail.JournalTime, filterField: Journal.FieldEntryDateTime, filterValue: "mystringie" },
+ {tag: "Unsupported string value, TodoTime - StartDateTime",
+ filterDetail: Detail.TodoTime, filterField: TodoTime.FieldStartDateTime, filterValue: "mystringie" },
+ {tag: "Unsupported string value, TodoTime - DueDateTime",
+ filterDetail: Detail.TodoTime, filterField: TodoTime.FieldDueDateTime, filterValue: "mystringie" },
+ {tag: "Unsupported string value, TodoTime - AllDay",
+ filterDetail: Detail.TodoTime, filterField: TodoTime.FieldAllDay, filterValue: "mystringie" },
+ {tag: "Unsupported string value, TodoProgress - FinishedDateTime",
+ filterDetail: Detail.TodoProgress, filterField: TodoProgress.FieldFinishedDateTime, filterValue: "mystringie" },
+ {tag: "Unsupported string value, TodoProgress - Status",
+ filterDetail: Detail.TodoProgress, filterField: TodoProgress.FieldStatus, filterValue: "mystringie" },
+ {tag: "Unsupported string value, TodoProgress - PercentageComplete",
+ filterDetail: Detail.TodoProgress, filterField: TodoProgress.FieldPercentageComplete, filterValue: "mystringie" },
+ // missing all different Reminders -details/fields (tested already on Unsupported details-part)
+ {tag: "Unsupported string value, Location - Longitude",
+ filterDetail: Detail.Location, filterField: Location.FieldLongitude, filterValue: "mystringie" },
+ {tag: "Unsupported string value, Location - Latitude",
+ filterDetail: Detail.Location, filterField: Location.FieldLatitude, filterValue: "mystringie" },
+ // missing Parent-detail/field (tested already on Unsupported details-part)
+ {tag: "Unsupported string value, Priority",
+ filterDetail: Detail.Priority, filterField: Priority.FieldPriority, filterValue: "mystringie" },
+ // missing Recurrence-, TimeStamp-details/fields (tested already on Unsupported details-part)
+ ]
+ }
+
+ function test_errors(data) {
+ console.log();
+ //preparations
+ // error codes are backend specific, these are tested only for jsondb
+ organizerModel = createModel("jsondb")
+
+ var errorChangedSpy = create_spy(organizerModel, "errorChanged");
+ applyFilter(data);
+ errorChangedSpy.wait();
+ wait(50);//why needed?
+
+ compare(organizerModel.error, "BadArgument");
+ organizerModel.destroy();
+ }
+
+ function cleanup() {
+ // Sometimes ModelChanged signal is not emitted when creating a model
+ // in beginning of a test case if there's no wait between tests.
+ // TODO: why?
+ wait(10);
+ }
+
+}
diff --git a/tests/auto/organizer/qmlorganizer/testcases/tst_detailfilter.qml b/tests/auto/organizer/qmlorganizer/testcases/tst_detailfilter.qml
index 0d07989b8..060ce43a2 100644
--- a/tests/auto/organizer/qmlorganizer/testcases/tst_detailfilter.qml
+++ b/tests/auto/organizer/qmlorganizer/testcases/tst_detailfilter.qml
@@ -44,7 +44,7 @@ import QtTest 1.0
import QtOrganizer 5.0
TestCase {
- name: "DetailFilterTests"
+ name: "detailFilterTests"
id: detailFilterTests
property OrganizerModel organizerModel;
@@ -108,18 +108,13 @@ TestCase {
detailEvent.setDetail(detail);
organizerModel.saveItem(detailEvent);
modelChangedSpy.wait();
+ return detail;
}
- function applyFilter(data) {
+ function applyFilter(detailToMatch) {
var filterChangedSpy = create_spy(organizerModel, "filterChanged");
var filter = create_detailFilter();
- filter.detail = data.filterDetail;
- if (data.filterField != undefined)
- filter.field = data.filterField;
- if (data.filterValue != undefined)
- filter.value = data.filterValue;
- if (data.matchFlags != undefined)
- filter.matchFlags = data.matchFlags
+ filter.detail = detailToMatch;
compare(organizerModel.error, "NoError");
organizerModel.filter = filter;
filterChangedSpy.wait();
@@ -152,149 +147,54 @@ TestCase {
+ "import QtOrganizer 5.0\n"
+ "DetailFilter {\n"
+ "id: testDetailFilter\n"
- + "detail:Detail.Description\n"
- + "field:Description.FieldDescription\n"
- + "value: 'my value'\n"
- + "matchFlags: Filter.MatchContains\n"
+ + "detail: Description {\n"
+ + "description: 'my value'\n"
+ + "}\n"
+ "}\n"
}
]
}
function test_creation(data) {
console.log("");//to print out test tags for every data set
- var newDetailFilter = create_testobject(data.code, detailFilterTests);
+ var newDetailFieldFilter = create_testobject(data.code, detailFilterTests);
}
// detail API
function test_detail_data() {
return [
- {tag: "empty field", testValue: -1},
- {tag: "enum detail", testValue: Detail.Priority}
+ {tag: "empty detail filter",
+ code: "import QtQuick 2.0 \n"
+ + "import QtOrganizer 5.0\n"
+ + "Description {\n"
+ + "}\n"
+ },
+ {tag: "valid detail",
+ code: "import QtQuick 2.0 \n"
+ + "import QtOrganizer 5.0\n"
+ + "Description {\n"
+ + "description: 'my value'\n"
+ + "}\n"
+ }
]
}
function test_detail(data) {
- var detailFilter = create_detailFilter();
- var valueChangedSpy = create_spy(detailFilter, "valueChanged");
- var filterChangedSpy = create_spy(detailFilter, "filterChanged");
+ var newDetailToMatch = create_testobject(data.code, detailFilterTests);
+ var newDetailFilter = create_detailFilter();
+ var valueChangedSpy = create_spy(newDetailFilter, "valueChanged");
+ var filterChangedSpy = create_spy(newDetailFilter, "filterChanged");
// change
- detailFilter.detail = data.testValue;
+ newDetailFilter.detail = newDetailToMatch;
compare(valueChangedSpy.count, 1);
compare(filterChangedSpy.count, 1);
- compare(detailFilter.detail, data.testValue);
+ compare(newDetailFilter.detail, newDetailToMatch);
// change without change
- detailFilter.detail = data.testValue;
+ newDetailFilter.detail = newDetailToMatch;
compare(valueChangedSpy.count, 1);
compare(filterChangedSpy.count, 1);
- compare(detailFilter.detail, data.testValue);
- }
-
- // field API
- function test_field_data() {
- return [
- {tag: "empty field", testValue: -1},
- {tag: "enum field", testValue: Type.FieldType},
- ]
- }
- function test_field(data) {
- var detailFilter = create_detailFilter();
- var valueChangedSpy = create_spy(detailFilter, "valueChanged");
- var filterChangedSpy = create_spy(detailFilter, "filterChanged");
- // change
- detailFilter.field = data.testValue;
- compare(valueChangedSpy.count, data.testValue == -1 ? 0 : 1);
- compare(filterChangedSpy.count, data.testValue == -1 ? 0 : 1);
- compare(detailFilter.field, data.testValue);
- // change without change
- detailFilter.field = data.testValue;
- compare(valueChangedSpy.count, data.testValue == -1 ? 0 : 1);
- compare(filterChangedSpy.count, data.testValue == -1 ? 0 : 1);
- compare(detailFilter.field, data.testValue);
+ compare(newDetailFilter.detail, newDetailToMatch);
}
- // value API
- function test_value_data() {
- return [
- {tag: "empty value", testValue: ""},
- {tag: "string value", testValue: "something"},
- {tag: "numeric detail", testValue: 42},
- // do not fully trust to date test, since java layer is doing also some conversions
- {tag: "date value", testValue: new Date("2010-10-23T15:48:00")}
- ]
- }
- function test_value(data) {
- var detailFilter = create_detailFilter();
- var valueChangedSpy = create_spy(detailFilter, "valueChanged");
- var filterChangedSpy = create_spy(detailFilter, "filterChanged");
- // change
- detailFilter.value = data.testValue;
- compare(valueChangedSpy.count, 1);
- compare(filterChangedSpy.count, 1);
- compare(detailFilter.value, data.testValue);
- // change without change
- detailFilter.value = data.testValue;
- compare(valueChangedSpy.count, 1);
- compare(filterChangedSpy.count, 1);
- compare(detailFilter.value, data.testValue);
- }
-
- // matchflags API - single key
- function test_matchflags_singlekey_data() {
- return [
- {tag: "MatchExactly", key: Filter.MatchExactly},
- {tag: "MatchContains", key: Filter.MatchContains},
- {tag: "MatchStartsWith", key: Filter.MatchStartsWith},
- {tag: "MatchEndsWith", key: Filter.MatchEndsWith},
- {tag: "MatchFixedString", key: Filter.MatchFixedString},
- {tag: "MatchCaseSensitive", key: Filter.MatchCaseSensitive}
- ]
- }
- function test_matchflags_singlekey(data) {
- var detailFilter = create_detailFilter();
- var valueChangedSpy = create_spy(detailFilter, "valueChanged");
- var filterChangedSpy = create_spy(detailFilter, "filterChanged");
-
- var initialKey = detailFilter.matchFlags;
- compare(initialKey, Filter.MatchExactly);
- var initialEqualsTestedKey = data.key == initialKey;
-
- // change
- detailFilter.matchFlags = data.key
- compare(valueChangedSpy.count, initialEqualsTestedKey ? 0 : 1);
- compare(filterChangedSpy.count, initialEqualsTestedKey ? 0 : 1);
- compare(detailFilter.matchFlags, data.key);
- // change without change
- detailFilter.matchFlags = data.key;
- compare(valueChangedSpy.count, initialEqualsTestedKey ? 0 : 1);
- compare(filterChangedSpy.count, initialEqualsTestedKey ? 0 : 1);
- compare(detailFilter.matchFlags, data.key);
- }
-
- // matchflags API - combined key
- function test_matchflags_combinedkey_data() {
- return [
- {tag: "same keys - MatchExactly", key1: Filter.MatchExactly, key2: Filter.MatchExactly},
- {tag: "same keys - MatchContains", key1: Filter.MatchContains, key2: Filter.MatchContains},
- {tag: "different keys - MatchExactly & MatchEndsWith", key1: Filter.MatchExactly, key2: Filter.MatchEndsWith},
- {tag: "different keys - MatchCaseSensitive & MatchContains", key1: Filter.MatchCaseSensitive, key2: Filter.MatchContains}
- ]
- }
- function test_matchflags_combinedkey(data) {
- var detailFilter = create_detailFilter();
- var valueChangedSpy = create_spy(detailFilter, "valueChanged");
- var filterChangedSpy = create_spy(detailFilter, "filterChanged");
-
- var initialKey = detailFilter.matchFlags;
- var combinedKey = data.key1 | data.key2;
- var initialEqualsCombinedKey = initialKey == combinedKey;
-
- // change - combined key
- detailFilter.matchFlags = combinedKey;
- compare(valueChangedSpy.count, initialEqualsCombinedKey ? 0 : 1);
- compare(filterChangedSpy.count, initialEqualsCombinedKey ? 0 : 1);
- compare(detailFilter.matchFlags, combinedKey);
- }
-
// FILTERING TESTS
function filterTestItems() {
@@ -403,128 +303,93 @@ TestCase {
function test_filtering_data() {
return [
- {tag: "no filter", expectedItemsAmount: filterTestItems().length },
- {tag: "exact filter - EventTime.StartDateTime", expectedItemsAmount: 1,
- filterDetail: Detail.EventTime, filterField: EventTime.FieldStartDateTime, filterValue: new Date("2011-10-23T16:42:00")},//notice, date-object
- {tag: "exact filter - EventTime.EndDateTime", expectedItemsAmount: 1,
- filterDetail: Detail.EventTime, filterField: EventTime.FieldEndDateTime, filterValue: new Date("2011-10-23T21:00:00")},
- {tag: "exact filter - EventTime.AllDayEvent", expectedItemsAmount: 1, expectedItemsAmount_Jsondb: 2,
- filterDetail: Detail.EventTime, filterField: EventTime.FieldAllDay, filterValue: true},
- {tag: "exact filter - TodoTime.StartDateTime", expectedItemsAmount: 1,
- filterDetail: Detail.TodoTime, filterField: TodoTime.FieldStartDateTime, filterValue: new Date("2010-10-23T15:48:00")},
- {tag: "exact filter - TodoTime.DueDateTime", expectedItemsAmount: 1,
- filterDetail: Detail.TodoTime, filterField: TodoTime.FieldDueDateTime, filterValue: new Date("2010-10-25T15:49:00")},
- {tag: "exact filter - TodoTime.AllDay", expectedItemsAmount: 1, expectedItemsAmount_Jsondb: 2,
- filterDetail: Detail.TodoTime, filterField: TodoTime.FieldAllDay, filterValue: true},
- {tag: "exact filter - TodoProgress.Status", expectedItemsAmount: 1,
- filterDetail: Detail.TodoProgress, filterField: TodoProgress.FieldStatus, filterValue: TodoProgress.InProgress},
- {tag: "exact filter - TodoProgress.PercentageComplete", expectedItemsAmount: 2,
- filterDetail: Detail.TodoProgress, filterField: TodoProgress.FieldPercentageComplete, filterValue: 89},
- {tag: "exact filter - Comment", expectedItemsAmount: 1,
- filterDetail: Detail.Comment, filterField: Comment.FieldComment, filterValue: "my comment",
- separateDetailCtrStr: "import QtQuick 2.0\n"
- + "import QtOrganizer 5.0 \n"
- + " Comment {\n"
- + " comment: 'my comment'\n"
- + " }"},
- {tag: "exact filter - Description", expectedItemsAmount: 1,
- filterDetail: Detail.Description, filterField: Description.FieldDescription, filterValue: "for exact filter - Description"},
- {tag: "exact filter - DisplayLabel", expectedItemsAmount: 1,
- filterDetail: Detail.DisplayLabel, filterField: DisplayLabel.FieldLabel, filterValue: "my displayLabel"},
- {tag: "exact filter - Guid", expectedItemsAmount: 1,
- filterDetail: Detail.Guid, filterField: Guid.FieldGuid, filterValue: "my guid"},
- {tag: "exact filter - Location.Label", expectedItemsAmount: 1,
- filterDetail: Detail.Location, filterField: Location.FieldLabel, filterValue: "my location"},
- {tag: "exact filter - Location.Longitude", expectedItemsAmount: 1,
- filterDetail: Detail.Location, filterField: Location.FieldLongitude, filterValue: 12345.12345,
- separateDetailCtrStr: "import QtQuick 2.0\n"
- + "import QtOrganizer 5.0 \n"
- + " Location {\n"
- + " label: 'my place'\n"
- + " longitude: 12345.12345\n"
- + " }"},
- {tag: "exact filter - Location.Latitude", expectedItemsAmount: 1,
- filterDetail: Detail.Location, filterField: Location.FieldLatitude, filterValue: 54321.54321,
- separateDetailCtrStr: "import QtQuick 2.0\n"
- + "import QtOrganizer 5.0 \n"
- + " Location {\n"
- + " label: 'my 2nd place'\n"
- + " latitude: 54321.54321\n"
- + " }"},
- {tag: "exact filter - Priority", expectedItemsAmount: 1,
- filterDetail: Detail.Priority, filterField: Priority.FieldPriority, filterValue: Priority.VeryHigh},
- {tag: "exact filter - Type enum", expectedItemsAmount: 4,//amount of todos
- filterDetail: Detail.ItemType, filterField: Type.FieldType, filterValue: Type.Todo},
- {tag: "exact filter - Tag", expectedItemsAmount: 1,
- filterDetail: Detail.Tag, filterField: Tag.FieldTag, filterValue: "my tag",
- separateDetailCtrStr: "import QtQuick 2.0\n"
- + "import QtOrganizer 5.0 \n"
- + " Tag {\n"
- + " tag: 'my tag'\n"
- + " }"},
- {tag: "exact filter - ExtendedDetail", expectedItemsAmount: 1,
- filterDetail: Detail.ExtendedDetail, filterField: ExtendedDetail.FieldName, filterValue: "myField",
- separateDetailCtrStr: "import QtQuick 2.0\n"
- + "import QtOrganizer 5.0 \n"
- + " ExtendedDetail {\n"
- + " name: 'myField'\n"
- + " data: 42\n"
- + " }"},
- {tag: "exact filter - EventRsvp.ParticipationStatus", expectedItemsAmount: 1,
- filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldParticipationStatus, filterValue: EventAttendee.StatusAccepted,
- separateDetailCtrStr: "import QtQuick 2.0\n"
- + "import QtOrganizer 5.0 \n"
- + " EventRsvp {\n"
- + " participationStatus: EventAttendee.StatusAccepted\n"
- + " }"},
- {tag: "exact filter - EventRsvp.ParticipationRole", expectedItemsAmount: 1,
- filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldParticipationRole, filterValue: EventAttendee.RoleHost,
- separateDetailCtrStr: "import QtQuick 2.0\n"
- + "import QtOrganizer 5.0 \n"
- + " EventRsvp {\n"
- + " participationRole: EventAttendee.RoleHost\n"
- + " }"},
- {tag: "exact filter - EventRsvp.ResponseRequirement", expectedItemsAmount: 1,
- filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldResponseRequirement, filterValue: EventRsvp.ResponseRequired,
- separateDetailCtrStr: "import QtQuick 2.0\n"
- + "import QtOrganizer 5.0 \n"
- + " EventRsvp {\n"
- + " responseRequirement: EventRsvp.ResponseRequired\n"
- + " }"},
- {tag: "exact filter - EventRsvp.ResponseDeadline", expectedItemsAmount: 1,
- filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldResponseDeadline, filterValue: new Date("2008-12-28"),
- separateDetailCtrStr: "import QtQuick 2.0\n"
- + "import QtOrganizer 5.0 \n"
- + " EventRsvp {\n"
- + " responseDeadline: new Date(\"2008-12-28\")\n"
- + " }"},
- {tag: "exact filter - EventRsvp.ResponseDate", expectedItemsAmount: 1,
- filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldResponseDate, filterValue: new Date("2008-12-28"),
- separateDetailCtrStr: "import QtQuick 2.0\n"
- + "import QtOrganizer 5.0 \n"
- + " EventRsvp {\n"
- + " responseDate: new Date(\"2008-12-28\")\n"
- + " }"},
- {tag: "exact filter - EventRsvp.OrganizerName", expectedItemsAmount: 1,
- filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldOrganizerName, filterValue: "QtPim",
- separateDetailCtrStr: "import QtQuick 2.0\n"
- + "import QtOrganizer 5.0 \n"
- + " EventRsvp {\n"
- + " organizerName: \"QtPim\"\n"
- + " }"},
- {tag: "exact filter - EventRsvp.OrganizerEmail", expectedItemsAmount: 1,
- filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldOrganizerEmail, filterValue: "pim@qt-project.org",
- separateDetailCtrStr: "import QtQuick 2.0\n"
- + "import QtOrganizer 5.0 \n"
- + " EventRsvp {\n"
- + " organizerEmail: \"pim@qt-project.org\"\n"
- + " }"}
- ]
+ {tag: "no filter", expectedItemsAmount: filterTestItems().length },
+ {tag: "matching filter, TodoProgress", expectedItemsAmount: 1,
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " TodoProgress {\n"
+ + " status: TodoProgress.InProgress\n"
+ + " percentageComplete: 89\n"
+ + " }"
+ },
+ {tag: "matching filter, Description", expectedItemsAmount: 1,
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Description {\n"
+ + " description: 'for exact filter - Description'\n"
+ + " }"
+ },
+ {tag: "matching filter, ExtendedDetail - int value", expectedItemsAmount: 1,
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " ExtendedDetail {\n"
+ + " name: 'intExtDetail'\n"
+ + " data: 123\n"
+ + " }",
+ isExtDetail: 1
+ },
+ {tag: "matching filter, ExtendedDetail - string value", expectedItemsAmount: 1,
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " ExtendedDetail {\n"
+ + " name: 'stringExtDetail'\n"
+ + " data: '123'\n"
+ + " }",
+ isExtDetail: 1
+ },
+ {tag: "matching filter, ExtendedDetail - date value", expectedItemsAmount: 1,
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " ExtendedDetail {\n"
+ + " name: 'stringExtDetail'\n"
+ + " data: new Date('2010-10-25T15:49:00')\n"
+ + " }",
+ isExtDetail: 1
+ },
+ {tag: "matching filter, EventTime", expectedItemsAmount: 5,
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " EventTime {\n"
+ + " startDateTime:'2011-10-23T15:00:00Z'\n"
+ + " endDateTime: '2011-11-23T16:00:00'\n"
+ + " }",
+ },
+ {tag: "non-matching filter, Description", expectedItemsAmount: 0,
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Description {\n"
+ + " description: 'NonMatchingDescription'\n"
+ + " }"
+ },
+ {tag: "non-matching filter, less fields", expectedItemsAmount: 0,
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " TodoProgress {\n"
+ + " status: TodoProgress.InProgress\n"
+ + " }"
+ },
+ {tag: "non-matching filter, ExtendedDetail - different string data", expectedItemsAmount: 0,
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " ExtendedDetail {\n"
+ + " name: 'stringExtDetail'\n"
+ + " data: '123'\n"
+ + " }",
+ isExtDetail: 1,
+ nonMatchingCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " ExtendedDetail {\n"
+ + " name: 'stringExtDetail'\n"
+ + " data: '456'\n"
+ + " }",
+ }
+ ]
}
function test_filtering(data) {
//preparations
var managers = utility.getManagerList();
+ var detailToMatch;
for (var i=0;i<managers.length;i++) {
var managerToBeTested = managers[i];
@@ -534,15 +399,18 @@ TestCase {
addEventsToModel(filterTestItems());
compare(organizerModel.items.length, filterTestItems().length);
- if (data.separateDetailCtrStr) {
- addDetailWithoutConvenienceAPI(data.separateDetailCtrStr);
+ if (data.filterDetailCtrStr) {
+ if (data.isExtDetail) {
+ detailToMatch = addDetailWithoutConvenienceAPI(data.filterDetailCtrStr)
+ if (data.nonMatchingCtrStr)
+ detailToMatch = create_testobject(data.nonMatchingCtrStr)
+ } else {
+ detailToMatch = create_testobject(data.filterDetailCtrStr);
+ }
}
if (data.tag != "no filter") {
- applyFilter(data);
+ applyFilter(detailToMatch);
wait(spyWaitDelay);
-
- //console.log("organizerModel.filter: "+ organizerModel.filter.detail + "/" + organizerModel.filter.field + "/" + organizerModel.filter.value)
- //console.log("filtered amount: " + organizerModel.items.length);
}
if (managerToBeTested == "jsondb" ) {
@@ -556,237 +424,101 @@ TestCase {
}
}
- // FILTERING MATCHFLAG TESTS
-
- function matchflagTestItems() {
- return [
- "import QtQuick 2.0\n"
- + "import QtOrganizer 5.0 \n"
- + " Event {\n"
- + " startDateTime:new Date('2010-10-20')\n"
- + " endDateTime:new Date('2010-10-21')\n"
- + " description: 'aa bb cc'\n"
- + " EventRsvp {\n"
- + " organizerName: 'QtPim'\n"
- + " organizerEmail: 'pim@qt-project.org'\n"
- + " }"
- + " }",
- "import QtQuick 2.0\n"
- + "import QtOrganizer 5.0 \n"
- + " Event {\n"
- + " startDateTime:new Date('2011-10-22')\n"
- + " endDateTime:new Date('2011-10-23')\n"
- + " description: 'bB cc dd'\n"
- + " EventRsvp {\n"
- + " organizerName: 'random organizer name'\n"
- + " organizerEmail: 'random organizer email'\n"
- + " }"
- + " }",
- "import QtQuick 2.0\n"
- + "import QtOrganizer 5.0 \n"
- + " Todo {\n"
- + " dueDateTime:new Date('2010-12-22')\n"
- + " description: 'cc dd ee'\n"
- + " }"
- ]
- }
-
- function test_matchflags_data() {
- return [
- {tag: "Filter set, Description - MatchExactly", expectedItemsAmount: 1,
- filterDetail: Detail.Description, filterField: Description.FieldDescription, filterValue: "aa bb cc",
- matchFlags: Filter.MatchExactly},
- {tag: "Filter set, Description - MatchFixedString", expectedItemsAmount: 0,
- filterDetail: Detail.Description, filterField: Description.FieldDescription, filterValue: "bb",
- matchFlags: Filter.MatchEndsWith | Filter.MatchFixedString},
- {tag: "Filter set, Description - MatchContains case insensitive", expectedItemsAmount: 2,
- filterDetail: Detail.Description, filterField: Description.FieldDescription, filterValue: "bb",
- matchFlags: Filter.MatchContains},
- {tag: "Filter set, Description - MatchContains case sensitive", expectedItemsAmount: 1,
- filterDetail: Detail.Description, filterField: Description.FieldDescription, filterValue: "bb",
- matchFlags: Filter.MatchContains | Filter.MatchCaseSensitive},
- {tag: "Filter set, Description - MatchStartsWith", expectedItemsAmount: 1,
- filterDetail: Detail.Description, filterField: Description.FieldDescription, filterValue: "bb",
- matchFlags: Filter.MatchStartsWith},
- {tag: "Filter set, Description - MatchEndsWith", expectedItemsAmount: 1,
- filterDetail: Detail.Description, filterField: Description.FieldDescription, filterValue: "ee",
- matchFlags: Filter.MatchEndsWith},
- {tag: "Filter set, Comment - MatchExactly", expectedItemsAmount: 1,
- filterDetail: Detail.Comment, filterField: Comment.FieldComment, filterValue: "my great comment",
- matchFlags: Filter.MatchExactly,
- separateDetailCtrStr: "import QtQuick 2.0\n"
- + "import QtOrganizer 5.0 \n"
- + " Comment {\n"
- + " comment: 'my great comment'\n"
- + " }"},
- {tag: "Filter set, Comment - MatchStartsWith", expectedItemsAmount: 1,
- filterDetail: Detail.Comment, filterField: Comment.FieldComment, filterValue: "my",
- matchFlags: Filter.MatchStartsWith,
- // jsondb, depends on detail created in previous data set
- // mem, needs to create again
- separateDetailCtrStrMemory: "import QtQuick 2.0\n"
- + "import QtOrganizer 5.0 \n"
- + " Comment {\n"
- + " comment: 'my great comment'\n"
- + " }"},
- {tag: "Filter set, Comment - MatchContains", expectedItemsAmount: 1,
- filterDetail: Detail.Comment, filterField: Comment.FieldComment, filterValue: "great",
- matchFlags: Filter.MatchContains,
- // jsondb, depends on detail created in previous data set
- // mem, needs to create again
- separateDetailCtrStrMemory: "import QtQuick 2.0\n"
- + "import QtOrganizer 5.0 \n"
- + " Comment {\n"
- + " comment: 'my great comment'\n"
- + " }"},
- {tag: "Filter set, Comment - MatchEndsWith", expectedItemsAmount: 1,
- filterDetail: Detail.Comment, filterField: Comment.FieldComment, filterValue: "comment",
- matchFlags: Filter.MatchEndsWith,
- // jsondb, depends on detail created in previous data set
- // mem, needs to create again
- separateDetailCtrStrMemory: "import QtQuick 2.0\n"
- + "import QtOrganizer 5.0 \n"
- + " Comment {\n"
- + " comment: 'my great comment'\n"
- + " }"},
- {tag: "Filter set, Tag - MatchContains", expectedItemsAmount: 1,
- filterDetail: Detail.Tag, filterField: Tag.FieldTag, filterValue: "excellent",
- matchFlags: Filter.MatchContains,
- separateDetailCtrStr: "import QtQuick 2.0\n"
- + "import QtOrganizer 5.0 \n"
- + " Tag {\n"
- + " tag: 'my excellent tag'\n"
- + " }"},
- {tag: "Filter set, Description - tighten filter", expectedItemsAmount: 2,
- filterDetail: Detail.Description, filterField: Description.FieldDescription, filterValue: "bb",
- matchFlags: Filter.MatchContains, matchFlagsTighter: Filter.MatchContains | Filter.MatchCaseSensitive},
- {tag: "Filter set, EventRsvp.OrganizerName - MatchExactly", expectedItemsAmount: 1,
- filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldOrganizerName, filterValue: "QtPim",
- matchFlags: Filter.MatchExactly},
- {tag: "Filter set, EventRsvp.OrganizerName - MatchStartsWith", expectedItemsAmount: 1,
- filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldOrganizerName, filterValue: "Qt",
- matchFlags: Filter.MatchStartsWith},
- {tag: "Filter set, EventRsvp.OrganizerName - MatchContains", expectedItemsAmount: 1,
- filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldOrganizerName, filterValue: "tP",
- matchFlags: Filter.MatchContains},
- {tag: "Filter set, EventRsvp.OrganizerName - MatchEndsWith", expectedItemsAmount: 1,
- filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldOrganizerName, filterValue: "im",
- matchFlags: Filter.MatchEndsWith},
- {tag: "Filter set, EventRsvp.OrganizerEmail - MatchExactly", expectedItemsAmount: 1,
- filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldOrganizerEmail, filterValue: "pim@qt-project.org",
- matchFlags: Filter.MatchExactly},
- {tag: "Filter set, EventRsvp.OrganizerEmail - MatchStartsWith", expectedItemsAmount: 1,
- filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldOrganizerEmail, filterValue: "pim",
- matchFlags: Filter.MatchStartsWith},
- {tag: "Filter set, EventRsvp.OrganizerEmail - MatchContains", expectedItemsAmount: 1,
- filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldOrganizerEmail, filterValue: "@qt-",
- matchFlags: Filter.MatchContains},
- {tag: "Filter set, EventRsvp.OrganizerEmail - MatchEndsWith", expectedItemsAmount: 1,
- filterDetail: Detail.EventRsvp, filterField: EventRsvp.FieldOrganizerEmail, filterValue: ".org",
- matchFlags: Filter.MatchEndsWith}
- ]
- }
-
- function test_matchflags(data) {
- //preparations
- var managers = utility.getManagerList();
-
- for (var i=0;i<managers.length;i++) {
-
- var managerToBeTested = managers[i];
- console.log("## Testing plugin: " + managerToBeTested);
- organizerModel = createModel(managerToBeTested);
-
- addEventsToModel(matchflagTestItems());
- compare(organizerModel.items.length, matchflagTestItems().length);
-
- // for all backends
- if (data.separateDetailCtrStr) {
- addDetailWithoutConvenienceAPI(data.separateDetailCtrStr);
- }
- // for memory backend tests
- if (data.separateDetailCtrStrMemory && managerToBeTested == "memory") {
- addDetailWithoutConvenienceAPI(data.separateDetailCtrStrMemory);
- }
-
- applyFilter(data);
- wait(spyWaitDelay);
-
- //console.log("organizerModel.filter: "+ organizerModel.filter.detail + "/" + organizerModel.filter.field + "/" + organizerModel.filter.value + "/" + organizerModel.filter.matchFlags)
- //console.log("filtered amount: " + organizerModel.items.length);
- expectFail("Filter set, Comment - MatchStartsWith", "\nNot working before indexing starts to work");
- expectFail("Filter set, Comment - MatchContains", "\nNot working before indexing starts to work");
- expectFail("Filter set, Comment - MatchEndsWith", "\nNot working before indexing starts to work");
- expectFail("Filter set, Tag - MatchContains", "\nNot working before indexing starts to work");
- compare(organizerModel.items.length, data.expectedItemsAmount);
-
- if (data.matchFlagsTighter) {
- // testing the case where we have had a filter and then were making the filtering rules tighter
- var filterChangedSpy = create_spy(organizerModel, "filterChanged");
- organizerModel.filter.matchFlags = data.matchFlagsTighter;
- filterChangedSpy.wait();
- wait(spyWaitDelay);
- compare(organizerModel.items.length, data.expectedItemsAmount - 1);
- }
-
- organizerModel.destroy();
- }
- }
function test_errors_data() {
return [
// filtering certain details/definitions are currently not supported
- {tag: "Unsupported details, JournalTime", filterDetail: Detail.JournalTime },
- {tag: "Unsupported details, Reminder", filterDetail: Detail.Reminder },
- {tag: "Unsupported details, AudibleReminder", filterDetail: Detail.AudibleReminder },
- {tag: "Unsupported details, VisualReminder", filterDetail: Detail.VisualReminder },
- {tag: "Unsupported details, EmailReminder", filterDetail: Detail.EmailReminder },
- {tag: "Unsupported details, Parent", filterDetail: Detail.Parent },
- {tag: "Unsupported details, Recurrence", filterDetail: Detail.Recurrence },
- {tag: "Unsupported details, Timestamp", filterDetail: Detail.Timestamp },
- // filtering matchflags are not supported for all the types
- {tag: "Unsupported matchflag, EventTime", filterDetail: Detail.EventTime, matchFlags: Filter.MatchContains },
- {tag: "Unsupported matchflag, TodoTime", filterDetail: Detail.TodoTime, matchFlags: Filter.MatchStartsWith },
- {tag: "Unsupported matchflag, TodoProgress", filterDetail: Detail.TodoProgress, matchFlags: Filter.MatchStartsWith },
- {tag: "Unsupported matchflag, Comment", filterDetail: Detail.Comment, matchFlags: Filter.MatchContains },
- {tag: "Unsupported matchflag, Location - Longitude", filterDetail: Detail.Location,
- filterField: Location.FieldLongitude, matchFlags: Filter.MatchEndsWith },
- {tag: "Unsupported matchflag, Location - Latitude", filterDetail: Detail.Location,
- filterField: Location.FieldLatitude, matchFlags: Filter.MatchEndsWith },
- {tag: "Unsupported matchflag, Priority", filterDetail: Detail.Priority, matchFlags: Filter.MatchStartsWith },
- {tag: "Unsupported matchflag, Type", filterDetail: Detail.ItemType, matchFlags: Filter.MatchFixedString },
- {tag: "Unsupported matchflag, Tag", filterDetail: Detail.Tag, matchFlags: Filter.MatchCaseSensitive },
- {tag: "Unsupported matchflag, ExtendedDetail", filterDetail: Detail.ExtendedDetail, matchFlags: Filter.MatchFixedString },
- // filtering with QString needs extra attention, not allowed for all the types
- {tag: "Unsupported string value, EventTime - StartDateTime",
- filterDetail: Detail.EventTime, filterField: EventTime.FieldStartDateTime, filterValue: "mystringie" },
- {tag: "Unsupported string value, EventTime - EndDateTime",
- filterDetail: Detail.EventTime, filterField: EventTime.FieldEndDateTime, filterValue: "mystringie" },
- {tag: "Unsupported string value, EventTime - AllDay",
- filterDetail: Detail.EventTime, filterField: EventTime.FieldAllDay, filterValue: "mystringie" },
- {tag: "Unsupported string value, JournalTime - EntryDateTime",
- filterDetail: Detail.JournalTime, filterField: Journal.FieldEntryDateTime, filterValue: "mystringie" },
- {tag: "Unsupported string value, TodoTime - StartDateTime",
- filterDetail: Detail.TodoTime, filterField: TodoTime.FieldStartDateTime, filterValue: "mystringie" },
- {tag: "Unsupported string value, TodoTime - DueDateTime",
- filterDetail: Detail.TodoTime, filterField: TodoTime.FieldDueDateTime, filterValue: "mystringie" },
- {tag: "Unsupported string value, TodoTime - AllDay",
- filterDetail: Detail.TodoTime, filterField: TodoTime.FieldAllDay, filterValue: "mystringie" },
- {tag: "Unsupported string value, TodoProgress - FinishedDateTime",
- filterDetail: Detail.TodoProgress, filterField: TodoProgress.FieldFinishedDateTime, filterValue: "mystringie" },
- {tag: "Unsupported string value, TodoProgress - Status",
- filterDetail: Detail.TodoProgress, filterField: TodoProgress.FieldStatus, filterValue: "mystringie" },
- {tag: "Unsupported string value, TodoProgress - PercentageComplete",
- filterDetail: Detail.TodoProgress, filterField: TodoProgress.FieldPercentageComplete, filterValue: "mystringie" },
- // missing all different Reminders -details/fields (tested already on Unsupported details-part)
- {tag: "Unsupported string value, Location - Longitude",
- filterDetail: Detail.Location, filterField: Location.FieldLongitude, filterValue: "mystringie" },
- {tag: "Unsupported string value, Location - Latitude",
- filterDetail: Detail.Location, filterField: Location.FieldLatitude, filterValue: "mystringie" },
- // missing Parent-detail/field (tested already on Unsupported details-part)
- {tag: "Unsupported string value, Priority",
- filterDetail: Detail.Priority, filterField: Priority.FieldPriority, filterValue: "mystringie" },
- // missing Recurrence-, TimeStamp-details/fields (tested already on Unsupported details-part)
+ {tag: "Unsupported details, Detail with no fields",
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " JournalTime {\n"
+ + " }"
+ },
+ {tag: "Unsupported details, AudibleReminder",
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " AudibleReminder {\n"
+ + " repetitionCount: 5\n"
+ + " repetitionDelay: 90\n"
+ + " secondsBeforeStart: 90\n"
+ + " }"
+ },
+ {tag: "Unsupported details, Comment",
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Comment {\n"
+ + " comment: 'Item Comment'\n"
+ + " }"
+ },
+ {tag: "Unsupported details, EmailReminder",
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " EmailReminder {\n"
+ + " repetitionCount: 5\n"
+ + " repetitionDelay: 90\n"
+ + " secondsBeforeStart: 90\n"
+ + " }"
+ },
+ {tag: "Unsupported details, ExtendedDetail with name field only",
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " ExtendedDetail {\n"
+ + " name: 'property name'\n"
+ + " }"
+ },
+ {tag: "Unsupported details, ExtendedDetail with data field only",
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " ExtendedDetail {\n"
+ + " data: 'property data'\n"
+ + " }"
+ },
+ {tag: "Unsupported details, JournalTime",
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " JournalTime {\n"
+ + " entryDateTime: '2011-10-23T15:00:00Z'\n"
+ + " }"
+ },
+ {tag: "Unsupported details, Recurrence",
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Recurrence {\n"
+ + " recurrenceDates: [new Date('2011-01-01')]\n"
+ + " }"
+ },
+ {tag: "Unsupported details, Reminder",
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Reminder {\n"
+ + " repetitionCount: 5\n"
+ + " repetitionDelay: 90\n"
+ + " secondsBeforeStart: 90\n"
+ + " }"
+ },
+ {tag: "Unsupported details, Tag",
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Tag {\n"
+ + " tag: 'Item Tag'\n"
+ + " }"
+ },
+ {tag: "Unsupported details, Timestamp",
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " Timestamp {\n"
+ + " created: '2011-10-23T15:00:00Z'\n"
+ + " }"
+ },
+ {tag: "Unsupported details, VisualReminder",
+ filterDetailCtrStr: "import QtQuick 2.0\n"
+ + "import QtOrganizer 5.0 \n"
+ + " VisualReminder {\n"
+ + " repetitionCount: 5\n"
+ + " repetitionDelay: 90\n"
+ + " secondsBeforeStart: 90\n"
+ + " }"
+ },
]
}
@@ -795,9 +527,9 @@ TestCase {
//preparations
// error codes are backend specific, these are tested only for jsondb
organizerModel = createModel("jsondb")
-
+ var detailToMatch = create_testobject(data.filterDetailCtrStr)
var errorChangedSpy = create_spy(organizerModel, "errorChanged");
- applyFilter(data);
+ applyFilter(detailToMatch);
errorChangedSpy.wait();
wait(50);//why needed?
diff --git a/tests/auto/organizer/qmlorganizer/testcases/tst_organizermodel.qml b/tests/auto/organizer/qmlorganizer/testcases/tst_organizermodel.qml
index ce3f4c415..f90e0d104 100644
--- a/tests/auto/organizer/qmlorganizer/testcases/tst_organizermodel.qml
+++ b/tests/auto/organizer/qmlorganizer/testcases/tst_organizermodel.qml
@@ -89,7 +89,7 @@ TestCase {
code: "import QtOrganizer 5.0\n"
+ "OrganizerModel {\n"
+ " id:organizerModelId\n"
- + " filter:DetailFilter{\n"
+ + " filter:DetailFieldFilter{\n"
+ " id:filter\n"
+ " field:EventTime.FieldStartDateTime\n"
+ " value:'2010-08-12T13:22:01'\n"
@@ -134,7 +134,7 @@ TestCase {
+ " filter:IntersectionFilter {\n"
+ " id:filter\n"
+ " filters:[\n"
- + " DetailFilter{\n"
+ + " DetailFieldFilter{\n"
+ " id:filter1\n"
+ " field:EventTime.FieldStartDateTime\n"
+ " value:'2010-08-12T13:22:01'\n"
@@ -870,7 +870,7 @@ TestCase {
}
for (var i = 0; i < managerlist.length; i ++) {
- var filter = Qt.createQmlObject("import QtOrganizer 5.0; DetailFilter{}", modelTests)
+ var filter = Qt.createQmlObject("import QtOrganizer 5.0; DetailFieldFilter{}", modelTests)
filter.detail = Detail.EventTime
filter.field = EventTime.FieldAllDay
filter.value = true
diff --git a/tests/auto/organizer/qorganizeritemasync/unittest/tst_qorganizeritemasync.cpp b/tests/auto/organizer/qorganizeritemasync/unittest/tst_qorganizeritemasync.cpp
index 8975fa9d6..df1cc303c 100644
--- a/tests/auto/organizer/qorganizeritemasync/unittest/tst_qorganizeritemasync.cpp
+++ b/tests/auto/organizer/qorganizeritemasync/unittest/tst_qorganizeritemasync.cpp
@@ -571,8 +571,8 @@ void tst_QOrganizerItemAsync::itemFetch()
QVERIFY(containsIgnoringDetailKeys(mitems, items.at(i)));
}
- // asynchronous detail filtering
- QOrganizerItemDetailFilter dfil;
+ // asynchronous detail field filtering
+ QOrganizerItemDetailFieldFilter dfil;
dfil.setDetail(QOrganizerItemDetail::TypeLocation, QOrganizerItemLocation::FieldLabel);
ifr.setFilter(dfil);
QVERIFY(ifr.filter() == dfil);
@@ -880,8 +880,8 @@ void tst_QOrganizerItemAsync::itemIdFetch()
QList<QOrganizerItemId> result = ifr.itemIds();
QCOMPARE(itemIds, result);
- // asynchronous detail filtering
- QOrganizerItemDetailFilter dfil;
+ // asynchronous detail field filtering
+ QOrganizerItemDetailFieldFilter dfil;
dfil.setDetail(QOrganizerItemDetail::TypeLocation, QOrganizerItemLocation::FieldLabel);
ifr.setFilter(dfil);
QVERIFY(ifr.filter() == dfil);
@@ -1259,8 +1259,8 @@ void tst_QOrganizerItemAsync::itemFetchForExport()
}
#if defined(QT_NO_JSONDB)
- // asynchronous detail filtering
- QOrganizerItemDetailFilter dfil;
+ // asynchronous detail field filtering
+ QOrganizerItemDetailFieldFilter dfil;
dfil.setDetail(QOrganizerItemDetail::TypeLocation, QOrganizerItemLocation::FieldLabel);
ifr.setFilter(dfil);
QVERIFY(ifr.filter() == dfil);
@@ -1505,9 +1505,9 @@ void tst_QOrganizerItemAsync::itemRemove()
QVERIFY(irr1.isFinished());
QVERIFY(irr1.error() == QOrganizerManager::NoError);
- // specific item removal via detail filter
+ // specific item removal via detail field filter
int originalCount = oim->itemIds().size();
- QOrganizerItemDetailFilter dfil;
+ QOrganizerItemDetailFieldFilter dfil;
dfil.setDetail(QOrganizerItemDetail::TypeComment, QOrganizerItemComment::FieldComment);
irr.setItems(oim->items(QDateTime(), QDateTime(), dfil));
irr.setManager(oim.data());
@@ -1684,9 +1684,9 @@ void tst_QOrganizerItemAsync::itemRemoveById()
QVERIFY(irr1.isFinished());
QVERIFY(irr1.error() == QOrganizerManager::NoError);
- // specific item removal via detail filter
+ // specific item removal via detail field filter
int originalCount = oim->itemIds().size();
- QOrganizerItemDetailFilter dfil;
+ QOrganizerItemDetailFieldFilter dfil;
dfil.setDetail(QOrganizerItemDetail::TypeComment, QOrganizerItemComment::FieldComment);
irr.setItemIds(oim->itemIds(QDateTime(), QDateTime(), dfil));
irr.setManager(oim.data());
diff --git a/tests/auto/organizer/qorganizeritemfilter/tst_qorganizeritemfilter.cpp b/tests/auto/organizer/qorganizeritemfilter/tst_qorganizeritemfilter.cpp
index e2d1d07c8..93aaf4a3f 100644
--- a/tests/auto/organizer/qorganizeritemfilter/tst_qorganizeritemfilter.cpp
+++ b/tests/auto/organizer/qorganizeritemfilter/tst_qorganizeritemfilter.cpp
@@ -50,7 +50,7 @@ QTORGANIZER_USE_NAMESPACE
Q_DECLARE_METATYPE(QOrganizerItem)
Q_DECLARE_METATYPE(QOrganizerItemFilter)
-Q_DECLARE_METATYPE(QOrganizerItemDetailFilter)
+Q_DECLARE_METATYPE(QOrganizerItemDetailFieldFilter)
class tst_QOrganizerItemFilter : public QObject
{
@@ -67,7 +67,9 @@ private slots:
void classHierarchy();
void intersectionFilter();
void unionFilter();
+ void detailFilterDeprecatedApi();
void detailFilter();
+ void detailFieldFilter();
void detailRangeFilter();
void boringFilters();
void idListFilter();
@@ -180,16 +182,16 @@ void tst_QOrganizerItemFilter::cleanup()
void tst_QOrganizerItemFilter::classHierarchy()
{
/* Test "casting" up and down the hierarchy */
- QOrganizerItemDetailFilter df;
- QVERIFY(df.type() == QOrganizerItemFilter::DetailFilter);
+ QOrganizerItemDetailFieldFilter df;
+ QVERIFY(df.type() == QOrganizerItemFilter::DetailFieldFilter);
df.setDetail(QOrganizerItemDetail::TypeUndefined, 101);
df.setValue(42);
QOrganizerItemFilter f = df;
- QVERIFY(f.type() == QOrganizerItemFilter::DetailFilter);
+ QVERIFY(f.type() == QOrganizerItemFilter::DetailFieldFilter);
- QOrganizerItemDetailFilter df2 = f;
- QVERIFY(df2.type() == QOrganizerItemFilter::DetailFilter);
+ QOrganizerItemDetailFieldFilter df2 = f;
+ QVERIFY(df2.type() == QOrganizerItemFilter::DetailFieldFilter);
QVERIFY(df2.detailType() == QOrganizerItemDetail::TypeUndefined);
QVERIFY(df2.detailField() == -1);
QVERIFY(df2.value() == 42);
@@ -198,18 +200,18 @@ void tst_QOrganizerItemFilter::classHierarchy()
{
QOrganizerItemFilter f2 = df2;
}
- QVERIFY(df2.type() == QOrganizerItemFilter::DetailFilter);
+ QVERIFY(df2.type() == QOrganizerItemFilter::DetailFieldFilter);
QVERIFY(df2.detailType() == QOrganizerItemDetail::TypeUndefined);
QVERIFY(df2.detailField() == -1);
QVERIFY(df2.value() == 42);
{
- QOrganizerItemDetailFilter sdf2 = df2;
+ QOrganizerItemDetailFieldFilter sdf2 = df2;
sdf2.setDetail(QOrganizerItemDetail::TypeComment, QOrganizerItemComment::FieldComment);
QVERIFY(sdf2.detailType() == QOrganizerItemDetail::TypeComment);
QVERIFY(df2.detailType() == QOrganizerItemDetail::TypeUndefined);
}
- QVERIFY(df2.type() == QOrganizerItemFilter::DetailFilter);
+ QVERIFY(df2.type() == QOrganizerItemFilter::DetailFieldFilter);
QVERIFY(df2.detailType() == QOrganizerItemDetail::TypeUndefined);
QVERIFY(df2.detailField() == -1);
QVERIFY(df2.value() == 42);
@@ -249,13 +251,13 @@ void tst_QOrganizerItemFilter::classHierarchy()
void tst_QOrganizerItemFilter::intersectionFilter()
{
/* Test boolean ops */
- QOrganizerItemDetailFilter df;
+ QOrganizerItemDetailFieldFilter df;
df.setDetail(QOrganizerItemDetail::TypeUndefined, -1);
- QOrganizerItemDetailFilter df2;
+ QOrganizerItemDetailFieldFilter df2;
df2.setDetail(QOrganizerItemDetail::TypeComment, QOrganizerItemComment::FieldComment);
- QOrganizerItemDetailFilter df3;
+ QOrganizerItemDetailFieldFilter df3;
df3.setDetail(QOrganizerItemDetail::TypeDescription, QOrganizerItemDescription::FieldDescription);
QOrganizerItemIntersectionFilter bf;
@@ -340,13 +342,13 @@ void tst_QOrganizerItemFilter::intersectionFilter()
void tst_QOrganizerItemFilter::unionFilter()
{
/* Test boolean ops */
- QOrganizerItemDetailFilter df;
+ QOrganizerItemDetailFieldFilter df;
df.setDetail(QOrganizerItemDetail::TypeUndefined, -1);
- QOrganizerItemDetailFilter df2;
+ QOrganizerItemDetailFieldFilter df2;
df2.setDetail(QOrganizerItemDetail::TypeComment, QOrganizerItemComment::FieldComment);
- QOrganizerItemDetailFilter df3;
+ QOrganizerItemDetailFieldFilter df3;
df3.setDetail(QOrganizerItemDetail::TypeDescription, QOrganizerItemDescription::FieldDescription);
QOrganizerItemUnionFilter bf;
@@ -434,13 +436,13 @@ void tst_QOrganizerItemFilter::unionFilter()
QVERIFY(bf3.filters().isEmpty());
}
-
-void tst_QOrganizerItemFilter::detailFilter()
+void tst_QOrganizerItemFilter::detailFilterDeprecatedApi()
{
QOrganizerItemDetailFilter df;
QVERIFY(df.type() == QOrganizerItemFilter::DetailFilter);
+ // Verify that deprecated API still works
QVERIFY(df.detailType() == QOrganizerItemDetail::TypeUndefined);
QVERIFY(df.detailField() == -1);
QVERIFY(df.matchFlags() == 0);
@@ -527,6 +529,177 @@ void tst_QOrganizerItemFilter::detailFilter()
QVERIFY(df4.detailField() == QOrganizerItemDescription::FieldDescription);
}
+void tst_QOrganizerItemFilter::detailFilter()
+{
+ QOrganizerItemDetailFilter df;
+
+ QVERIFY(df.type() == QOrganizerItemFilter::DetailFilter);
+
+ QVERIFY(df.detail().type() == QOrganizerItemDetail::TypeUndefined);
+ QVERIFY(df.detail().isEmpty());
+
+ QOrganizerItemComment comment;
+ df.setDetail(comment);
+ QVERIFY(df.detail().isEmpty());
+ QVERIFY(df.detail().type() == QOrganizerItemDetail::TypeComment);
+ QVERIFY(!df.detail().values().keys().contains(QOrganizerItemComment::FieldComment));
+ QVERIFY(df.detail().value(QOrganizerItemComment::FieldComment).isNull());
+
+ comment.setComment(QStringLiteral("TestComment"));
+ df.setDetail(comment);
+ QVERIFY(!df.detail().isEmpty());
+ QCOMPARE(df.detail().type(), QOrganizerItemDetail::TypeComment);
+ QVERIFY(df.detail().values().keys().contains(QOrganizerItemComment::FieldComment));
+ QCOMPARE(df.detail().value(QOrganizerItemComment::FieldComment).toString(), QString(QStringLiteral("TestComment")));
+
+
+ /* Test op= */
+ QOrganizerItemFilter f = df;
+ QVERIFY(f == df);
+
+ QOrganizerItemDetailFilter df2 = f;
+ QVERIFY(df2 == df);
+ QCOMPARE(df2.detail(), df.detail());
+
+ /* Self assignment should do nothing */
+ df2 = df2;
+ QVERIFY(df2 == df);
+
+ /* Some cross casting */
+ QOrganizerItemDetailRangeFilter rf;
+
+ /* Directly */
+ df2 = rf;
+ QCOMPARE(df2.type(), QOrganizerItemFilter::DetailFilter);
+ QCOMPARE(df2.detail().type(), QOrganizerItemDetail::TypeUndefined);
+ QVERIFY(df2.detail().isEmpty());
+
+ /* reset it */
+ df2 = df;
+ QCOMPARE(df2.detail().type(), QOrganizerItemDetail::TypeComment);
+ QVERIFY(df2.detail().values().keys().contains(QOrganizerItemComment::FieldComment));
+
+ /* Through base class */
+ f = rf;
+ df2 = f;
+ QCOMPARE(df2.detail().type(), QOrganizerItemDetail::TypeUndefined);
+ QVERIFY(df2.detail().isEmpty());
+
+ /* Now test copy ctor */
+ QOrganizerItemDetailFilter df3(rf);
+ QVERIFY(df3.type() == QOrganizerItemFilter::DetailFilter);
+ QCOMPARE(df3.detail().type(), QOrganizerItemDetail::TypeUndefined);
+ QVERIFY(df3.detail().isEmpty());
+
+ /* reset it */
+ df3 = df;
+ QCOMPARE(df3.detail().type(), QOrganizerItemDetail::TypeComment);
+ QVERIFY(df3.detail().values().keys().contains(QOrganizerItemComment::FieldComment));
+
+ /* Now test copy ctor through base class */
+ QOrganizerItemDetailFilter df4(f);
+ QCOMPARE(df4.type(), QOrganizerItemFilter::DetailFilter);
+ QCOMPARE(df4.detail().type(), QOrganizerItemDetail::TypeUndefined);
+ QVERIFY(df4.detail().isEmpty());
+
+ /* reset it */
+ df4 = df;
+ QCOMPARE(df4.detail().type(), QOrganizerItemDetail::TypeComment);
+ QVERIFY(df4.detail().values().keys().contains(QOrganizerItemComment::FieldComment));
+}
+
+void tst_QOrganizerItemFilter::detailFieldFilter()
+{
+ QOrganizerItemDetailFieldFilter df;
+
+ QVERIFY(df.type() == QOrganizerItemFilter::DetailFieldFilter);
+
+ QVERIFY(df.detailType() == QOrganizerItemDetail::TypeUndefined);
+ QVERIFY(df.detailField() == -1);
+ QVERIFY(df.matchFlags() == 0);
+ QVERIFY(df.value().isNull());
+
+ df.setDetail(QOrganizerItemDetail::TypeComment, QOrganizerItemComment::FieldComment);
+ QVERIFY(df.detailType() == QOrganizerItemDetail::TypeComment);
+ QVERIFY(df.detailField() == QOrganizerItemComment::FieldComment);
+ QVERIFY(df.matchFlags() == 0);
+ QVERIFY(df.value().isNull());
+
+ df.setDetail(QOrganizerItemDetail::TypeDescription, QOrganizerItemDescription::FieldDescription);
+ QVERIFY(df.detailType() == QOrganizerItemDetail::TypeDescription);
+ QVERIFY(df.detailField() == QOrganizerItemDescription::FieldDescription);
+ QVERIFY(df.matchFlags() == 0);
+ QVERIFY(df.value().isNull());
+
+ df.setMatchFlags(QOrganizerItemFilter::MatchExactly);
+ QVERIFY(df.matchFlags() == QOrganizerItemFilter::MatchExactly);
+
+ df.setValue(5);
+ QVERIFY(df.value() == 5);
+
+ df.setValue("String value");
+ QVERIFY(df.value() == "String value");
+
+ /* Test op= */
+ QOrganizerItemFilter f = df;
+ QVERIFY(f == df);
+
+ QOrganizerItemDetailFieldFilter df2 = f;
+ QVERIFY(df2 == df);
+ QVERIFY(df2.detailType() == QOrganizerItemDetail::TypeDescription);
+ QVERIFY(df2.detailField() == QOrganizerItemDescription::FieldDescription);
+
+ /* Self assignment should do nothing */
+ df2 = df2;
+ QVERIFY(df2 == df);
+
+ /* Some cross casting */
+ QOrganizerItemDetailRangeFilter rf;
+
+ /* Directly */
+ df2 = rf;
+ QVERIFY(df2.type() == QOrganizerItemFilter::DetailFieldFilter);
+ QVERIFY(df2.detailType() == QOrganizerItemDetail::TypeUndefined);
+ QVERIFY(df2.detailField() == -1);
+ QVERIFY(df2.value().isNull());
+
+ /* reset it */
+ df2 = df;
+ QVERIFY(df2.detailType() == QOrganizerItemDetail::TypeDescription);
+ QVERIFY(df2.detailField() == QOrganizerItemDescription::FieldDescription);
+
+ /* Through base class */
+ f = rf;
+ df2 = f;
+ QVERIFY(df2.detailType() == QOrganizerItemDetail::TypeUndefined);
+ QVERIFY(df2.detailField() == -1);
+ QVERIFY(df2.value().isNull());
+
+ /* Now test copy ctor */
+ QOrganizerItemDetailFieldFilter df3(rf);
+ QVERIFY(df3.type() == QOrganizerItemFilter::DetailFieldFilter);
+ QVERIFY(df3.detailType() == QOrganizerItemDetail::TypeUndefined);
+ QVERIFY(df3.detailField() == -1);
+ QVERIFY(df3.value().isNull());
+
+ /* reset it */
+ df3 = df;
+ QVERIFY(df3.detailType() == QOrganizerItemDetail::TypeDescription);
+ QVERIFY(df3.detailField() == QOrganizerItemDescription::FieldDescription);
+
+ /* Now test copy ctor through base class */
+ QOrganizerItemDetailFieldFilter df4(f);
+ QVERIFY(df4.type() == QOrganizerItemFilter::DetailFieldFilter);
+ QVERIFY(df4.detailType() == QOrganizerItemDetail::TypeUndefined);
+ QVERIFY(df4.detailField() == -1);
+ QVERIFY(df4.value().isNull());
+
+ /* reset it */
+ df4 = df;
+ QVERIFY(df4.detailType() == QOrganizerItemDetail::TypeDescription);
+ QVERIFY(df4.detailField() == QOrganizerItemDescription::FieldDescription);
+}
+
void tst_QOrganizerItemFilter::detailRangeFilter()
{
QOrganizerItemDetailRangeFilter rf;
@@ -858,7 +1031,7 @@ void tst_QOrganizerItemFilter::idListFilter()
idf2 = idf2;
QVERIFY(idf2 == idf);
- QOrganizerItemDetailFilter dfil;
+ QOrganizerItemDetailFieldFilter dfil;
QOrganizerItemIdFilter idf3(dfil);
QVERIFY(idf3.type() == QOrganizerItemFilter::IdFilter); // should be a blank id list filter
QOrganizerItemIdFilter idf4(idf);
@@ -917,11 +1090,11 @@ void tst_QOrganizerItemFilter::canonicalizedFilter_data()
QTest::addColumn<QOrganizerItemFilter>("in");
QTest::addColumn<QOrganizerItemFilter>("expected");
- QOrganizerItemDetailFilter detailFilter1;
+ QOrganizerItemDetailFieldFilter detailFilter1;
detailFilter1.setDetail(QOrganizerItemDetail::TypeLocation, QOrganizerItemLocation::FieldLabel);
detailFilter1.setValue("1");
detailFilter1.setMatchFlags(QOrganizerItemFilter::MatchContains);
- QOrganizerItemDetailFilter detailFilter2;
+ QOrganizerItemDetailFieldFilter detailFilter2;
detailFilter2.setDetail(QOrganizerItemDetail::TypeLocation, QOrganizerItemLocation::FieldLabel);
detailFilter2.setValue("2");
detailFilter2.setMatchFlags(QOrganizerItemFilter::MatchContains);
@@ -1046,7 +1219,7 @@ void tst_QOrganizerItemFilter::canonicalizedFilter_data()
{
QOrganizerItemDetailRangeFilter qcdrf;
qcdrf.setDetail(QOrganizerItemDetail::TypeLocation, QOrganizerItemLocation::FieldLabel);
- QOrganizerItemDetailFilter expected;
+ QOrganizerItemDetailFieldFilter expected;
expected.setDetail(QOrganizerItemDetail::TypeLocation, QOrganizerItemLocation::FieldLabel);
QTest::newRow("Null valued range filter")
<< static_cast<QOrganizerItemFilter>(qcdrf)
@@ -1058,7 +1231,7 @@ void tst_QOrganizerItemFilter::canonicalizedFilter_data()
qcdrf.setDetail(QOrganizerItemDetail::TypeLocation, QOrganizerItemLocation::FieldLabel);
qcdrf.setRange(QStringLiteral("a"), QStringLiteral("a"));
qcdrf.setMatchFlags(QOrganizerItemFilter::MatchFixedString);
- QOrganizerItemDetailFilter expected;
+ QOrganizerItemDetailFieldFilter expected;
expected.setDetail(QOrganizerItemDetail::TypeLocation, QOrganizerItemLocation::FieldLabel);
expected.setValue(QStringLiteral("a"));
expected.setMatchFlags(QOrganizerItemFilter::MatchFixedString);
@@ -1093,7 +1266,7 @@ void tst_QOrganizerItemFilter::canonicalizedFilter_data()
qcdrf.setDetail(QOrganizerItemDetail::TypeLocation, QOrganizerItemLocation::FieldLabel);
qcdrf.setRange(QVariant(QVariant::String), QVariant(QVariant::String)); // null bounds
qcdrf.setMatchFlags(QOrganizerItemFilter::MatchFixedString);
- QOrganizerItemDetailFilter qcdf;
+ QOrganizerItemDetailFieldFilter qcdf;
qcdf.setDetail(QOrganizerItemDetail::TypeLocation, QOrganizerItemLocation::FieldLabel);
qcdf.setMatchFlags(QOrganizerItemFilter::MatchFixedString);
qcdf.setValue(QVariant(QVariant::String));
@@ -1120,7 +1293,7 @@ void tst_QOrganizerItemFilter::canonicalizedFilter_data()
}
{
- QOrganizerItemDetailFilter qcdf;
+ QOrganizerItemDetailFieldFilter qcdf;
QTest::newRow("Empty detail filter")
<< static_cast<QOrganizerItemFilter>(qcdf)
<< static_cast<QOrganizerItemFilter>(invalidFilter);
@@ -1130,7 +1303,7 @@ void tst_QOrganizerItemFilter::canonicalizedFilter_data()
void tst_QOrganizerItemFilter::testFilter()
{
QFETCH(QOrganizerItem, item);
- QFETCH(QOrganizerItemDetailFilter, filter);
+ QFETCH(QOrganizerItemDetailFieldFilter, filter);
QFETCH(bool, expected);
QCOMPARE(QOrganizerManagerEngine::testFilter(filter, item), expected);
@@ -1139,7 +1312,7 @@ void tst_QOrganizerItemFilter::testFilter()
void tst_QOrganizerItemFilter::testFilter_data()
{
QTest::addColumn<QOrganizerItem>("item");
- QTest::addColumn<QOrganizerItemDetailFilter>("filter");
+ QTest::addColumn<QOrganizerItemDetailFieldFilter>("filter");
QTest::addColumn<bool>("expected");
// XXX TODO: other detail types (comment, description, ...)
@@ -1150,7 +1323,7 @@ void tst_QOrganizerItemFilter::testFilter_data()
name.setLabel("test location");
item.saveDetail(&name);
- QOrganizerItemDetailFilter filter;
+ QOrganizerItemDetailFieldFilter filter;
filter.setDetail(QOrganizerItemDetail::TypeLocation, QOrganizerItemLocation::FieldLabel);
filter.setMatchFlags(QOrganizerItemFilter::MatchContains);
@@ -1177,7 +1350,7 @@ void tst_QOrganizerItemFilter::testFilter_data()
QOrganizerItem item;
item.setDisplayLabel(QStringLiteral("foo"));
- QOrganizerItemDetailFilter filter;
+ QOrganizerItemDetailFieldFilter filter;
filter.setDetail(QOrganizerItemDetail::TypeDisplayLabel, QOrganizerItemDisplayLabel::FieldLabel);
filter.setMatchFlags(QOrganizerItemFilter::MatchContains);
@@ -1206,7 +1379,7 @@ void tst_QOrganizerItemFilter::testFilter_data()
priority.setPriority(QOrganizerItemPriority::VeryHighPriority);
item.saveDetail(&priority);
- QOrganizerItemDetailFilter filter;
+ QOrganizerItemDetailFieldFilter filter;
filter.setDetail(QOrganizerItemDetail::TypePriority, QOrganizerItemPriority::FieldPriority);
filter.setMatchFlags(QOrganizerItemFilter::MatchContains);
@@ -1250,7 +1423,7 @@ void tst_QOrganizerItemFilter::datastream_data()
}
{
- QOrganizerItemDetailFilter filter;
+ QOrganizerItemDetailFieldFilter filter;
filter.setDetail(QOrganizerItemDetail::TypeComment, QOrganizerItemComment::FieldComment);
filter.setMatchFlags(QOrganizerItemFilter::MatchEndsWith);
filter.setValue("ski");
@@ -1359,11 +1532,11 @@ void tst_QOrganizerItemFilter::testDebugStreamOut_data()
}
{
- QOrganizerItemDetailFilter filter;
+ QOrganizerItemDetailFieldFilter filter;
filter.setDetail(QOrganizerItemDetail::TypeComment, QOrganizerItemComment::FieldComment);
filter.setMatchFlags(QOrganizerItemFilter::MatchEndsWith);
filter.setValue("ski");
- QTest::newRow("detail") << (QOrganizerItemFilter)filter << "QOrganizerItemFilter(QOrganizerItemDetailFilter(detailType=200,detailField=201,value=QVariant(QString, \"ski\") ,matchFlags=3))";
+ QTest::newRow("detail") << (QOrganizerItemFilter)filter << "QOrganizerItemFilter(QOrganizerItemDetailFieldFilter(detailType=200,detailField=201,value=QVariant(QString, \"ski\") ,matchFlags=3))";
}
{
@@ -1473,7 +1646,7 @@ void tst_QOrganizerItemFilter::testDebugStreamOut_data()
filter2 = filter2;
QTest::newRow("Id") << (QOrganizerItemFilter)filter2 << "QOrganizerItemFilter(QOrganizerItemIdFilter(ids=(QOrganizerItemId(5), QOrganizerItemId(6), QOrganizerItemId(17)) ))";
- QOrganizerItemDetailFilter dfil;
+ QOrganizerItemDetailFieldFilter dfil;
QOrganizerItemIdFilter filter3(dfil);
QTest::newRow("Id") << (QOrganizerItemFilter)filter3 << "QOrganizerItemFilter(QOrganizerItemIdFilter(ids=() ))";
@@ -1494,17 +1667,17 @@ void tst_QOrganizerItemFilter::testDebugStreamOut_data()
QTest::newRow("intersection") << (QOrganizerItemFilter)filter << "QOrganizerItemFilter(QOrganizerItemIntersectionFilter(filters=() ))";
// Test boolean ops
- QOrganizerItemDetailFilter filter1;
+ QOrganizerItemDetailFieldFilter filter1;
filter1.setDetail(QOrganizerItemDetail::TypeComment, QOrganizerItemComment::FieldComment);
- QOrganizerItemDetailFilter filter2;
+ QOrganizerItemDetailFieldFilter filter2;
filter2.setDetail(QOrganizerItemDetail::TypeDescription, QOrganizerItemDescription::FieldDescription);
- QOrganizerItemDetailFilter filter3;
+ QOrganizerItemDetailFieldFilter filter3;
filter3.setDetail(QOrganizerItemDetail::TypeDisplayLabel, QOrganizerItemDisplayLabel::FieldLabel);
filter << filter1 << filter2;
- QTest::newRow("intersection") << (QOrganizerItemFilter)filter << "QOrganizerItemFilter(QOrganizerItemIntersectionFilter(filters=(QOrganizerItemFilter(QOrganizerItemDetailFilter(detailType=200,detailField=201,value=QVariant(Invalid) ,matchFlags=0)), QOrganizerItemFilter(QOrganizerItemDetailFilter(detailType=300,detailField=301,value=QVariant(Invalid) ,matchFlags=0))) ))";
+ QTest::newRow("intersection") << (QOrganizerItemFilter)filter << "QOrganizerItemFilter(QOrganizerItemIntersectionFilter(filters=(QOrganizerItemFilter(QOrganizerItemDetailFieldFilter(detailType=200,detailField=201,value=QVariant(Invalid) ,matchFlags=0)), QOrganizerItemFilter(QOrganizerItemDetailFieldFilter(detailType=300,detailField=301,value=QVariant(Invalid) ,matchFlags=0))) ))";
}
{
@@ -1517,18 +1690,18 @@ void tst_QOrganizerItemFilter::testDebugStreamOut_data()
QTest::newRow("union") << (QOrganizerItemFilter)filter << "QOrganizerItemFilter(QOrganizerItemUnionFilter(filters=() ))";
// Test boolean ops
- QOrganizerItemDetailFilter df;
+ QOrganizerItemDetailFieldFilter df;
df.setDetail(QOrganizerItemDetail::TypeComment, QOrganizerItemComment::FieldComment);
- QOrganizerItemDetailFilter df2;
+ QOrganizerItemDetailFieldFilter df2;
df2.setDetail(QOrganizerItemDetail::TypeDescription, QOrganizerItemDescription::FieldDescription);
- QOrganizerItemDetailFilter df3;
+ QOrganizerItemDetailFieldFilter df3;
df3.setDetail(QOrganizerItemDetail::TypeDisplayLabel, QOrganizerItemDisplayLabel::FieldLabel);
QOrganizerItemUnionFilter bf;
bf << df << df2;
- QTest::newRow("union") << (QOrganizerItemFilter)bf << "QOrganizerItemFilter(QOrganizerItemUnionFilter(filters=(QOrganizerItemFilter(QOrganizerItemDetailFilter(detailType=200,detailField=201,value=QVariant(Invalid) ,matchFlags=0)), QOrganizerItemFilter(QOrganizerItemDetailFilter(detailType=300,detailField=301,value=QVariant(Invalid) ,matchFlags=0))) ))";
+ QTest::newRow("union") << (QOrganizerItemFilter)bf << "QOrganizerItemFilter(QOrganizerItemUnionFilter(filters=(QOrganizerItemFilter(QOrganizerItemDetailFieldFilter(detailType=200,detailField=201,value=QVariant(Invalid) ,matchFlags=0)), QOrganizerItemFilter(QOrganizerItemDetailFieldFilter(detailType=300,detailField=301,value=QVariant(Invalid) ,matchFlags=0))) ))";
}
}
diff --git a/tests/auto/organizer/qorganizermanager/tst_qorganizermanager.cpp b/tests/auto/organizer/qorganizermanager/tst_qorganizermanager.cpp
index b2ebada01..ab04f2360 100644
--- a/tests/auto/organizer/qorganizermanager/tst_qorganizermanager.cpp
+++ b/tests/auto/organizer/qorganizermanager/tst_qorganizermanager.cpp
@@ -1865,15 +1865,15 @@ void tst_QOrganizerManager::invalidManager()
/* filters */
QOrganizerItemFilter f; // matches everything
- QOrganizerItemDetailFilter df;
- df.setDetail(QOrganizerItemDetail::TypeDisplayLabel, QOrganizerItemDisplayLabel::FieldLabel);
+ QOrganizerItemDetailFieldFilter dff;
+ dff.setDetail(QOrganizerItemDetail::TypeDisplayLabel, QOrganizerItemDisplayLabel::FieldLabel);
QVERIFY(manager.itemIds(QDateTime(), QDateTime(), QOrganizerItemFilter()).count() == 0);
QVERIFY(manager.error() == QOrganizerManager::NotSupportedError);
- QVERIFY(manager.itemIds(QDateTime(), QDateTime(), df).count() == 0);
+ QVERIFY(manager.itemIds(QDateTime(), QDateTime(), dff).count() == 0);
QVERIFY(manager.error() == QOrganizerManager::NotSupportedError);
QVERIFY(manager.itemIds(QDateTime(), QDateTime(), f | f).count() == 0);
QVERIFY(manager.error() == QOrganizerManager::NotSupportedError);
- QVERIFY(manager.itemIds(QDateTime(), QDateTime(), df | df).count() == 0);
+ QVERIFY(manager.itemIds(QDateTime(), QDateTime(), dff | dff).count() == 0);
QVERIFY(manager.error() == QOrganizerManager::NotSupportedError);
QVERIFY(manager.supportedFilters().size() == 0);
@@ -2920,8 +2920,8 @@ void tst_QOrganizerManager::testFilterFunction()
QVERIFY(fdf.type() == QOrganizerItemFilter::DefaultFilter);
QVERIFY(QOrganizerManagerEngine::testFilter(fdf, item));
- // Test for QOrganizerItemFilter::OrganizerItemDetailFilter:
- QOrganizerItemDetailFilter fdef;
+ // Test for QOrganizerItemFilter::OrganizerItemDetailFieldFilter:
+ QOrganizerItemDetailFieldFilter fdef;
fdef.setDetail(QOrganizerItemDetail::TypeDisplayLabel, QOrganizerItemDisplayLabel::FieldLabel);
fdef.setValue("invalid");
// test for nonexistent label
@@ -3005,6 +3005,8 @@ void tst_QOrganizerManager::itemFilterFetch()
// Preparations
QFETCH(QString, uri);
QScopedPointer<QOrganizerManager> cm(QOrganizerManager::fromUri(uri));
+ QOrganizerItemExtendedDetail extDetail;
+ QOrganizerItemComment comment;
cm->removeItems(cm->itemIds()); // empty the calendar to prevent the previous test from interfering this one
for (int i=0; i<6; i++) {
QOrganizerEvent event;
@@ -3016,7 +3018,6 @@ void tst_QOrganizerManager::itemFilterFetch()
event.setPriority(QOrganizerItemPriority::VeryLowPriority);
} else if (i==1) {
// 2
- QOrganizerItemComment comment;
comment.setComment("my comment");
event.saveDetail(&comment);
} else if (i==2) {
@@ -3034,7 +3035,6 @@ void tst_QOrganizerManager::itemFilterFetch()
event.setEndDateTime(QDateTime(QDate(2010, 10, 10), QTime(11, 0, 0)));
} else if (i==5) {
// 6
- QOrganizerItemExtendedDetail extDetail;
extDetail.setName("DetailOfMine");
extDetail.setData(42);
event.saveDetail(&extDetail);
@@ -3043,44 +3043,120 @@ void tst_QOrganizerManager::itemFilterFetch()
}
QCOMPARE(cm->items().count(), 6);
- // Checks
- QOrganizerItemDetailFilter dfil;
+ // DetailFieldFilter Checks
+ QOrganizerItemDetailFieldFilter dFieldFilter;
// 1
- dfil.setDetail(QOrganizerItemDetail::TypePriority, QOrganizerItemPriority::FieldPriority);
- dfil.setValue(QOrganizerItemPriority::VeryHighPriority);
- QCOMPARE(cm->items(QDateTime(), QDateTime(), dfil).count(), 0);
- dfil.setValue(QOrganizerItemPriority::VeryLowPriority);
- QCOMPARE(cm->items(QDateTime(), QDateTime(), dfil).count(), 1);
+ dFieldFilter.setDetail(QOrganizerItemDetail::TypePriority, QOrganizerItemPriority::FieldPriority);
+ dFieldFilter.setValue(QOrganizerItemPriority::VeryHighPriority);
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 0);
+ dFieldFilter.setValue(QOrganizerItemPriority::VeryLowPriority);
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 1);
// 2
- dfil.setDetail(QOrganizerItemDetail::TypeComment, QOrganizerItemComment::FieldComment);
- dfil.setValue("my comment");
- QCOMPARE(cm->items(QDateTime(), QDateTime(), dfil).count(), 1);
+ dFieldFilter.setDetail(QOrganizerItemDetail::TypeComment, QOrganizerItemComment::FieldComment);
+ dFieldFilter.setValue("my comment");
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 1);
// 3-4
- dfil.setDetail(QOrganizerItemDetail::TypeDisplayLabel, QOrganizerItemDisplayLabel::FieldLabel);
- dfil.setValue("my 3rd event!");
- QCOMPARE(cm->items(QDateTime(), QDateTime(), dfil).count(), 1);
- dfil.setMatchFlags(QOrganizerItemFilter::MatchEndsWith);
- QCOMPARE(cm->items(QDateTime(), QDateTime(), dfil).count(), 1);
- dfil.setValue("event!");
- QCOMPARE(cm->items(QDateTime(), QDateTime(), dfil).count(), 2);
- dfil.setValue("event");
- dfil.setMatchFlags(QOrganizerItemFilter::MatchContains);
- QCOMPARE(cm->items(QDateTime(), QDateTime(), dfil).count(), cm->items().count());
- dfil.setValue("my");
- QCOMPARE(cm->items(QDateTime(), QDateTime(), dfil).count(), 2);
- dfil.setMatchFlags(QOrganizerItemFilter::MatchStartsWith);
- QCOMPARE(cm->items(QDateTime(), QDateTime(), dfil).count(), 2);
- dfil.setValue("event");
- QCOMPARE(cm->items(QDateTime(), QDateTime(), dfil).count(), 4);
+ dFieldFilter.setDetail(QOrganizerItemDetail::TypeDisplayLabel, QOrganizerItemDisplayLabel::FieldLabel);
+ dFieldFilter.setValue("my 3rd event!");
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 1);
+ dFieldFilter.setMatchFlags(QOrganizerItemFilter::MatchEndsWith);
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 1);
+ dFieldFilter.setValue("event!");
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 2);
+ dFieldFilter.setValue("event");
+ dFieldFilter.setMatchFlags(QOrganizerItemFilter::MatchContains);
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), cm->items().count());
+ dFieldFilter.setValue("my");
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 2);
+ dFieldFilter.setMatchFlags(QOrganizerItemFilter::MatchStartsWith);
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 2);
+ dFieldFilter.setValue("event");
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 4);
// 5
- dfil.setMatchFlags(QOrganizerItemFilter::MatchExactly);
- dfil.setDetail(QOrganizerItemDetail::TypeEventTime, QOrganizerEventTime::FieldEndDateTime);
- dfil.setValue(QDateTime(QDate(2010, 10, 10), QTime(11, 0, 0)));
- QCOMPARE(cm->items(QDateTime(), QDateTime(), dfil).count(), 1);
+ dFieldFilter.setMatchFlags(QOrganizerItemFilter::MatchExactly);
+ dFieldFilter.setDetail(QOrganizerItemDetail::TypeEventTime, QOrganizerEventTime::FieldEndDateTime);
+ dFieldFilter.setValue(QDateTime(QDate(2010, 10, 10), QTime(11, 0, 0)));
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 1);
// 6
- dfil.setDetail(QOrganizerItemDetail::TypeExtendedDetail, QOrganizerItemExtendedDetail::FieldName);
- dfil.setValue("DetailOfMine");
- QCOMPARE(cm->items(QDateTime(), QDateTime(), dfil).count(), 1);
+ dFieldFilter.setDetail(QOrganizerItemDetail::TypeExtendedDetail, QOrganizerItemExtendedDetail::FieldName);
+ dFieldFilter.setValue("DetailOfMine");
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 1);
+
+ // DetailFilter Checks: Compatibility with deprecated API
+ //TODO: remove when cleaning up detailFilter API
+ if (cm->managerName() == QStringLiteral("memory")) {
+ QOrganizerItemDetailFilter dFieldFilter;
+ // 1
+ dFieldFilter.setDetail(QOrganizerItemDetail::TypePriority, QOrganizerItemPriority::FieldPriority);
+ dFieldFilter.setValue(QOrganizerItemPriority::VeryHighPriority);
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 0);
+ dFieldFilter.setValue(QOrganizerItemPriority::VeryLowPriority);
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 1);
+ // 2
+ dFieldFilter.setDetail(QOrganizerItemDetail::TypeComment, QOrganizerItemComment::FieldComment);
+ dFieldFilter.setValue("my comment");
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 1);
+ // 3-4
+ dFieldFilter.setDetail(QOrganizerItemDetail::TypeDisplayLabel, QOrganizerItemDisplayLabel::FieldLabel);
+ dFieldFilter.setValue("my 3rd event!");
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 1);
+ dFieldFilter.setMatchFlags(QOrganizerItemFilter::MatchEndsWith);
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 1);
+ dFieldFilter.setValue("event!");
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 2);
+ dFieldFilter.setValue("event");
+ dFieldFilter.setMatchFlags(QOrganizerItemFilter::MatchContains);
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), cm->items().count());
+ dFieldFilter.setValue("my");
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 2);
+ dFieldFilter.setMatchFlags(QOrganizerItemFilter::MatchStartsWith);
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 2);
+ dFieldFilter.setValue("event");
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 4);
+ // 5
+ dFieldFilter.setMatchFlags(QOrganizerItemFilter::MatchExactly);
+ dFieldFilter.setDetail(QOrganizerItemDetail::TypeEventTime, QOrganizerEventTime::FieldEndDateTime);
+ dFieldFilter.setValue(QDateTime(QDate(2010, 10, 10), QTime(11, 0, 0)));
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 1);
+ // 6
+ dFieldFilter.setDetail(QOrganizerItemDetail::TypeExtendedDetail, QOrganizerItemExtendedDetail::FieldName);
+ dFieldFilter.setValue("DetailOfMine");
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFieldFilter).count(), 1);
+ }
+
+ // DetailFilter Checks
+ if (cm->managerName() == QStringLiteral("memory")) {
+ QOrganizerItemDetailFilter dFilter;
+ // 1
+ QOrganizerItemPriority priority;
+ priority.setPriority(QOrganizerItemPriority::VeryHighPriority);
+ dFilter.setDetail(priority);
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFilter).count(), 0);
+ priority.setPriority(QOrganizerItemPriority::VeryLowPriority);
+ dFilter.setDetail(priority);
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFilter).count(), 1);
+ // 2
+ dFilter.setDetail(comment);
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFilter).count(), 1);
+ // 3-4
+ QOrganizerItemDisplayLabel displayLabel;
+ displayLabel.setLabel(QStringLiteral("my 3rd event!"));
+ dFilter.setDetail(displayLabel);
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFilter).count(), 1);
+ displayLabel.setLabel(QStringLiteral("my non existing event!"));
+ dFilter.setDetail(displayLabel);
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFilter).count(), 0);
+ // 5
+ QOrganizerEventTime eventTime;
+ eventTime.setEndDateTime(QDateTime(QDate(2010, 10, 10), QTime(11, 0, 0)));
+ eventTime.setStartDateTime(QDateTime(QDate(2010, 9, 9), QTime(11, 0, 0)));
+ dFilter.setDetail(eventTime);
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFilter).count(), 1);
+ // 6
+ dFilter.setDetail(extDetail);
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dFilter).count(), 1);
+ }
+
}
void tst_QOrganizerManager::itemFetch()
@@ -3200,11 +3276,11 @@ void tst_QOrganizerManager::itemFetch()
QCOMPARE(eventOccurrenceCount, 1);
//make a parent filter and test item count
- QOrganizerItemDetailFilter df;
- df.setDetail(QOrganizerItemDetail::TypeParent, QOrganizerItemParent::FieldParentId);
- df.setValue(QVariant::fromValue(recEvent.id()));
- QCOMPARE(cm->items(QDateTime(), QDateTime(), df).count(), 3);
- QCOMPARE(cm->itemsForExport(QDateTime(), QDateTime(), df).count(), 2);
+ QOrganizerItemDetailFieldFilter dff;
+ dff.setDetail(QOrganizerItemDetail::TypeParent, QOrganizerItemParent::FieldParentId);
+ dff.setValue(QVariant::fromValue(recEvent.id()));
+ QCOMPARE(cm->items(QDateTime(), QDateTime(), dff).count(), 3);
+ QCOMPARE(cm->itemsForExport(QDateTime(), QDateTime(), dff).count(), 2);
// third, have all occurrences persisted
items = cm->items();
@@ -4776,14 +4852,14 @@ void tst_QOrganizerManager::testNestCompoundFilter()
itemList = mgr->items(QDateTime(), QDateTime(), collectionFilter);
QCOMPARE(itemList.size(), 2);
//event
- QOrganizerItemDetailFilter detailFilter;
- detailFilter.setDetail(QOrganizerItemDetail::TypeItemType, QOrganizerItemType::FieldType);
- detailFilter.setValue(QOrganizerItemType::TypeEvent);
- itemList = mgr->items(QDateTime(), QDateTime(), detailFilter);
+ QOrganizerItemDetailFieldFilter detailFieldFilter;
+ detailFieldFilter.setDetail(QOrganizerItemDetail::TypeItemType, QOrganizerItemType::FieldType);
+ detailFieldFilter.setValue(QOrganizerItemType::TypeEvent);
+ itemList = mgr->items(QDateTime(), QDateTime(), detailFieldFilter);
QVERIFY(itemList.size() >= 2);
//event + collection
QOrganizerItemIntersectionFilter intersFilter;
- intersFilter.append(detailFilter);
+ intersFilter.append(detailFieldFilter);
intersFilter.append(collectionFilter);
itemList = mgr->items(QDateTime(), QDateTime(), intersFilter);
QCOMPARE(itemList.size(), 1);
@@ -4799,15 +4875,15 @@ void tst_QOrganizerManager::testNestCompoundFilter()
QCOMPARE(itemList[0].id(), event1.id());
//case 2: myTodo or event + collection + id
- QOrganizerItemDetailFilter detailFilter2;
- detailFilter2.setDetail(QOrganizerItemDetail::TypeDisplayLabel, QOrganizerItemDisplayLabel::FieldLabel);
- detailFilter2.setValue("myTodo");
- itemList = mgr->items(QDateTime(), QDateTime(), detailFilter2);
+ QOrganizerItemDetailFieldFilter detailFieldFilter2;
+ detailFieldFilter2.setDetail(QOrganizerItemDetail::TypeDisplayLabel, QOrganizerItemDisplayLabel::FieldLabel);
+ detailFieldFilter2.setValue("myTodo");
+ itemList = mgr->items(QDateTime(), QDateTime(), detailFieldFilter2);
QCOMPARE(itemList.size(), 1);
QOrganizerItemUnionFilter unf2;
- unf2.append(detailFilter2);
- unf2.append(detailFilter);
+ unf2.append(detailFieldFilter2);
+ unf2.append(detailFieldFilter);
itemList = mgr->items(QDateTime(), QDateTime(), unf2);
QVERIFY(itemList.size() >= 3);