2018-08-02 13:33:06 +00:00
package eu.faircode.email ;
/ *
2018-08-14 05:53:24 +00:00
This file is part of FairEmail .
2018-08-02 13:33:06 +00:00
2018-08-14 05:53:24 +00:00
FairEmail is free software : you can redistribute it and / or modify
2018-08-02 13:33:06 +00:00
it under the terms of the GNU General Public License as published by
the Free Software Foundation , either version 3 of the License , or
( at your option ) any later version .
NetGuard is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with NetGuard . If not , see < http : //www.gnu.org/licenses/>.
Copyright 2018 by Marcel Bokhorst ( M66B )
* /
import java.util.List ;
2018-08-08 06:55:47 +00:00
import androidx.lifecycle.LiveData ;
import androidx.paging.DataSource ;
import androidx.room.Dao ;
import androidx.room.Insert ;
import androidx.room.Query ;
import androidx.room.Update ;
2018-08-02 13:33:06 +00:00
@Dao
public interface DaoMessage {
2018-08-07 15:06:18 +00:00
// About 'dummy': "When the min() or max() aggregate functions are used in an aggregate query,
// all bare columns in the result set take values from the input row which also contains the minimum or maximum."
// https://www.sqlite.org/lang_select.html
2018-08-24 18:06:44 +00:00
@Query ( " SELECT message.*, account.name AS accountName, folder.name as folderName, folder.type as folderType " +
2018-08-07 15:06:18 +00:00
" , COUNT(message.id) as count " +
" , SUM(CASE WHEN message.ui_seen THEN 0 ELSE 1 END) as unseen " +
2018-08-03 12:27:49 +00:00
" , (SELECT COUNT(a.id) FROM attachment a WHERE a.message = message.id) AS attachments " +
2018-08-09 07:02:41 +00:00
" , MAX(CASE WHEN folder.type = ' " + EntityFolder . INBOX + " ' THEN message.id ELSE 0 END) as dummy " +
2018-08-07 15:06:18 +00:00
" FROM message " +
2018-08-24 18:06:44 +00:00
" JOIN account ON account.id = message.account " +
2018-08-07 15:06:18 +00:00
" JOIN folder ON folder.id = message.folder " +
2018-08-24 14:24:11 +00:00
" WHERE account.`synchronize` " +
" AND (NOT message.ui_hide OR :debug) " +
2018-08-12 16:13:43 +00:00
" GROUP BY CASE WHEN message.thread IS NULL THEN message.id ELSE message.thread END " +
2018-08-09 07:02:41 +00:00
" HAVING SUM(CASE WHEN folder.type = ' " + EntityFolder . INBOX + " ' THEN 1 ELSE 0 END) > 0 " +
2018-08-07 15:06:18 +00:00
" ORDER BY message.received DESC " )
2018-08-07 06:38:00 +00:00
DataSource . Factory < Integer , TupleMessageEx > pagedUnifiedInbox ( boolean debug ) ;
2018-08-02 13:33:06 +00:00
2018-08-22 16:37:10 +00:00
@Query ( " SELECT message.*, account.name AS accountName, folder.name as folderName, folder.type as folderType " +
2018-08-07 15:06:18 +00:00
" , COUNT(message.id) as count " +
" , SUM(CASE WHEN message.ui_seen THEN 0 ELSE 1 END) as unseen " +
2018-08-03 12:27:49 +00:00
" , (SELECT COUNT(a.id) FROM attachment a WHERE a.message = message.id) AS attachments " +
2018-08-07 15:06:18 +00:00
" , MAX(CASE WHEN folder.id = :folder THEN message.id ELSE 0 END) as dummy " +
" FROM message " +
2018-08-22 16:37:10 +00:00
" LEFT JOIN account ON account.id = message.account " +
2018-08-07 15:06:18 +00:00
" JOIN folder ON folder.id = message.folder " +
2018-08-12 15:31:43 +00:00
" LEFT JOIN folder f ON f.id = :folder " +
2018-08-07 15:06:18 +00:00
" WHERE (NOT message.ui_hide OR :debug) " +
2018-09-02 06:59:49 +00:00
" AND (NOT :found OR ui_found = :found) " +
2018-08-12 16:13:43 +00:00
" GROUP BY CASE WHEN message.thread IS NULL THEN message.id ELSE message.thread END " +
2018-08-07 15:06:18 +00:00
" HAVING SUM(CASE WHEN folder.id = :folder THEN 1 ELSE 0 END) > 0 " +
" ORDER BY message.received DESC, message.sent DESC " )
2018-09-01 16:34:16 +00:00
DataSource . Factory < Integer , TupleMessageEx > pagedFolder ( long folder , boolean found , boolean debug ) ;
2018-08-02 13:33:06 +00:00
2018-08-22 16:37:10 +00:00
@Query ( " SELECT message.*, account.name AS accountName, folder.name as folderName, folder.type as folderType " +
2018-08-07 08:00:17 +00:00
" , 1 AS count " +
" , CASE WHEN message.ui_seen THEN 0 ELSE 1 END AS unseen " +
2018-08-03 12:27:49 +00:00
" , (SELECT COUNT(a.id) FROM attachment a WHERE a.message = message.id) AS attachments " +
2018-08-02 13:33:06 +00:00
" FROM message " +
2018-08-22 16:37:10 +00:00
" LEFT JOIN account ON account.id = message.account " +
2018-08-02 13:33:06 +00:00
" JOIN folder ON folder.id = message.folder " +
2018-08-07 15:06:18 +00:00
" WHERE (NOT message.ui_hide OR :debug) " +
" AND message.account = (SELECT m1.account FROM message m1 WHERE m1.id = :msgid) " +
2018-08-07 08:00:17 +00:00
" AND message.thread = (SELECT m2.thread FROM message m2 WHERE m2.id = :msgid) " +
2018-08-07 15:06:18 +00:00
" ORDER BY message.received DESC, message.sent DESC " )
2018-08-07 06:38:00 +00:00
DataSource . Factory < Integer , TupleMessageEx > pagedThread ( long msgid , boolean debug ) ;
2018-08-02 13:33:06 +00:00
2018-08-21 14:37:46 +00:00
@Query ( " SELECT * " +
" FROM message " +
" WHERE id = :id " )
2018-08-02 13:33:06 +00:00
EntityMessage getMessage ( long id ) ;
2018-08-21 14:37:46 +00:00
@Query ( " SELECT COUNT(id) " +
" FROM message " +
" WHERE id = :id " )
int countMessage ( long id ) ;
@Query ( " SELECT * " +
" FROM message " +
" WHERE folder = :folder " +
" AND uid = :uid " )
2018-08-11 14:13:29 +00:00
EntityMessage getMessageByUid ( long folder , long uid ) ;
2018-08-02 13:33:06 +00:00
2018-08-12 19:11:53 +00:00
@Query ( " SELECT message.* FROM message " +
" JOIN folder ON folder.id = message.folder " +
2018-08-17 04:52:06 +00:00
" WHERE message.account = :account " +
2018-08-23 13:49:30 +00:00
" AND message.msgid = :msgid " )
2018-08-17 04:52:06 +00:00
List < EntityMessage > getMessageByMsgId ( long account , String msgid ) ;
2018-08-09 20:45:42 +00:00
2018-08-12 18:16:12 +00:00
@Query ( " SELECT message.* FROM message " +
" JOIN folder ON folder.id = message.folder " +
" WHERE message.account = :account " +
2018-08-26 05:28:36 +00:00
" AND message.thread = :thread " +
" AND folder.type <> ' " + EntityFolder . OUTBOX + " ' " )
2018-08-12 15:31:43 +00:00
List < EntityMessage > getMessageByThread ( long account , String thread ) ;
2018-09-01 16:34:16 +00:00
@Query ( " SELECT id FROM message " +
" WHERE folder = :folder " +
" ORDER BY message.received DESC, message.sent DESC " )
List < Long > getMessageIDs ( long folder ) ;
2018-08-22 16:37:10 +00:00
@Query ( " SELECT message.*, account.name AS accountName, folder.name as folderName, folder.type as folderType " +
2018-08-12 15:31:43 +00:00
" , (SELECT COUNT(m1.id) FROM message m1 WHERE m1.account = message.account AND m1.thread = message.thread AND NOT m1.ui_hide) AS count " +
" , (SELECT COUNT(m2.id) FROM message m2 WHERE m2.account = message.account AND m2.thread = message.thread AND NOT m2.ui_hide AND NOT m2.ui_seen) AS unseen " +
2018-08-03 12:27:49 +00:00
" , (SELECT COUNT(a.id) FROM attachment a WHERE a.message = message.id) AS attachments " +
2018-08-02 13:33:06 +00:00
" FROM message " +
2018-08-22 16:37:10 +00:00
" LEFT JOIN account ON account.id = message.account " +
2018-08-02 13:33:06 +00:00
" JOIN folder ON folder.id = message.folder " +
" WHERE message.id = :id " )
LiveData < TupleMessageEx > liveMessage ( long id ) ;
2018-08-24 18:06:44 +00:00
@Query ( " SELECT message.* FROM message " +
" JOIN account ON account.id = message.account " +
" JOIN folder ON folder.id = message.folder " +
" WHERE account.`synchronize` " +
" AND folder.type = ' " + EntityFolder . INBOX + " ' " +
" AND NOT message.ui_seen AND NOT message.ui_hide " +
" AND (account.seen_until IS NULL OR message.stored > account.seen_until) " +
" ORDER BY message.received " )
LiveData < List < EntityMessage > > liveUnseenUnified ( ) ;
2018-09-01 16:34:16 +00:00
@Query ( " SELECT uid FROM message " +
" WHERE folder = :folder " +
" AND received >= :received " +
" AND NOT uid IS NULL " +
2018-09-02 06:59:49 +00:00
" AND NOT ui_found " /* keep found messages */ )
2018-08-02 13:33:06 +00:00
List < Long > getUids ( long folder , long received ) ;
2018-08-12 15:31:43 +00:00
@Insert
2018-08-02 13:33:06 +00:00
long insertMessage ( EntityMessage message ) ;
@Update
void updateMessage ( EntityMessage message ) ;
2018-08-13 14:44:47 +00:00
@Query ( " UPDATE message SET uid = :uid WHERE id = :id " )
int setMessageUid ( long id , Long uid ) ;
@Query ( " UPDATE message SET seen = :seen WHERE id = :id " )
int setMessageSeen ( long id , boolean seen ) ;
@Query ( " UPDATE message SET ui_seen = :ui_seen WHERE id = :id " )
int setMessageUiSeen ( long id , boolean ui_seen ) ;
@Query ( " UPDATE message SET ui_hide = :ui_hide WHERE id = :id " )
int setMessageUiHide ( long id , boolean ui_hide ) ;
@Query ( " UPDATE message SET error = :error WHERE id = :id " )
int setMessageError ( long id , String error ) ;
2018-09-01 16:34:16 +00:00
@Query ( " UPDATE message SET ui_found = :found WHERE id = :id " )
int setMessageFound ( long id , boolean found ) ;
@Query ( " UPDATE message SET ui_found = 0 WHERE folder = :folder " )
int resetFound ( long folder ) ;
2018-08-02 13:33:06 +00:00
@Query ( " DELETE FROM message WHERE id = :id " )
2018-08-09 20:45:42 +00:00
int deleteMessage ( long id ) ;
2018-08-02 13:33:06 +00:00
@Query ( " DELETE FROM message WHERE folder = :folder AND uid = :uid " )
2018-08-06 11:05:14 +00:00
int deleteMessage ( long folder , long uid ) ;
2018-08-02 13:33:06 +00:00
@Query ( " DELETE FROM message WHERE folder = :folder " )
2018-09-04 14:07:50 +00:00
int deleteMessages ( long folder ) ;
2018-08-02 13:33:06 +00:00
@Query ( " DELETE FROM message WHERE folder = :folder AND received < :received AND NOT uid IS NULL " )
int deleteMessagesBefore ( long folder , long received ) ;
2018-09-04 14:07:50 +00:00
@Query ( " DELETE FROM message WHERE ui_found " )
int deleteFoundMessages ( ) ;
2018-08-02 13:33:06 +00:00
}