Skip to content
This repository has been archived by the owner on Sep 4, 2021. It is now read-only.

Commit

Permalink
[performance] look up address resolve requests in a QHash
Browse files Browse the repository at this point in the history
This change does not affect normal performance but it guards
against bad performance when there are many resolve requests.

Thanks to Matthew Vogt for the idea.
  • Loading branch information
amtep committed Oct 21, 2014
1 parent e2ab061 commit 0d25bc4
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 57 deletions.
105 changes: 50 additions & 55 deletions src/seasidecache.cpp
Expand Up @@ -663,25 +663,23 @@ void SeasideCache::unregisterResolveListener(ResolveListener *listener)
if (!instancePtr)
return;

QList<ResolveData>::iterator it = instancePtr->m_resolveAddresses.begin();
QHash<QContactFetchRequest *, ResolveData>::iterator it = instancePtr->m_resolveAddresses.begin();
while (it != instancePtr->m_resolveAddresses.end()) {
if (it->listener == listener) {
if (it->fetchRequest) {
it->fetchRequest->cancel();
delete it->fetchRequest;
}
if (it.value().listener == listener) {
it.key()->cancel();
delete it.key();
it = instancePtr->m_resolveAddresses.erase(it);
} else {
++it;
}
}

it = instancePtr->m_unknownAddresses.begin();
while (it != instancePtr->m_unknownAddresses.end()) {
if (it->listener == listener) {
it = instancePtr->m_unknownAddresses.erase(it);
QList<ResolveData>::iterator it2 = instancePtr->m_unknownAddresses.begin();
while (it2 != instancePtr->m_unknownAddresses.end()) {
if (it2->listener == listener) {
it2 = instancePtr->m_unknownAddresses.erase(it2);
} else {
++it;
++it2;
}
}
}
Expand Down Expand Up @@ -2664,53 +2662,52 @@ void SeasideCache::addressRequestStateChanged(QContactAbstractRequest::State sta
applyContactUpdates(request->contacts(), queryDetailTypes);

// now figure out which address was being resolved and resolve it
QList<ResolveData>::iterator it = instancePtr->m_resolveAddresses.begin();
for ( ; it != instancePtr->m_resolveAddresses.end(); ++it) {
if (request == it->fetchRequest) {
ResolveData data(*it);
if (data.first == QString()) {
// We have now queried this phone number
m_resolvedPhoneNumbers.insert(minimizePhoneNumber(data.second));
}
QHash<QContactFetchRequest *, ResolveData>::iterator it = instancePtr->m_resolveAddresses.find(request);
if (it == instancePtr->m_resolveAddresses.end()) {
qWarning() << "Got stateChanged for unknown request";
return;
}

CacheItem *item = 0;
QList<QContact> resolvedContacts(data.fetchRequest->contacts());
delete data.fetchRequest;
data.fetchRequest = 0;
ResolveData data(it.value());
if (data.first == QString()) {
// We have now queried this phone number
m_resolvedPhoneNumbers.insert(minimizePhoneNumber(data.second));
}

if (!resolvedContacts.isEmpty()) {
if (resolvedContacts.count() == 1) {
item = itemById(apiId(resolvedContacts.first()), false);
} else {
// Lookup the result in our updated indexes
if (data.first == QString()) {
item = itemByPhoneNumber(data.second, false);
} else if (data.second == QString()) {
item = itemByEmailAddress(data.first, false);
} else {
item = itemByOnlineAccount(data.first, data.second, false);
}
}
} else {
// This address is unknown - keep it for later resolution
if (data.first == QString()) {
// Compare this phone number in minimized form
data.compare = minimizePhoneNumber(data.second);
} else if (data.second == QString()) {
// Compare this email address in lowercased form
data.compare = data.first.toLower();
} else {
// Compare this account URI in lowercased form
data.compare = data.second.toLower();
}
CacheItem *item = 0;
const QList<QContact> &resolvedContacts = it.key()->contacts();

m_unknownAddresses.append(data);
if (!resolvedContacts.isEmpty()) {
if (resolvedContacts.count() == 1) {
item = itemById(apiId(resolvedContacts.first()), false);
} else {
// Lookup the result in our updated indexes
if (data.first == QString()) {
item = itemByPhoneNumber(data.second, false);
} else if (data.second == QString()) {
item = itemByEmailAddress(data.first, false);
} else {
item = itemByOnlineAccount(data.first, data.second, false);
}
data.listener->addressResolved(data.first, data.second, item);
m_resolveAddresses.erase(it);
return;
}
} else {
// This address is unknown - keep it for later resolution
if (data.first == QString()) {
// Compare this phone number in minimized form
data.compare = minimizePhoneNumber(data.second);
} else if (data.second == QString()) {
// Compare this email address in lowercased form
data.compare = data.first.toLower();
} else {
// Compare this account URI in lowercased form
data.compare = data.second.toLower();
}

m_unknownAddresses.append(data);
}
data.listener->addressResolved(data.first, data.second, item);
delete it.key();
m_resolveAddresses.erase(it);
}

void SeasideCache::makePopulated(FilterType filter)
Expand Down Expand Up @@ -3080,7 +3077,6 @@ void SeasideCache::resolveAddress(ResolveListener *listener, const QString &firs
data.second = second;
data.requireComplete = requireComplete;
data.listener = listener;
data.fetchRequest = 0;

// Is this address a known-unknown?
bool knownUnknown = false;
Expand All @@ -3098,7 +3094,6 @@ void SeasideCache::resolveAddress(ResolveListener *listener, const QString &firs
} else {
QContactFetchRequest *request = new QContactFetchRequest(this);
request->setManager(manager());
data.fetchRequest = request;

if (first.isEmpty()) {
// Search for phone number
Expand Down Expand Up @@ -3130,7 +3125,7 @@ void SeasideCache::resolveAddress(ResolveListener *listener, const QString &firs
request->setFetchHint(requireComplete ? basicFetchHint() : favoriteFetchHint(m_fetchTypes | m_extraFetchTypes));
connect(request, SIGNAL(stateChanged(QContactAbstractRequest::State)),
this, SLOT(addressRequestStateChanged(QContactAbstractRequest::State)));
m_resolveAddresses.append(data);
m_resolveAddresses[request] = data;
request->start();
}
}
Expand Down
3 changes: 1 addition & 2 deletions src/seasidecache.h
Expand Up @@ -472,9 +472,8 @@ private slots:
QString compare;
bool requireComplete;
ResolveListener *listener;
QContactFetchRequest *fetchRequest;
};
QList<ResolveData> m_resolveAddresses;
QHash<QContactFetchRequest *, ResolveData> m_resolveAddresses;
QList<ResolveData> m_unknownResolveAddresses;
QList<ResolveData> m_unknownAddresses;
QSet<QString> m_resolvedPhoneNumbers;
Expand Down

0 comments on commit 0d25bc4

Please sign in to comment.