summaryrefslogtreecommitdiff
authoreilers <eilers>2005-03-20 17:47:23 (UTC)
committer eilers <eilers>2005-03-20 17:47:23 (UTC)
commit22d113c0b0dc0a9a71cb55f565c4df04272809e1 (patch) (unidiff)
tree4decc50e15c93f1c6afc9131e3124c4f11115475
parent5bc93a55c05c7292502c908fc0a99d5010a641c7 (diff)
downloadopie-22d113c0b0dc0a9a71cb55f565c4df04272809e1.zip
opie-22d113c0b0dc0a9a71cb55f565c4df04272809e1.tar.gz
opie-22d113c0b0dc0a9a71cb55f565c4df04272809e1.tar.bz2
Fixing #1608, second issue: QueryByExample-Datediff does not work properly.
This solution is not the best. I will rethink it as I have enough time. But it should work..
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiepim/ChangeLog4
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp46
2 files changed, 39 insertions, 11 deletions
diff --git a/libopie2/opiepim/ChangeLog b/libopie2/opiepim/ChangeLog
index 84517fb..acb6cb1 100644
--- a/libopie2/opiepim/ChangeLog
+++ b/libopie2/opiepim/ChangeLog
@@ -1,13 +1,15 @@
12005-03.19 Stefan Eilers <stefan@eilers-online.net> 12005-03-20 Stefan Eilers <stefan@eilers-online.net>
2 * #1608 Quickfix for problem with DateDiff on SQL backend. I have to rethink this solution, but due to the short time, this should work.
32005-03-19 Stefan Eilers <stefan@eilers-online.net>
2 * Minor update for sorted(). Now ignoring any category search if "DoNotShowWithCategory" filter is activated. 4 * Minor update for sorted(). Now ignoring any category search if "DoNotShowWithCategory" filter is activated.
3 * Fixing uninitialized member variable, caused crash of backend 5 * Fixing uninitialized member variable, caused crash of backend
42005-03-18 Stefan Eilers <stefan@eilers-online.net> 62005-03-18 Stefan Eilers <stefan@eilers-online.net>
5 * Rewrote generic sorted filter and added filter for "DoNotShowWithCategory", needed by addressbook (other filters need to be added!) 7 * Rewrote generic sorted filter and added filter for "DoNotShowWithCategory", needed by addressbook (other filters need to be added!)
62005-01-16 Stefan Eilers <stefan@eilers-online.net> 82005-01-16 Stefan Eilers <stefan@eilers-online.net>
7 * Added new OPimEventSortVector class, improved OPimSortVector 9 * Added new OPimEventSortVector class, improved OPimSortVector
8 * OPimAccessBackend now supports generic sorting. 10 * OPimAccessBackend now supports generic sorting.
92005-01-03 Stefan Eilers <stefan@eilers-online.net> 112005-01-03 Stefan Eilers <stefan@eilers-online.net>
10 * Fixing bug in API documentation 12 * Fixing bug in API documentation
11 * Moving hasQuerySettings() and querySettings() to OPimAccessTemplate to be available for all frontends 13 * Moving hasQuerySettings() and querySettings() to OPimAccessTemplate to be available for all frontends
122004-12-28 Stefan Eilers <stefan@eilers-online.net> 142004-12-28 Stefan Eilers <stefan@eilers-online.net>
13 * Make improved query by example accessable via frontend 15 * Make improved query by example accessable via frontend
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
@@ -538,25 +538,26 @@ UIDArray OPimContactAccessBackend_SQL::queryByExample ( const UIDArray& uidlist,
538 // Just add uid's selection if we really try to search in a subset of all uids! Otherwise this would 538 // Just add uid's selection if we really try to search in a subset of all uids! Otherwise this would
539 // just take time and memory! 539 // just take time and memory!
540 if ( uidlist.count() != m_uids.count() ) { 540 if ( uidlist.count() != m_uids.count() ) {
541 qu += " ("; 541 qu += " (";
542 542
543 for ( uint i = 0; i < uidlist.count(); i++ ) { 543 for ( uint i = 0; i < uidlist.count(); i++ ) {
544 qu += " uid = " + QString::number( uidlist[i] ) + " OR"; 544 qu += " uid = " + QString::number( uidlist[i] ) + " OR";
545 } 545 }
546 qu.remove( qu.length()-2, 2 ); // Hmmmm.. 546 qu.remove( qu.length()-2, 2 ); // Hmmmm..
547 qu += " ) AND "; 547 qu += " ) AND ";
548 } 548 }
549 549
550 QString searchQuery =""; 550 QString searchQuery = "";
551 QString temp_searchQuery = "";
551 552
552 QDate startDate; 553 QDate startDate;
553 554
554 if ( qd.isValid() ) 555 if ( qd.isValid() )
555 startDate = qd.date(); 556 startDate = qd.date();
556 else 557 else
557 startDate = QDate::currentDate(); 558 startDate = QDate::currentDate();
558 559
559 560
560 QMap<int, QString> queryFields = query.toMap(); 561 QMap<int, QString> queryFields = query.toMap();
561 QStringList fieldList = OPimContactFields::untrfields( false ); 562 QStringList fieldList = OPimContactFields::untrfields( false );
562 QMap<QString, int> translate = OPimContactFields::untrFieldsToId(); 563 QMap<QString, int> translate = OPimContactFields::untrFieldsToId();
@@ -576,38 +577,47 @@ UIDArray OPimContactAccessBackend_SQL::queryByExample ( const UIDArray& uidlist,
576 searchQuery += " AND"; 577 searchQuery += " AND";
577 578
578// isAnyFieldSelected = true; 579// isAnyFieldSelected = true;
579 switch( id ){ 580 switch( id ){
580 case Qtopia::Birthday: 581 case Qtopia::Birthday:
581 endDate = new QDate( query.birthday() ); 582 endDate = new QDate( query.birthday() );
582 // Fall through ! 583 // Fall through !
583 case Qtopia::Anniversary: 584 case Qtopia::Anniversary:
584 if ( endDate == 0l ) 585 if ( endDate == 0l )
585 endDate = new QDate( query.anniversary() ); 586 endDate = new QDate( query.anniversary() );
586 587
587 if ( settings & OPimContactAccess::DateDiff ) { 588 if ( settings & OPimContactAccess::DateDiff ) {
588 searchQuery += QString( " (\"%1\" <= '%2-%3-%4\' AND \"%5\" >= '%6-%7-%8')" ) 589 // To handle datediffs correctly, we need to remove the year information from
590 // the birthday and anniversary.
591 // To do this efficiently, we will create a temporary table which contains the
592 // information we need and do the query on it.
593 // This table is just visible for this process and will be removed
594 // automatically after using.
595 temp_searchQuery = "CREATE TEMP TABLE bs ( uid, \"Birthday\", \"Anniversary\" );";
596 temp_searchQuery += "INSERT INTO bs SELECT uid,substr(\"Birthday\", 6, 10),substr(\"Anniversary\", 6, 10) FROM addressbook WHERE ( \"Birthday\" != '' OR \"Anniversary\" != '' );";
597
598 temp_searchQuery += QString( "SELECT uid FROM bs WHERE (\"%1\" <= '%2-%3\' AND \"%4\" >= '%5-%6')" )
589 .arg( *it ) 599 .arg( *it )
590 .arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) ) 600 //.arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) )
591 .arg( QString::number( endDate->month() ).rightJustify( 2, '0' ) ) 601 .arg( QString::number( endDate->month() ).rightJustify( 2, '0' ) )
592 .arg( QString::number( endDate->day() ).rightJustify( 2, '0' ) ) 602 .arg( QString::number( endDate->day() ).rightJustify( 2, '0' ) )
593 .arg( *it ) 603 .arg( *it )
594 .arg( QString::number( startDate.year() ).rightJustify( 4, '0' ) ) 604 //.arg( QString::number( startDate.year() ).rightJustify( 4, '0' ) )
595 .arg( QString::number( startDate.month() ).rightJustify( 2, '0' ) ) 605 .arg( QString::number( startDate.month() ).rightJustify( 2, '0' ) )
596 .arg( QString::number( startDate.day() ).rightJustify( 2, '0' ) ) ; 606 .arg( QString::number( startDate.day() ).rightJustify( 2, '0' ) ) ;
597 } 607 }
598 608
599 if ( settings & OPimContactAccess::DateYear ){ 609 if ( settings & OPimContactAccess::DateYear ){
600 if ( settings & OPimContactAccess::DateDiff ) 610 // if ( settings & OPimContactAccess::DateDiff )
601 searchQuery += " AND"; 611 // searchQuery += " AND";
602 612
603 searchQuery += QString( " (\"%1\" LIKE '%2-%')" ) 613 searchQuery += QString( " (\"%1\" LIKE '%2-%')" )
604 .arg( *it ) 614 .arg( *it )
605 .arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) ); 615 .arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) );
606 } 616 }
607 617
608 if ( settings & OPimContactAccess::DateMonth ){ 618 if ( settings & OPimContactAccess::DateMonth ){
609 if ( ( settings & OPimContactAccess::DateDiff ) 619 if ( ( settings & OPimContactAccess::DateDiff )
610 || ( settings & OPimContactAccess::DateYear ) ) 620 || ( settings & OPimContactAccess::DateYear ) )
611 searchQuery += " AND"; 621 searchQuery += " AND";
612 622
613 searchQuery += QString( " (\"%1\" LIKE '%-%2-%')" ) 623 searchQuery += QString( " (\"%1\" LIKE '%-%2-%')" )
@@ -634,42 +644,58 @@ UIDArray OPimContactAccessBackend_SQL::queryByExample ( const UIDArray& uidlist,
634 if ( settings & OPimContactAccess::IgnoreCase ) 644 if ( settings & OPimContactAccess::IgnoreCase )
635 searchQuery += "(\"" + *it + "\"" + " LIKE " + "'" 645 searchQuery += "(\"" + *it + "\"" + " LIKE " + "'"
636 + queryStr.replace(QRegExp("\\*"),"%") + "'" + ")"; 646 + queryStr.replace(QRegExp("\\*"),"%") + "'" + ")";
637 else 647 else
638 searchQuery += "(\"" + *it + "\"" + " GLOB " + "'" 648 searchQuery += "(\"" + *it + "\"" + " GLOB " + "'"
639 + queryStr + "'" + ")"; 649 + queryStr + "'" + ")";
640 650
641 } 651 }
642 } 652 }
643 653
644 delete endDate; 654 delete endDate;
645 } 655 }
646 // Skip trailing "AND"
647// if ( isAnyFieldSelected )
648// qu = qu.left( qu.length() - 4 );
649 656
650 qu += searchQuery; 657 // The following is very ugly! (eilers)
658 if ( !temp_searchQuery.isEmpty() && !searchQuery.isEmpty() ){
659 // If we use DateDiff, we have to intersect two queries.
660 qu = temp_searchQuery + QString( " INTERSECT " ) + qu + searchQuery;
661 } else if ( temp_searchQuery.isEmpty() && !searchQuery.isEmpty() ){
662 qu += searchQuery;
663 } else if ( !temp_searchQuery.isEmpty() && searchQuery.isEmpty() ){
664 // This will cause wrong results!! Uid filter is not used here!
665 qu = temp_searchQuery;
666 } else if ( temp_searchQuery.isEmpty() && searchQuery.isEmpty() ){
667 UIDArray empty;
668 return empty;
669 }
651 670
652 odebug << "queryByExample query: " << qu << "" << oendl; 671 odebug << "queryByExample query: " << qu << "" << oendl;
653 672
654 // Execute query and return the received uid's 673 // Execute query and return the received uid's
655 OSQLRawQuery raw( qu ); 674 OSQLRawQuery raw( qu );
656 OSQLResult res = m_driver->query( &raw ); 675 OSQLResult res = m_driver->query( &raw );
657 if ( res.state() != OSQLResult::Success ){ 676 if ( res.state() != OSQLResult::Success ){
658 UIDArray empty; 677 UIDArray empty;
659 return empty; 678 return empty;
660 } 679 }
661 680
662 UIDArray list = extractUids( res ); 681 UIDArray list = extractUids( res );
663 682
683 // Remove temp table if created
684 if ( !temp_searchQuery.isEmpty( ) ){
685 qu = "DROP TABLE bs";
686 OSQLRawQuery raw( qu );
687 OSQLResult res = m_driver->query( &raw );
688 }
689
664 return list; 690 return list;
665} 691}
666 692
667UIDArray OPimContactAccessBackend_SQL::matchRegexp( const QRegExp &r ) const 693UIDArray OPimContactAccessBackend_SQL::matchRegexp( const QRegExp &r ) const
668{ 694{
669#if 0 695#if 0
670 QArray<int> nix(0); 696 QArray<int> nix(0);
671 return nix; 697 return nix;
672 698
673#else 699#else
674 QString qu = "SELECT uid FROM addressbook WHERE ("; 700 QString qu = "SELECT uid FROM addressbook WHERE (";
675 QString searchlist; 701 QString searchlist;