Changes: Drop usage of emitResultLater
[qtcontacts-tracker:qtcontacts-tracker.git] / src / engine / contactidfetchrequest.cpp
1 /** This file is part of QtContacts tracker storage plugin
2  **
3  ** Copyright (c) 2010-2011 Nokia Corporation and/or its subsidiary(-ies).
4  **
5  ** Contact:  Nokia Corporation (info@qt.nokia.com)
6  **
7  ** GNU Lesser General Public License Usage
8  ** This file may be used under the terms of the GNU Lesser General Public License
9  ** version 2.1 as published by the Free Software Foundation and appearing in the
10  ** file LICENSE.LGPL included in the packaging of this file.  Please review the
11  ** following information to ensure the GNU Lesser General Public License version
12  ** 2.1 requirements will be met:
13  ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
14  **
15  ** In addition, as a special exception, Nokia gives you certain additional rights.
16  ** These rights are described in the Nokia Qt LGPL Exception version 1.1, included
17  ** in the file LGPL_EXCEPTION.txt in this package.
18  **
19  ** Other Usage
20  ** Alternatively, this file may be used in accordance with the terms and
21  ** conditions contained in a signed written agreement between you and Nokia.
22  **/
23
24 #include "contactidfetchrequest.h"
25
26 #include "dao/contactdetailschema.h"
27 #include "dao/scalarquerybuilder.h"
28 #include "dao/sparqlconnectionmanager.h"
29 #include "engine/engine.h"
30
31 #include <ontologies/rdf.h>
32 #include <QtSparql>
33
34 ///////////////////////////////////////////////////////////////////////////////////////////////////
35
36 CUBI_USE_NAMESPACE
37
38 ///////////////////////////////////////////////////////////////////////////////////////////////////
39
40 QTrackerContactIdFetchRequest::QTrackerContactIdFetchRequest(QContactAbstractRequest *request,
41                                                              QContactTrackerEngine *engine,
42                                                              QObject *parent)
43     : QTrackerBaseRequest<QContactLocalIdFetchRequest>(engine, parent)
44     , m_filter(staticCast(request)->filter())
45 {
46 }
47
48 QTrackerContactIdFetchRequest::~QTrackerContactIdFetchRequest()
49 {
50 }
51
52 QString
53 QTrackerContactIdFetchRequest::buildQuery(QContactManager::Error &error)
54 {
55     Select select;
56     PatternBase base;
57
58     Variable contact = Variable(QLatin1String("contact"));
59     select.addProjection(Functions::trackerId.apply(contact));
60
61     foreach(const QString &contactType, engine()->supportedContactTypes()) {
62         PatternGroup group;
63         Filter filter;
64         const QTrackerContactDetailSchema &schema = engine()->schema(contactType);
65
66         // add restrictions from request filters
67         QTrackerScalarContactQueryBuilder queryBuilder(schema, engine()->managerUri());
68
69         error = queryBuilder.bindFilter(m_filter, filter);
70
71         if (error != QContactManager::NoError) {
72             return QString();
73         }
74
75         foreach(const QString &classIri, schema.contactClassIris()) {
76             ResourceValue iri = ResourceValue(classIri);
77             group.addPattern(contact, Resources::rdf::type::resource(), iri);
78         }
79
80         group.setFilter(filter);
81
82         if (not base.isValid()) {
83             base = group;
84         } else {
85             base = Union(base, group);
86         }
87     }
88
89     error = QContactManager::NoError;
90     select.addRestriction(base);
91
92     return select.sparql();
93 }
94
95 void
96 QTrackerContactIdFetchRequest::run()
97 {
98     if (canceled()) {
99         emitResult();
100         return;
101     }
102
103     // build the SPARQL query
104     QContactManager::Error error = QContactManager::UnspecifiedError;
105     const QString queryString = buildQuery(error);
106
107     if (error != QContactManager::NoError) {
108         setLastError(error);
109         emitResult();
110         return;
111     }
112
113     QScopedPointer<QSparqlResult> result(runQuery(QSparqlQuery(queryString), SyncQueryOptions));
114
115     if (result.isNull()) {
116         // runQuery() called reportError()
117         return;
118     }
119
120     // We use a QSet because we want to eliminate duplicates.
121     // In case of unioned QContactDetailFilter (for instance), the same localId
122     // may be included multiple times; this is undesirable.
123     while(not canceled() && result->next()) {
124         if (engine()->hasDebugFlag(QContactTrackerEngine::ShowModels)) {
125             qDebug() << result->current();
126         }
127
128         m_localIds.insert(result->value(0).toUInt());
129     }
130
131     emitResult();
132 }
133
134 void
135 QTrackerContactIdFetchRequest::updateRequest(QContactManager::Error error)
136 {
137     engine()->updateContactLocalIdFetchRequest(staticCast(engine()->request(this).data()),
138                                                m_localIds.toList(), error,
139                                                QContactAbstractRequest::FinishedState);
140 }
141
142 ///////////////////////////////////////////////////////////////////////////////////////////////////
143
144 #include "moc_contactidfetchrequest.cpp"