-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp index 2368865..50421e2 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp +++ b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp @@ -550,2 +550,3 @@ UIDArray OPimContactAccessBackend_SQL::queryByExample ( const UIDArray& uidlist, QString searchQuery =""; + QString temp_searchQuery = ""; @@ -587,5 +588,14 @@ UIDArray OPimContactAccessBackend_SQL::queryByExample ( const UIDArray& uidlist, if ( settings & OPimContactAccess::DateDiff ) { - searchQuery += QString( " (\"%1\" <= '%2-%3-%4\' AND \"%5\" >= '%6-%7-%8')" ) + // To handle datediffs correctly, we need to remove the year information from + // the birthday and anniversary. + // To do this efficiently, we will create a temporary table which contains the + // information we need and do the query on it. + // This table is just visible for this process and will be removed + // 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')" ) .arg( *it ) - .arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) ) + //.arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) ) .arg( QString::number( endDate->month() ).rightJustify( 2, '0' ) ) @@ -593,3 +603,3 @@ UIDArray OPimContactAccessBackend_SQL::queryByExample ( const UIDArray& uidlist, .arg( *it ) - .arg( QString::number( startDate.year() ).rightJustify( 4, '0' ) ) + //.arg( QString::number( startDate.year() ).rightJustify( 4, '0' ) ) .arg( QString::number( startDate.month() ).rightJustify( 2, '0' ) ) @@ -599,4 +609,4 @@ UIDArray OPimContactAccessBackend_SQL::queryByExample ( const UIDArray& uidlist, if ( settings & OPimContactAccess::DateYear ){ - if ( settings & OPimContactAccess::DateDiff ) - searchQuery += " AND"; + // if ( settings & OPimContactAccess::DateDiff ) + // searchQuery += " AND"; @@ -645,7 +655,16 @@ UIDArray OPimContactAccessBackend_SQL::queryByExample ( const UIDArray& uidlist, } - // Skip trailing "AND" -// if ( isAnyFieldSelected ) -// qu = qu.left( qu.length() - 4 ); + // The following is very ugly! (eilers) + if ( !temp_searchQuery.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 += 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() ){ + UIDArray empty; + return empty; + } @@ -663,2 +682,9 @@ UIDArray OPimContactAccessBackend_SQL::queryByExample ( const UIDArray& uidlist, + // Remove temp table if created + if ( !temp_searchQuery.isEmpty( ) ){ + qu = "DROP TABLE bs"; + OSQLRawQuery raw( qu ); + OSQLResult res = m_driver->query( &raw ); + } + return list; |