author | eilers <eilers> | 2005-03-23 09:25:18 (UTC) |
---|---|---|
committer | eilers <eilers> | 2005-03-23 09:25:18 (UTC) |
commit | cd1e107bcc03cbe2ff5179d4367225e4b0e47005 (patch) (side-by-side diff) | |
tree | 0d748542c77a491c68a610b2f611981278133d3b /libopie2 | |
parent | 7d82b94d669746cac36dcabf026428bdc9286c72 (diff) | |
download | opie-cd1e107bcc03cbe2ff5179d4367225e4b0e47005.zip opie-cd1e107bcc03cbe2ff5179d4367225e4b0e47005.tar.gz opie-cd1e107bcc03cbe2ff5179d4367225e4b0e47005.tar.bz2 |
Fixing last issues on QueryByExample on SQL databases. All tests passed successfully
-rw-r--r-- | libopie2/opiepim/ChangeLog | 2 | ||||
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp | 62 |
2 files changed, 35 insertions, 29 deletions
diff --git a/libopie2/opiepim/ChangeLog b/libopie2/opiepim/ChangeLog index acb6cb1..ee063aa 100644 --- a/libopie2/opiepim/ChangeLog +++ b/libopie2/opiepim/ChangeLog @@ -1 +1,3 @@ +2005-03-23 Stefan Eilers <stefan@eilers-online.net> + * #1608 Finishing work on SQL backend. Datediff and other queries for QueryByExample now working as exprected. All tests passed successfully 2005-03-20 Stefan Eilers <stefan@eilers-online.net> diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp index 50421e2..175d62a 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp +++ b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp @@ -535,3 +535,5 @@ UIDArray OPimContactAccessBackend_SQL::queryByExample ( const UIDArray& uidlist, { - QString qu = "SELECT uid FROM addressbook WHERE"; + QString searchQuery = ""; + QString datediff_query = ""; + QString uid_query = ""; @@ -540,13 +542,11 @@ UIDArray OPimContactAccessBackend_SQL::queryByExample ( const UIDArray& uidlist, if ( uidlist.count() != m_uids.count() ) { - qu += " ("; + uid_query += " ("; for ( uint i = 0; i < uidlist.count(); i++ ) { - qu += " uid = " + QString::number( uidlist[i] ) + " OR"; + uid_query += " uid = " + QString::number( uidlist[i] ) + " OR"; } - qu.remove( qu.length()-2, 2 ); // Hmmmm.. - qu += " ) AND "; + uid_query.remove( uid_query.length()-2, 2 ); // Hmmmm.. + uid_query += " ) AND "; } - QString searchQuery = ""; - QString temp_searchQuery = ""; @@ -594,6 +594,6 @@ UIDArray OPimContactAccessBackend_SQL::queryByExample ( const UIDArray& uidlist, // automatically after using. - temp_searchQuery = "CREATE TEMP TABLE bs ( uid, \"Birthday\", \"Anniversary\" );"; - temp_searchQuery += "INSERT INTO bs SELECT uid,substr(\"Birthday\", 6, 10),substr(\"Anniversary\", 6, 10) FROM addressbook WHERE ( \"Birthday\" != '' OR \"Anniversary\" != '' );"; - - temp_searchQuery += QString( "SELECT uid FROM bs WHERE (\"%1\" <= '%2-%3\' AND \"%4\" >= '%5-%6')" ) + datediff_query = "CREATE TEMP TABLE bs ( uid, \"Birthday\", \"Anniversary\" );"; + datediff_query += "INSERT INTO bs SELECT uid,substr(\"Birthday\", 6, 10),substr(\"Anniversary\", 6, 10) FROM addressbook WHERE ( \"Birthday\" != '' OR \"Anniversary\" != '' );"; + datediff_query += QString( "SELECT uid FROM bs WHERE " ) + uid_query; + datediff_query += QString( " (\"%1\" <= '%2-%3\' AND \"%4\" >= '%5-%6')" ) .arg( *it ) @@ -609,5 +609,2 @@ UIDArray OPimContactAccessBackend_SQL::queryByExample ( const UIDArray& uidlist, if ( settings & OPimContactAccess::DateYear ){ - // if ( settings & OPimContactAccess::DateDiff ) - // searchQuery += " AND"; - searchQuery += QString( " (\"%1\" LIKE '%2-%')" ) @@ -618,4 +615,3 @@ UIDArray OPimContactAccessBackend_SQL::queryByExample ( const UIDArray& uidlist, if ( settings & OPimContactAccess::DateMonth ){ - if ( ( settings & OPimContactAccess::DateDiff ) - || ( settings & OPimContactAccess::DateYear ) ) + if ( settings & OPimContactAccess::DateYear ) searchQuery += " AND"; @@ -628,4 +624,3 @@ UIDArray OPimContactAccessBackend_SQL::queryByExample ( const UIDArray& uidlist, if ( settings & OPimContactAccess::DateDay ){ - if ( ( settings & OPimContactAccess::DateDiff ) - || ( settings & OPimContactAccess::DateYear ) + if ( ( settings & OPimContactAccess::DateYear ) || ( settings & OPimContactAccess::DateMonth ) ) @@ -644,6 +639,6 @@ UIDArray OPimContactAccessBackend_SQL::queryByExample ( const UIDArray& uidlist, if ( settings & OPimContactAccess::IgnoreCase ) - searchQuery += "(\"" + *it + "\"" + " LIKE " + "'" + searchQuery += " (\"" + *it + "\"" + " LIKE " + "'" + queryStr.replace(QRegExp("\\*"),"%") + "'" + ")"; else - searchQuery += "(\"" + *it + "\"" + " GLOB " + "'" + searchQuery += " (\"" + *it + "\"" + " GLOB " + "'" + queryStr + "'" + ")"; @@ -654,14 +649,23 @@ UIDArray OPimContactAccessBackend_SQL::queryByExample ( const UIDArray& uidlist, delete endDate; + + // The following if line is a replacement for + // if ( searchQuery.endsWith( "AND" ) ) + if ( searchQuery.findRev( "AND" ) == ( searchQuery.length() - 3 ) ){ + odebug << "remove AND" << oendl; + searchQuery.remove( searchQuery.length()-3, 3 ); // Hmmmm.. + } + } - // The following is very ugly! (eilers) - if ( !temp_searchQuery.isEmpty() && !searchQuery.isEmpty() ){ + // Now compose the complete query + QString qu = "SELECT uid FROM addressbook WHERE " + uid_query; + + if ( !datediff_query.isEmpty() && !searchQuery.isEmpty() ){ // If we use DateDiff, we have to intersect two queries. - qu = temp_searchQuery + QString( " INTERSECT " ) + qu + searchQuery; - } else if ( temp_searchQuery.isEmpty() && !searchQuery.isEmpty() ){ + qu = datediff_query + QString( " INTERSECT " ) + qu + searchQuery; + } else if ( datediff_query.isEmpty() && !searchQuery.isEmpty() ){ qu += searchQuery; - } else if ( !temp_searchQuery.isEmpty() && searchQuery.isEmpty() ){ - // This will cause wrong results!! Uid filter is not used here! - qu = temp_searchQuery; - } else if ( temp_searchQuery.isEmpty() && searchQuery.isEmpty() ){ + } else if ( !datediff_query.isEmpty() && searchQuery.isEmpty() ){ + qu = datediff_query; + } else if ( datediff_query.isEmpty() && searchQuery.isEmpty() ){ UIDArray empty; @@ -683,3 +687,3 @@ UIDArray OPimContactAccessBackend_SQL::queryByExample ( const UIDArray& uidlist, // Remove temp table if created - if ( !temp_searchQuery.isEmpty( ) ){ + if ( !datediff_query.isEmpty( ) ){ qu = "DROP TABLE bs"; |