1 /*********************************************************************************
2 ** This file is part of QtContacts tracker storage plugin
4 ** Copyright (c) 2010-2011 Nokia Corporation and/or its subsidiary(-ies).
6 ** Contact: Nokia Corporation (info@qt.nokia.com)
8 ** GNU Lesser General Public License Usage
9 ** This file may be used under the terms of the GNU Lesser General Public License
10 ** version 2.1 as published by the Free Software Foundation and appearing in the
11 ** file LICENSE.LGPL included in the packaging of this file. Please review the
12 ** following information to ensure the GNU Lesser General Public License version
13 ** 2.1 requirements will be met:
14 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
16 ** In addition, as a special exception, Nokia gives you certain additional rights.
17 ** These rights are described in the Nokia Qt LGPL Exception version 1.1, included
18 ** in the file LGPL_EXCEPTION.txt in this package.
21 ** Alternatively, this file may be used in accordance with the terms and
22 ** conditions contained in a signed written agreement between you and Nokia.
23 *********************************************************************************/
25 #include "contactidfetchrequest.h"
27 #include "dao/contactdetailschema.h"
28 #include "dao/scalarquerybuilder.h"
29 #include "dao/sparqlconnectionmanager.h"
30 #include "engine/contactfetchrequest.h"
31 #include "engine/engine.h"
33 #include <ontologies/rdf.h>
36 ///////////////////////////////////////////////////////////////////////////////////////////////////
40 ///////////////////////////////////////////////////////////////////////////////////////////////////
42 QTrackerContactIdFetchRequest::QTrackerContactIdFetchRequest(QContactAbstractRequest *request,
43 QContactTrackerEngine *engine,
45 : QTrackerBaseRequest<QContactLocalIdFetchRequest>(engine, parent)
46 , m_filter(staticCast(request)->filter())
47 , m_sorting(staticCast(request)->sorting())
51 QTrackerContactIdFetchRequest::~QTrackerContactIdFetchRequest()
56 QTrackerContactIdFetchRequest::buildQuery(QContactManager::Error &error)
61 Variable contact = Variable(QLatin1String("contact"));
62 select.addProjection(Functions::trackerId.apply(contact));
64 foreach(const QString &contactType, engine()->supportedContactTypes()) {
67 const QTrackerContactDetailSchema &schema = engine()->schema(contactType);
69 // add restrictions from request filters
70 QTrackerScalarContactQueryBuilder queryBuilder(schema, engine()->managerUri());
72 error = queryBuilder.bindFilter(m_filter, filter);
74 if (error != QContactManager::NoError) {
78 foreach(const QString &classIri, schema.contactClassIris()) {
79 ResourceValue iri = ResourceValue(classIri);
80 group.addPattern(contact, Resources::rdf::type::resource(), iri);
83 group.setFilter(filter);
85 if (not base.isValid()) {
88 base = Union(base, group);
92 error = QContactManager::NoError;
93 select.addRestriction(base);
95 return select.sparql();
99 QTrackerContactIdFetchRequest::run()
105 if (m_sorting.isEmpty()) {
113 QTrackerContactIdFetchRequest::runNative()
115 // build the SPARQL query
116 QContactManager::Error error = QContactManager::UnspecifiedError;
117 const QString queryString = buildQuery(error);
119 if (error != QContactManager::NoError) {
124 QScopedPointer<QSparqlResult> result(runQuery(QSparqlQuery(queryString), SyncQueryOptions));
126 if (result.isNull()) {
127 // runQuery() called reportError()
131 // We use a QSet since we want to ensure there are no duplicates
132 QSet<QContactLocalId> localIds;
134 // We use a QSet because we want to eliminate duplicates.
135 // In case of unioned QContactDetailFilter (for instance), the same localId
136 // may be included multiple times; this is undesirable.
137 while(not isCanceled() && result->next()) {
138 if (engine()->hasDebugFlag(QContactTrackerEngine::ShowModels)) {
139 qDebug() << result->current();
142 localIds.insert(result->value(0).toUInt());
145 m_localIds = localIds.toList();
149 QTrackerContactIdFetchRequest::runEmulated()
151 // We only use emulated version for sorting
152 Q_ASSERT(not m_sorting.isEmpty());
154 if (engine()->hasDebugFlag(QContactTrackerEngine::ShowNotes)) {
155 qctWarn(QString::fromLatin1("Warning, using emulated localId fetch request"));
159 QContactFetchHint hint;
160 // An empty hint means "all details", therefore we pass at least one detail name here
161 hint.setDetailDefinitionsHint(QStringList() << m_sorting.first().detailDefinitionName());
163 QContactFetchRequest request;
164 request.setFetchHint(hint);
165 request.setSorting(m_sorting);
166 request.setFilter(m_filter);
168 QScopedPointer<QTrackerAbstractRequest>(engine()->createRequestWorker(&request))->exec();
170 if (request.error() != QContactManager::NoError) {
171 setLastError(request.error());
175 foreach(const QContact &contact, request.contacts()) {
176 if (engine()->hasDebugFlag(QContactTrackerEngine::ShowModels)) {
177 qDebug() << contact.localId();
180 // Here we do not need to check for duplicate ids, since the fetch request
182 m_localIds.append(contact.localId());
187 QTrackerContactIdFetchRequest::updateRequest(QContactManager::Error error)
189 engine()->updateContactLocalIdFetchRequest(staticCast(engine()->request(this).data()),
191 QContactAbstractRequest::FinishedState);
194 ///////////////////////////////////////////////////////////////////////////////////////////////////
196 #include "moc_contactidfetchrequest.cpp"