Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/stefan-niedermann/nextcloud-deck.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordesperateCoder <echotodevnull@gmail.com>2020-12-20 15:34:48 +0300
committerdesperateCoder <echotodevnull@gmail.com>2020-12-20 15:34:48 +0300
commit5dafd60cb72f55087cb454af3e7ec3ea57943aa3 (patch)
tree179ca6d11ddd6e1d9db3b0309924db8c09dbf513 /app/src/main/java/it/niedermann
parent518b6467e47f6cecd0978a6b672868617084661e (diff)
#597 filter widget: added ability to filter by Project
Diffstat (limited to 'app/src/main/java/it/niedermann')
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/model/internal/FilterInformation.java29
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetAccount.java38
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetProject.java89
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java29
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DeckDatabase.java10
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/widgets/filter/FilterWidgetProjectDao.java15
6 files changed, 202 insertions, 8 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/internal/FilterInformation.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/internal/FilterInformation.java
index ae1c7d916..81aa8cd80 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/model/internal/FilterInformation.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/internal/FilterInformation.java
@@ -10,6 +10,7 @@ import java.util.List;
import it.niedermann.nextcloud.deck.model.Label;
import it.niedermann.nextcloud.deck.model.User;
import it.niedermann.nextcloud.deck.model.enums.EDueType;
+import it.niedermann.nextcloud.deck.model.ocs.projects.OcsProject;
public class FilterInformation implements Serializable {
@@ -21,11 +22,14 @@ public class FilterInformation implements Serializable {
private EDueType dueType = EDueType.NO_FILTER;
private boolean noAssignedLabel = false;
private boolean noAssignedUser = false;
+ private boolean noAssignedProject = false;
@NonNull
private List<User> users = new ArrayList<>();
@NonNull
private List<Label> labels = new ArrayList<>();
@NonNull
+ private List<OcsProject> projects = new ArrayList<>();
+ @NonNull
private EArchiveStatus archiveStatus = EArchiveStatus.NON_ARCHIVED;
public FilterInformation() {
@@ -41,6 +45,8 @@ public class FilterInformation implements Serializable {
this.noAssignedUser = filterInformation.isNoAssignedUser();
this.noAssignedLabel = filterInformation.isNoAssignedLabel();
this.archiveStatus = filterInformation.getArchiveStatus();
+ this.noAssignedProject = filterInformation.isNoAssignedProject();
+ this.projects = filterInformation.getProjects();
}
}
@@ -103,6 +109,27 @@ public class FilterInformation implements Serializable {
this.users = users;
}
+ public boolean isNoAssignedProject() {
+ return noAssignedProject;
+ }
+
+ public void setNoAssignedProject(boolean noAssignedProject) {
+ this.noAssignedProject = noAssignedProject;
+ }
+
+ public void setLabels(@NonNull List<Label> labels) {
+ this.labels = labels;
+ }
+
+ @NonNull
+ public List<OcsProject> getProjects() {
+ return projects;
+ }
+
+ public void setProjects(@NonNull List<OcsProject> projects) {
+ this.projects = projects;
+ }
+
@NonNull
public EArchiveStatus getArchiveStatus() {
return archiveStatus;
@@ -130,8 +157,10 @@ public class FilterInformation implements Serializable {
}
return filterInformation.getDueType() != EDueType.NO_FILTER
|| filterInformation.getUsers().size() > 0
+ || filterInformation.getProjects().size() > 0
|| filterInformation.getLabels().size() > 0
|| filterInformation.noAssignedUser
+ || filterInformation.noAssignedProject
|| filterInformation.noAssignedLabel;
}
}
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetAccount.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetAccount.java
index e6e30eb23..caf4e5dd1 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetAccount.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetAccount.java
@@ -37,6 +37,16 @@ public class FilterWidgetAccount {
private Long filterWidgetId;
private Long accountId;
private boolean includeNoUser = true;
+ private boolean includeNoProject = true;
+
+ @Ignore
+ private List<FilterWidgetBoard> boards = new ArrayList<>();
+
+ @Ignore
+ private List<FilterWidgetUser> users = new ArrayList<>();
+
+ @Ignore
+ private List<FilterWidgetProject> projects = new ArrayList<>();
public FilterWidgetAccount() {
// Default constructor
@@ -48,12 +58,6 @@ public class FilterWidgetAccount {
this.setIncludeNoUser(includeNoUser);
}
- @Ignore
- private List<FilterWidgetBoard> boards = new ArrayList<>();
-
- @Ignore
- private List<FilterWidgetUser> users = new ArrayList<>();
-
public void setBoards(List<FilterWidgetBoard> boards) {
this.boards = boards;
}
@@ -107,6 +111,22 @@ public class FilterWidgetAccount {
this.includeNoUser = includeNoUser;
}
+ public boolean isIncludeNoProject() {
+ return includeNoProject;
+ }
+
+ public void setIncludeNoProject(boolean includeNoProject) {
+ this.includeNoProject = includeNoProject;
+ }
+
+ public List<FilterWidgetProject> getProjects() {
+ return projects;
+ }
+
+ public void setProjects(List<FilterWidgetProject> projects) {
+ this.projects = projects;
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) return true;
@@ -115,13 +135,15 @@ public class FilterWidgetAccount {
FilterWidgetAccount that = (FilterWidgetAccount) o;
if (includeNoUser != that.includeNoUser) return false;
+ if (includeNoProject != that.includeNoProject) return false;
if (id != null ? !id.equals(that.id) : that.id != null) return false;
if (filterWidgetId != null ? !filterWidgetId.equals(that.filterWidgetId) : that.filterWidgetId != null)
return false;
if (accountId != null ? !accountId.equals(that.accountId) : that.accountId != null)
return false;
if (boards != null ? !boards.equals(that.boards) : that.boards != null) return false;
- return users != null ? users.equals(that.users) : that.users == null;
+ if (users != null ? !users.equals(that.users) : that.users != null) return false;
+ return projects != null ? projects.equals(that.projects) : that.projects == null;
}
@Override
@@ -130,8 +152,10 @@ public class FilterWidgetAccount {
result = 31 * result + (filterWidgetId != null ? filterWidgetId.hashCode() : 0);
result = 31 * result + (accountId != null ? accountId.hashCode() : 0);
result = 31 * result + (includeNoUser ? 1 : 0);
+ result = 31 * result + (includeNoProject ? 1 : 0);
result = 31 * result + (boards != null ? boards.hashCode() : 0);
result = 31 * result + (users != null ? users.hashCode() : 0);
+ result = 31 * result + (projects != null ? projects.hashCode() : 0);
return result;
}
}
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetProject.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetProject.java
new file mode 100644
index 000000000..7ed3f956c
--- /dev/null
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetProject.java
@@ -0,0 +1,89 @@
+package it.niedermann.nextcloud.deck.model.widget.filter;
+
+import androidx.room.Entity;
+import androidx.room.ForeignKey;
+import androidx.room.Ignore;
+import androidx.room.Index;
+import androidx.room.PrimaryKey;
+
+import it.niedermann.nextcloud.deck.model.ocs.projects.OcsProject;
+
+@Entity(
+ indices = {
+ @Index(value = "filterAccountId", name = "idx_FilterWidgetProject_filterAccountId"),
+ @Index(value = "projectId", name = "idx_FilterWidgetProject_projectId")
+ },
+ foreignKeys = {
+ @ForeignKey(
+ entity = OcsProject.class,
+ parentColumns = "localId",
+ childColumns = "projectId", onDelete = ForeignKey.CASCADE
+ ),
+ @ForeignKey(
+ entity = FilterWidgetAccount.class,
+ parentColumns = "id",
+ childColumns = "filterAccountId", onDelete = ForeignKey.CASCADE
+ )
+ }
+)
+public class FilterWidgetProject {
+
+ @PrimaryKey(autoGenerate = true)
+ private Long id;
+ private Long filterAccountId;
+ private Long projectId;
+
+ public FilterWidgetProject() {
+ // Default constructor
+ }
+
+ @Ignore
+ public FilterWidgetProject(Long projectId) {
+ this.projectId = projectId;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getFilterAccountId() {
+ return filterAccountId;
+ }
+
+ public void setFilterAccountId(Long filterAccountId) {
+ this.filterAccountId = filterAccountId;
+ }
+
+ public Long getProjectId() {
+ return projectId;
+ }
+
+ public void setProjectId(Long projectId) {
+ this.projectId = projectId;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ FilterWidgetProject that = (FilterWidgetProject) o;
+
+ if (id != null ? !id.equals(that.id) : that.id != null) return false;
+ if (filterAccountId != null ? !filterAccountId.equals(that.filterAccountId) : that.filterAccountId != null)
+ return false;
+ return projectId != null ? projectId.equals(that.projectId) : that.projectId == null;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = id != null ? id.hashCode() : 0;
+ result = 31 * result + (filterAccountId != null ? filterAccountId.hashCode() : 0);
+ result = 31 * result + (projectId != null ? projectId.hashCode() : 0);
+ return result;
+ }
+}
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java
index a1bad0c26..6be24bacc 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java
@@ -57,6 +57,7 @@ import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidget;
import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetAccount;
import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetBoard;
import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetLabel;
+import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetProject;
import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetSort;
import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetStack;
import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetUser;
@@ -280,6 +281,19 @@ public class DataBaseAdapter {
query.append("and not exists(select 1 from joincardwithuser j where c.localId = cardId and j.status<>3) ");
}
+ if (!filter.getProjects().isEmpty()) {
+ query.append("and (exists(select 1 from joincardwithproject j where c.localId = cardId and projectId in (");
+ fillSqlWithEntityListValues(query, args, filter.getProjects());
+ query.append(") and j.status<>3) ");
+ if (filter.isNoAssignedProject()) {
+ query.append("or not exists(select 1 from joincardwithproject j where c.localId = cardId and j.status<>3)) ");
+ } else {
+ query.append(") ");
+ }
+ } else if (filter.isNoAssignedProject()) {
+ query.append("and not exists(select 1 from joincardwithproject j where c.localId = cardId and j.status<>3) ");
+ }
+
if (filter.getDueType() != EDueType.NO_FILTER) {
switch (filter.getDueType()) {
case NO_DUE:
@@ -1144,6 +1158,10 @@ public class DataBaseAdapter {
user.setFilterAccountId(accountId);
db.getFilterWidgetUserDao().insert(user);
}
+ for (FilterWidgetProject project : account.getProjects()) {
+ project.setFilterAccountId(accountId);
+ db.getFilterWidgetProjectDao().insert(project);
+ }
for (FilterWidgetBoard board : account.getBoards()) {
board.setFilterAccountId(accountId);
long boardId = db.getFilterWidgetBoardDao().insert(board);
@@ -1184,6 +1202,7 @@ public class DataBaseAdapter {
for (FilterWidgetAccount account : filterWidget.getAccounts()) {
account.setBoards(db.getFilterWidgetBoardDao().getFilterWidgetBoardsByFilterWidgetAccountIdDirectly(account.getId()));
account.setUsers(db.getFilterWidgetUserDao().getFilterWidgetUsersByFilterWidgetAccountIdDirectly(account.getId()));
+ account.setProjects(db.getFilterWidgetProjectDao().getFilterWidgetProjectsByFilterWidgetAccountIdDirectly(account.getId()));
for (FilterWidgetBoard board : account.getBoards()) {
board.setLabels(db.getFilterWidgetLabelDao().getFilterWidgetLabelsByFilterWidgetBoardIdDirectly(board.getId()));
board.setStacks(db.getFilterWidgetStackDao().getFilterWidgetStacksByFilterWidgetBoardIdDirectly(board.getId()));
@@ -1225,6 +1244,16 @@ public class DataBaseAdapter {
}
}
filter.setUsers(users);
+ filter.setNoAssignedProject(account.isIncludeNoProject());
+ List<OcsProject> projects = new ArrayList<>();
+ if (!account.getProjects().isEmpty()) {
+ for (FilterWidgetProject project : account.getProjects()) {
+ OcsProject u = new OcsProject();
+ u.setLocalId(project.getProjectId());
+ projects.add(u);
+ }
+ }
+ filter.setProjects(projects);
if (!account.getBoards().isEmpty()) {
for (FilterWidgetBoard board : account.getBoards()) {
filter.setNoAssignedLabel(board.isIncludeNoLabel());
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DeckDatabase.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DeckDatabase.java
index 859a4718f..874568734 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DeckDatabase.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DeckDatabase.java
@@ -47,6 +47,7 @@ import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidget;
import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetAccount;
import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetBoard;
import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetLabel;
+import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetProject;
import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetSort;
import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetStack;
import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetUser;
@@ -82,6 +83,7 @@ import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.fil
import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.filter.FilterWidgetBoardDao;
import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.filter.FilterWidgetDao;
import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.filter.FilterWidgetLabelDao;
+import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.filter.FilterWidgetProjectDao;
import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.filter.FilterWidgetSortDao;
import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.filter.FilterWidgetStackDao;
import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.filter.FilterWidgetUserDao;
@@ -119,6 +121,7 @@ import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.fil
FilterWidgetStack.class,
FilterWidgetLabel.class,
FilterWidgetUser.class,
+ FilterWidgetProject.class,
FilterWidgetSort.class,
},
exportSchema = false,
@@ -433,12 +436,13 @@ public abstract class DeckDatabase extends RoomDatabase {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("CREATE TABLE `FilterWidget` (`id` INTEGER PRIMARY KEY NOT NULL, `title` TEXT, `dueType` INTEGER, `widgetType` INTEGER NOT NULL)");
- database.execSQL("CREATE TABLE `FilterWidgetAccount` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `filterWidgetId` INTEGER, `accountId` INTEGER, `includeNoUser` INTEGER NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`filterWidgetId`) REFERENCES `FilterWidget`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )");
+ database.execSQL("CREATE TABLE `FilterWidgetAccount` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `filterWidgetId` INTEGER, `accountId` INTEGER, `includeNoUser` INTEGER NOT NULL, `includeNoProject` INTEGER NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`filterWidgetId`) REFERENCES `FilterWidget`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )");
database.execSQL("CREATE TABLE `FilterWidgetBoard` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `filterAccountId` INTEGER, `boardId` INTEGER, `includeNoLabel` INTEGER NOT NULL, FOREIGN KEY(`boardId`) REFERENCES `Board`(`localId`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`filterAccountId`) REFERENCES `FilterWidgetAccount`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )");
database.execSQL("CREATE TABLE `FilterWidgetLabel` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `filterBoardId` INTEGER, `labelId` INTEGER, FOREIGN KEY(`labelId`) REFERENCES `Label`(`localId`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`filterBoardId`) REFERENCES `FilterWidgetBoard`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )");
database.execSQL("CREATE TABLE `FilterWidgetSort` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `filterWidgetId` INTEGER, `direction` INTEGER NOT NULL, `criteria` INTEGER NOT NULL, `ruleOrder` INTEGER NOT NULL, FOREIGN KEY(`filterWidgetId`) REFERENCES `FilterWidget`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )");
database.execSQL("CREATE TABLE `FilterWidgetStack` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `filterBoardId` INTEGER, `stackId` INTEGER, FOREIGN KEY(`stackId`) REFERENCES `Stack`(`localId`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`filterBoardId`) REFERENCES `FilterWidgetBoard`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )");
database.execSQL("CREATE TABLE `FilterWidgetUser` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `filterAccountId` INTEGER, `userId` INTEGER, FOREIGN KEY(`userId`) REFERENCES `User`(`localId`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`filterAccountId`) REFERENCES `FilterWidgetAccount`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )");
+ database.execSQL("CREATE TABLE `FilterWidgetProject` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `filterAccountId` INTEGER, `projectId` INTEGER, FOREIGN KEY(`projectId`) REFERENCES `OcsProject`(`localId`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`filterAccountId`) REFERENCES `FilterWidgetAccount`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )");
database.execSQL("CREATE INDEX `index_FilterWidgetAccount_filterWidgetId` ON `FilterWidgetAccount` (`filterWidgetId`)");
database.execSQL("CREATE INDEX `idx_FilterWidgetAccount_accountId` ON `FilterWidgetAccount` (`accountId`)");
database.execSQL("CREATE INDEX `idx_FilterWidgetBoard_boardId` ON `FilterWidgetBoard` (`boardId`)");
@@ -450,6 +454,8 @@ public abstract class DeckDatabase extends RoomDatabase {
database.execSQL("CREATE INDEX `idx_FilterWidgetStack_stackId` ON `FilterWidgetStack` (`stackId`)");
database.execSQL("CREATE INDEX `idx_FilterWidgetUser_filterAccountId` ON `FilterWidgetUser` (`filterAccountId`)");
database.execSQL("CREATE INDEX `idx_FilterWidgetUser_userId` ON `FilterWidgetUser` (`userId`)");
+ database.execSQL("CREATE INDEX `idx_FilterWidgetProject_filterAccountId` ON `FilterWidgetProject` (`filterAccountId`)");
+ database.execSQL("CREATE INDEX `idx_FilterWidgetProject_projectId` ON `FilterWidgetProject` (`projectId`)");
database.execSQL("CREATE INDEX `unique_idx_FilterWidgetSort_filterWidgetId_criteria` ON `FilterWidgetSort` (`filterWidgetId`, `criteria`)");
database.execSQL("CREATE INDEX `unique_idx_FilterWidgetSort_filterWidgetId_ruleOrder` ON `FilterWidgetSort` (`filterWidgetId`, `ruleOrder`)");
@@ -599,6 +605,8 @@ public abstract class DeckDatabase extends RoomDatabase {
public abstract FilterWidgetUserDao getFilterWidgetUserDao();
+ public abstract FilterWidgetProjectDao getFilterWidgetProjectDao();
+
public abstract FilterWidgetSortDao getFilterWidgetSortDao();
} \ No newline at end of file
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/widgets/filter/FilterWidgetProjectDao.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/widgets/filter/FilterWidgetProjectDao.java
new file mode 100644
index 000000000..4e49684e3
--- /dev/null
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/widgets/filter/FilterWidgetProjectDao.java
@@ -0,0 +1,15 @@
+package it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.filter;
+
+import androidx.room.Dao;
+import androidx.room.Query;
+
+import java.util.List;
+
+import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetProject;
+import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.GenericDao;
+
+@Dao
+public interface FilterWidgetProjectDao extends GenericDao<FilterWidgetProject> {
+ @Query("SELECT * FROM FilterWidgetProject where filterAccountId = :filterWidgetAccountId")
+ List<FilterWidgetProject> getFilterWidgetProjectsByFilterWidgetAccountIdDirectly(Long filterWidgetAccountId);
+}