plugins/contacts/symbian/plugin/src/filtering/cntfilterdetail.cpp
changeset 5 603d3f8b6302
parent 0 876b1a06bc25
--- 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) {