2018-08-02 13:33:06 +00:00
package eu.faircode.email ;
/ *
This file is part of Safe email .
Safe email is free software : you can redistribute it and / or modify
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-02 13:33:06 +00:00
@Query ( " SELECT message.*, 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 " +
" JOIN folder ON folder.id = message.folder " +
" WHERE (NOT message.ui_hide OR :debug) " +
2018-08-11 19:31:08 +00:00
" GROUP BY CASE WHEN message.thread IS NULL THEN message.id ELSE message.thread END, message.subject " +
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
@Query ( " SELECT message.*, 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 " +
" 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-08-11 19:31:08 +00:00
" GROUP BY CASE WHEN message.thread IS NULL THEN message.id ELSE message.thread END, message.subject " +
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-08-07 06:38:00 +00:00
DataSource . Factory < Integer , TupleMessageEx > pagedFolder ( long folder , boolean debug ) ;
2018-08-02 13:33:06 +00:00
@Query ( " SELECT message.*, 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 " +
" 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
@Query ( " SELECT * FROM message WHERE id = :id " )
EntityMessage getMessage ( 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-11 16:13:52 +00:00
@Query ( " SELECT * FROM message WHERE msgid = :msgid " )
EntityMessage getMessageByMsgId ( String msgid ) ;
2018-08-09 20:45:42 +00:00
2018-08-12 15:31:43 +00:00
@Query ( " SELECT * FROM message WHERE account = :account AND thread = :thread " )
List < EntityMessage > getMessageByThread ( long account , String thread ) ;
2018-08-02 13:33:06 +00:00
@Query ( " SELECT message.*, 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 " +
" JOIN folder ON folder.id = message.folder " +
" WHERE message.id = :id " )
LiveData < TupleMessageEx > liveMessage ( long id ) ;
2018-08-12 07:51:33 +00:00
@Query ( " SELECT * FROM message WHERE msgid = :msgid " )
LiveData < EntityMessage > liveMessageByMsgId ( String msgid ) ;
2018-08-02 13:33:06 +00:00
@Query ( " SELECT uid FROM message WHERE folder = :folder AND received >= :received AND NOT uid IS NULL " )
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 ) ;
@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-08-04 15:52:03 +00:00
void 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 ) ;
}