plugins/contacts/symbian/contactsmodel/cntplsql/src/cntsqlsearch.cpp
changeset 5 603d3f8b6302
parent 0 876b1a06bc25
--- a/plugins/contacts/symbian/contactsmodel/cntplsql/src/cntsqlsearch.cpp	Fri Sep 17 08:34:34 2010 +0300
+++ b/plugins/contacts/symbian/contactsmodel/cntplsql/src/cntsqlsearch.cpp	Mon Oct 04 01:37:06 2010 +0300
@@ -1,43 +1,18 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Retrieves the character map for each of the numeric keys.
+*/
 #include <QStringList>
 
 #include "cntsqlsearch.h"
@@ -86,23 +61,24 @@
 //Predictive search table
 const QString QwertyTableName = "qm";
 
-CntSqlSearch::CntSqlSearch()
-	{
-    QT_TRAP_THROWING(mQertyKeyMap = CQwertyKeyMap::NewL());
-    QT_TRAP_THROWING(mkeyKeyMap = C12keyKeyMap::NewL());
-	}
+CntSqlSearch::CntSqlSearch( const CPcsKeyMap& twelveKeyKeyMap,
+                            const CPcsKeyMap& qertyKeyMap ) 
+        
+    : mkeyKeyMap( static_cast<const C12keyKeyMap*>(&twelveKeyKeyMap) ),
+      mQertyKeyMap( static_cast<const CQwertyKeyMap*>(&qertyKeyMap) )
+    {
+    }
 
 CntSqlSearch::~CntSqlSearch()
     {
-    delete mQertyKeyMap;
-    delete mkeyKeyMap;
     }
+
 // Basic cases:
 // 1: "0", "5"
 // Just one digit. Select all contact ids from the table. No need to compare
 // values.
 //
-// 2: "123", "01", "10", "010", "00"
+// 2: "123", "01", "10", "00"
 // No zeros which have non-zeros in their both sides
 // One or zero tokens, when pattern is split using '0'.
 //
@@ -117,7 +93,7 @@
 // and those digits are not the same.
 // Two tokens, each with length of 1 and tokens are different.
 //
-// 5: "1023", "0102", "1010", "00100200", "10203", "01020304050"
+// 5: "1023", "1010", "00100200", "10203", "01020304050"
 // Two tokens, at least one of them has length > 1.
 // If tokens are identical, handle as case 3, otherwise handle as case 4.
 // ("10203" -> tokens "1" and "203"
@@ -126,7 +102,11 @@
 // 6: "10", "1000"
 // One token, ends with zero.
 // In this case, query should look-up first toke and number ("10", "1000").
-
+//
+// 7: "0102"
+// Same case 5, but first zero is remover in order to get more matches. 
+// e.g. 0102 is 01 AND 2 or 1 AND 2.
+//
 QString CntSqlSearch::CreatePredictiveSearch(const QString &pattern)
 	{
 	int len = pattern.length();
@@ -310,17 +290,16 @@
 QString CntSqlSearch::CreateQuery(const QString& pattern) const
 	{
 	QStringList tokens = GetTokens(pattern);
-	if (tokens.count() < KTwoTokens)
+	if (TestPattern(pattern, CntSqlSearch::ZeroIsFirstNumber))
+        {
+        return CompareTwoColumnsWithModifiedPattern(pattern, tokens);  // Case 7
+        }
+	else if(tokens.count() < KTwoTokens)
         {
 	    if (TestPattern(pattern, CntSqlSearch::ZerosEndOfFirstToken))
             {
             return TwoDifferentTokensSearch(pattern, tokens);  // Case 6
             }
-	    
-	    if (TestPattern(pattern, CntSqlSearch::ZeroIsFirstNumber))
-            {
-            return CompareTwoColumnsWithModifiedPattern(pattern, tokens);  // Case 7
-            }
         else
             {
             return ExactMatchSearch(pattern) + Order(tokens); // Case 2
@@ -334,7 +313,7 @@
             }
         else
             {
-            return IntersectionSearch(pattern, tokens); // Case 4
+            return IntersectionSearch(pattern, tokens); // Case 4 or 5 first token start with multible zeros.
             }
         }
 	}
@@ -502,15 +481,15 @@
 QString CntSqlSearch::TwoDifferentTokensSearch(const QString& pattern, const QStringList& tokens) const
         {
         QString token = tokens.at(0);
-        QString sortPatern = pattern;
-        sortPatern.truncate(pattern.length()-1);
+        /*QString sortPatern = pattern;
+        sortPatern.truncate(pattern.length()-1);*/
 #if defined(USE_DEMORGAN)
         QString query(SELECT_CONTACT_ID + SelectTable(pattern) + " WHERE NOT(NOT" +
-            ExactMatch(sortPatern) +
+            ExactMatch(token) +
         " AND NOT" + ExactMatch(pattern) + ")");
 #else
         QString query(SELECT_CONTACT_ID + SelectTable(pattern) + " WHERE (" +
-            ExactMatch(sortPatern) +  // exact match (e.g. "2")
+            ExactMatch(token) +  // exact match (e.g. "2")
         ") OR " + ExactMatch(pattern)); // exact match (e.g. "20")
 #endif
         query += Order(tokens);
@@ -527,26 +506,116 @@
         WHERE ((NOT(NOT(predictivesearch0.nbr>22517998136852479 AND predictivesearch0.nbr<27021597764222976) AND NOT(predictivesearch0.nbr2>22517998136852479 AND predictivesearch0.nbr2<27021597764222976) AND NOT(predictivesearch0.nbr3>22517998136852479 AND predictivesearch0.nbr3<27021597764222976) AND NOT(predictivesearch0.nbr4>22517998136852479 AND predictivesearch0.nbr4<27021597764222976)))) 
     ) AS PR
     ORDER BY PR.first_name, PR.last_name ASC;
+    
+    - AND case - 
+    SELECT contact_id FROM (
+    SELECT predictivesearch5.contact_id, predictivesearch5.first_name, predictivesearch5.last_name FROM predictivesearch5 WHERE NOT(NOT(NOT(NOT(nbr>382805968326492159 AND nbr<387309567953862656) AND NOT(nbr2>382805968326492159 AND nbr2<387309567953862656) AND NOT(nbr3>382805968326492159 AND nbr3<387309567953862656) AND NOT(nbr4>382805968326492159 AND nbr4<387309567953862656))) AND NOT(NOT(NOT(nbr2>360287970189639679 AND nbr2<432345564227567616 AND nbr>382805968326492159 AND nbr<387309567953862656) AND NOT(nbr3>360287970189639679 AND nbr3<432345564227567616 AND nbr>382805968326492159 AND nbr<387309567953862656) AND NOT(nbr3>360287970189639679 AND nbr3<432345564227567616 AND nbr2>382805968326492159 AND nbr2<387309567953862656) AND NOT(nbr4>360287970189639679 AND nbr4<432345564227567616 AND nbr>382805968326492159 AND nbr<387309567953862656) AND NOT(nbr4>360287970189639679 AND nbr4<432345564227567616 AND nbr2>382805968326492159 AND nbr2<387309567953862656) AND NOT(nbr4>360287970189639679 AND nbr4<432345564227567616 AND nbr3>382805968326492159 AND nbr3<387309567953862656))) AND NOT(NOT(NOT(nbr2>382805968326492159 AND nbr2<387309567953862656 AND nbr>360287970189639679 AND nbr<432345564227567616) AND NOT(nbr3>382805968326492159 AND nbr3<387309567953862656 AND nbr>360287970189639679 AND nbr<432345564227567616) AND NOT(nbr3>382805968326492159 AND nbr3<387309567953862656 AND nbr2>360287970189639679 AND nbr2<432345564227567616) AND NOT(nbr4>382805968326492159 AND nbr4<387309567953862656 AND nbr>360287970189639679 AND nbr<432345564227567616) AND NOT(nbr4>382805968326492159 AND nbr4<387309567953862656 AND nbr2>360287970189639679 AND nbr2<432345564227567616) AND NOT(nbr4>382805968326492159 AND nbr4<387309567953862656 AND nbr3>360287970189639679 AND nbr3<432345564227567616)))) 
+    UNION
+    SELECT predictivesearch0.contact_id, predictivesearch0.first_name, predictivesearch0.last_name FROM predictivesearch0 WHERE ((NOT(NOT(predictivesearch0.nbr>23930870578544639 AND predictivesearch0.nbr<23931970090172416) AND NOT(predictivesearch0.nbr2>23930870578544639 AND predictivesearch0.nbr2<23931970090172416) AND NOT(predictivesearch0.nbr3>23930870578544639 AND predictivesearch0.nbr3<23931970090172416) AND NOT(predictivesearch0.nbr4>23930870578544639 AND predictivesearch0.nbr4<23931970090172416)))) AND NOT(NOT(NOT(nbr2>360287970189639679 AND nbr2<432345564227567616 AND nbr>0387309567953862656382805968326492159 AND nbr<0387309567953862656382805968326492159) AND NOT(nbr3>360287970189639679 AND nbr3<432345564227567616 AND nbr>0387309567953862656382805968326492159 AND nbr<0387309567953862656382805968326492159) AND NOT(nbr3>360287970189639679 AND nbr3<432345564227567616 AND nbr2>0387309567953862656382805968326492159 AND nbr2<0387309567953862656382805968326492159) AND NOT(nbr4>360287970189639679 AND nbr4<432345564227567616 AND nbr>0387309567953862656382805968326492159 AND nbr<0387309567953862656382805968326492159) AND NOT(nbr4>360287970189639679 AND nbr4<432345564227567616 AND nbr2>0387309567953862656382805968326492159 AND nbr2<0387309567953862656382805968326492159) AND NOT(nbr4>360287970189639679 AND nbr4<432345564227567616 AND nbr3>0387309567953862656382805968326492159 AND nbr3<0387309567953862656382805968326492159))) AND NOT(NOT(NOT(nbr2>0387309567953862656382805968326492159387309567953862656382805968326492159 AND nbr2<0387309567953862656382805968326492159387309567953862656382805968326492159 AND nbr>360287970189639679 AND nbr<432345564227567616) AND NOT(nbr3>0387309567953862656382805968326492159387309567953862656382805968326492159 AND nbr3<0387309567953862656382805968326492159387309567953862656382805968326492159 AND nbr>360287970189639679 AND nbr<432345564227567616) AND NOT(nbr3>0387309567953862656382805968326492159387309567953862656382805968326492159 AND nbr3<0387309567953862656382805968326492159387309567953862656382805968326492159 AND nbr2>360287970189639679 AND nbr2<432345564227567616) AND NOT(nbr4>0387309567953862656382805968326492159387309567953862656382805968326492159 AND nbr4<0387309567953862656382805968326492159387309567953862656382805968326492159 AND nbr>360287970189639679 AND nbr<432345564227567616) AND NOT(nbr4>0387309567953862656382805968326492159387309567953862656382805968326492159 AND nbr4<0387309567953862656382805968326492159387309567953862656382805968326492159 AND nbr2>360287970189639679 AND nbr2<432345564227567616) AND NOT(nbr4>0387309567953862656382805968326492159387309567953862656382805968326492159 AND nbr4<0387309567953862656382805968326492159387309567953862656382805968326492159 AND nbr3>360287970189639679 AND nbr3<432345564227567616)))
+    )AS PR ORDER BY PR.first_name, PR.last_name ASC;
     */
 
 QString CntSqlSearch::CompareTwoColumnsWithModifiedPattern(const QString& pattern,
                                                                   const QStringList& tokens) const
     {
-    QString patternAfterZero = pattern.right(pattern.count() - 1);
-    // It has been checked earlier that tables are not same
+    QString queryString;
+    QString lower;
+    QString upper;
+    QString lower2;
+    QString upper2;
+    QString lower_without_zero;
+    QString upper_without_zero;
+    QString lower2_without_zero;
+    QString upper2_without_zero;
+    int err;
+    int i(0);
+    
+    QString firstTokenWithoutZeros = tokens.at(0);
+    firstTokenWithoutZeros.remove(QChar('0'), Qt::CaseInsensitive);
+
     QString firstTable = SelectTable(pattern);
-    QString secondTable = SelectTable(patternAfterZero);
-    QString queryString;
-    if (patternAfterZero.count() == 1)
-        { 
+    QString secondTable = SelectTable(firstTokenWithoutZeros);
+    
+    QString secondTokenWithoutZeros;
+    
+    if(tokens.count() > 1)
+        {
+        secondTokenWithoutZeros = tokens.at(1);
+        i = pattern.length()-1;
+        while (pattern[i] == '0') 
+               {
+               --i;
+               }
+        if(pattern.length()-1 != i)
+            {
+            pattern.leftRef(i);
+            }
+        //secondTokenWithoutZeros.remove(QChar('0'), Qt::CaseInsensitive);
+        }
+    
+    // Case like 05
+    if (tokens.at(0).count() == 1 && pattern.length() == 2)
+        {
         queryString = QString("SELECT contact_id FROM (SELECT " + secondTable + ".contact_id, " + secondTable + ".first_name, " + secondTable + ".last_name FROM " + secondTable 
                                 + " UNION SELECT " + firstTable + ".contact_id, " + firstTable + ".first_name, " + firstTable + ".last_name FROM " + firstTable 
                                 + " WHERE " + ModifiedMatchColumns( pattern) + ") AS PR ORDER BY PR.first_name, PR.last_name ASC;");
         }
+    //case like 05055 or 0506 or 00506 
+    else if (tokens.count() > 1)
+        { 
+        err = mkeyKeyMap->GetNumericLimits(tokens.at(0), lower, upper);
+        if(err)
+            {
+            return QString("");
+            }
+        err = mkeyKeyMap->GetNumericLimits(tokens.at(1), lower2, upper2);
+        if(err)
+            {
+            return QString("");
+            }
+        
+        err = mkeyKeyMap->GetNumericLimits(firstTokenWithoutZeros, lower_without_zero, upper_without_zero);
+        if(err)
+            {
+            return QString("");
+            }
+        
+        err = mkeyKeyMap->GetNumericLimits(secondTokenWithoutZeros, lower2_without_zero, upper2_without_zero);
+        if(err)
+           {
+           return QString("");
+           }
+
+        queryString = QString("SELECT contact_id FROM (SELECT " + secondTable + ".contact_id, " + secondTable + ".first_name, " + secondTable + ".last_name FROM " + secondTable + 
+                                   + " WHERE (" + CompareTwoColumns(lower_without_zero, upper_without_zero, lower2_without_zero, upper2_without_zero) + " OR" +
+                                   CompareTwoColumns(lower2_without_zero, upper2_without_zero, lower_without_zero, upper_without_zero) + ")" +
+                              " UNION" +
+                                   " SELECT " + firstTable + ".contact_id, " + firstTable + ".first_name, " + firstTable + ".last_name FROM " + firstTable 
+                                   + " WHERE " + ModifiedMatchColumns( pattern) + " OR"
+                                   + CompareTwoColumns(lower, upper, lower2, upper2) + " OR"
+                                   + CompareTwoColumns(lower2, upper2, lower, upper) +
+                              ") AS PR ORDER BY PR.first_name, PR.last_name ASC;");
+            
+        
+            
+            /* "SELECT contact_id FROM ( SELECT... UNION SELECT ...) AS PR ORDER BY PR.first_name, PR.last_name ASC;*/
+            /* 5 table 
+             queryString = QString("SELECT " + secondTable + ".contact_id, " + secondTable + ".first_name, " + secondTable + ".last_name FROM " + secondTable 
+                                                + " WHERE NOT(NOT" + ExactMatch(tokens.at(0)) + " AND NOT" +
+                                               CompareTwoColumns(lower, upper, lower2, upper2) + " AND NOT" +
+                                               CompareTwoColumns(lower2, upper2, lower, upper) + " );");*/
+        
+            /* table 0 queryString = QString("SELECT " + firstTable + ".contact_id, " + firstTable + ".first_name, " + firstTable + ".last_name FROM " + firstTable 
+                                               + " WHERE " + ModifiedMatchColumns( pattern) + " AND NOT"
+                                               + CompareTwoColumns(zeroPrefix.append(lower), zeroPrefix.append(upper), lower2, upper2) + " AND NOT"
+                                               + CompareTwoColumns(lower2, upper2, zeroPrefix.append(lower), zeroPrefix.append(upper)));*/
+                
+        }
     else
         {
+        //case like 055
         queryString = QString("SELECT contact_id FROM (SELECT " + secondTable + ".contact_id, " + secondTable + ".first_name, " + secondTable + ".last_name FROM " + secondTable 
-                                + " WHERE " + ModifiedMatchColumns( patternAfterZero) + 
+                                + " WHERE " + ModifiedMatchColumns( firstTokenWithoutZeros) + 
                                 + " UNION SELECT " + firstTable + ".contact_id, " + firstTable + ".first_name, " + firstTable + ".last_name FROM " + firstTable 
                                 + " WHERE " + ModifiedMatchColumns( pattern) + ") AS PR ORDER BY PR.first_name, PR.last_name ASC;");
         }
@@ -948,8 +1017,8 @@
         {
         if (CntSqlSearch::ZerosEndOfFirstToken == searchMethod)
             {
-            if( tokens.count() == KOneToken && !tokens.at(0).contains("0")
-                && !pattern.startsWith('0') && pattern.count('0') == 1
+            if( tokens.count() == KOneToken /*&& !tokens.at(0).contains("0")*/
+                && !pattern.startsWith('0') /*&& pattern.count('0') == 1*/
                 && pattern.endsWith('0'))
                 {
                 return true;
@@ -957,8 +1026,11 @@
             }
         if (CntSqlSearch::ZeroIsFirstNumber == searchMethod )
             {
-            if(pattern.startsWith('0') && pattern.count() > 1 
-                && pattern.at(1) != '0')
+            if(pattern.startsWith('0') && pattern.count() > 1 )
+                {
+                return true;
+                }
+            if (pattern.startsWith('0') && tokens.count() >= KTwoTokens )
                 {
                 return true;
                 }