--- a/plugins/contacts/symbian/plugin/src/filtering/cntfilterdetail.cpp Fri Sep 17 08:34:34 2010 +0300
+++ b/plugins/contacts/symbian/plugin/src/filtering/cntfilterdetail.cpp Mon Oct 04 01:37:06 2010 +0300
@@ -44,7 +44,6 @@
#include "cntfilterdetail.h"
#include "cntfilterdetaildisplaylabel.h" //todo rename class to follow naming pattern CntFilterDetailDisplayLabel
-#include "cntsqlsearch.h"
#include "cntsymbianengine.h"
#include "cnttransformphonenumber.h"
@@ -76,10 +75,10 @@
bool &filterSupportedflag,
QContactManager::Error* error)
{
- Q_UNUSED(filterSupportedflag);
//Check if any invalid filter is passed
if (!filterSupported(filter) ) {
*error = QContactManager::NotSupportedError;
+ filterSupportedflag = false;
return QList<QContactLocalId>();
}
QList<QContactLocalId> idList;
@@ -118,7 +117,16 @@
{
bool result = false;
if (QContactFilter::ContactDetailFilter == filter.type()) {
- result = true;
+ QContactDetailFilter detailFilter = static_cast<QContactFilter>(filter);
+ if (m_dbInfo.SupportsDetail(detailFilter.detailDefinitionName(),
+ detailFilter.detailFieldName())) {
+ result = true;
+ }
+ if (detailFilter.detailDefinitionName() == QContactPhoneNumber::DefinitionName &&
+ detailFilter.detailFieldName() == QContactPhoneNumber::FieldNumber) {
+ //cpecial case - phone number matching
+ result = true;
+ }
}
return result;
}
@@ -255,26 +263,26 @@
QList<QContactLocalId> CntFilterDetail::HandlePredictiveSearchFilter(const QContactFilter& filter,
QContactManager::Error* error)
{
- QString sqlQuery;
-
if (filter.type() == QContactFilter::ContactDetailFilter) {
- const QContactDetailFilter detailFilter(filter);
- if (detailFilter.matchFlags() == QContactFilter::MatchKeypadCollation) {
- CntSqlSearch sqlSearch;
- //convert string to numeric format
+ const QContactDetailFilter detailFilter(filter);
+ if (detailFilter.matchFlags() == QContactFilter::MatchKeypadCollation) {
QString pattern = detailFilter.value().toString();
- sqlQuery = sqlSearch.CreatePredictiveSearch(pattern);
- return m_srvConnection.searchContacts(sqlQuery, error);
- }
- else {
- return QList<QContactLocalId>();
- }
+ //if ( detailFilter.detailFieldName() == QContactEmailAddress::FieldEmailAddress ) {
+ return m_srvConnection.searchOnServer(
+ pattern, CntSymbianSrvConnection::CntPredictiveSearchList, error);
+ /*} else {
+ QString sqlQuery;
+ CntSqlSearch sqlSearch;
+ //convert string to numeric format
+ sqlQuery = sqlSearch.CreatePredictiveSearch(pattern);
+ return m_srvConnection.searchContacts(sqlQuery, error);
+ }*/
+ }
}
- else {
- return QList<QContactLocalId>();
- }
+ return QList<QContactLocalId>();
}
+
/*
* Creates an sql query to fetch contact item IDs for all the contact items
* which may contain the specified telephone number in a telephone, fax
@@ -339,11 +347,55 @@
}
else {
// Checking the upper digits...
- TMatch phoneNumber = createPhoneMatchNumber(
- numberPtr, numLowerDigits, numUpperDigits, error);
- QString fieldToMatch = QString(" LIKE '%1").arg(phoneNumber.iUpperDigits) + "%'" ;
- whereClause += " AND extra_value" + fieldToMatch;
- sqlQuery = "SELECT contact_id FROM comm_addr" + whereClause;
+
+ // select fields for contacts that match phone lookup
+ // SELECT contact_id, extra_value FROM comm_addr
+ // WHERE value = [value string] AND type = [type value];
+ //
+ QString type = QString(" type = %1").arg(CntDbInfo::EPhoneNumber);
+ QString value = QString(" value = %1").arg(phoneDigits.iLowerSevenDigits);
+ QString whereClause = " WHERE" + value + " AND" + type;
+ sqlQuery = "SELECT contact_id, extra_value FROM comm_addr" + whereClause;
+
+ QList<QPair<QContactLocalId, QString> > contactMatches = m_srvConnection.searchPhoneNumbers(sqlQuery, error);
+
+ // Check if search query was successful
+ if (*error != QContactManager::NoError) {
+ return;
+ }
+
+ QStringList list;
+ for (int i=0; i<contactMatches.count(); ++i) {
+ // Check the upper digits...
+ TInt32 storedUpperDigits(0);
+ QString extraValue = contactMatches.at(i).second;
+ TPtrC extValString(reinterpret_cast<const TUint16*>(extraValue.utf16()));
+ if (TLex(extValString).Val(storedUpperDigits) == KErrNone) {
+
+ const TInt KDigitsToRemove = KMaxPhoneMatchLength - KLowerSevenDigits - phoneDigits.iNumUpperDigits;
+ for (TInt j = 0; j < KDigitsToRemove; ++j) {
+ // repeatedly divide by 10 to lop off the appropriate number of digits from the right
+ storedUpperDigits /= 10;
+ }
+
+ storedUpperDigits = TMatch::padOutPhoneMatchNumber(storedUpperDigits, KDigitsToRemove);
+
+ if (phoneDigits.iUpperDigits == storedUpperDigits) {
+ list.append(QString("%1").arg(contactMatches.at(i).first));
+ }
+ }
+ else {
+ *error = QContactManager::UnspecifiedError;
+ }
+ }
+ // Recreate query to fetch all match ids
+ // SELECT DISTINCT contact_id FROM contact WHERE contact_id in (
+ // ..
+ // )
+ QString ids = list.join(" ,");
+ sqlQuery = "SELECT DISTINCT contact_id FROM contact WHERE contact_id in (";
+ sqlQuery += ids;
+ sqlQuery += ')';
}
// refine search
@@ -439,7 +491,7 @@
TMatch phoneNumber = createPhoneMatchNumber(
number, numLowerDigits, numUpperDigits, error);
if (*error == QContactManager::NoError) {
- if (phoneNumber.iNumLowerDigits + phoneNumber.iUpperDigits == 0) {
+ if (phoneNumber.iNumLowerDigits + phoneNumber.iNumUpperDigits == 0) {
// No digits, do nothing
}
else if (phoneNumber.iNumLowerDigits < KLowerSevenDigits) {