Skip to content

Commit 42eaf2a

Browse files
authored
fix: duplicate results in cl/issue paginated queries (#1595)
1 parent 7827e69 commit 42eaf2a

File tree

3 files changed

+26
-21
lines changed

3 files changed

+26
-21
lines changed

jupiter/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ saturn = { workspace = true }
1818

1919
sea-orm = { workspace = true, features = [
2020
"sqlx-postgres",
21-
"sqlx-mysql",
2221
"sqlx-sqlite",
2322
"runtime-tokio-rustls",
2423
"macros",
24+
"debug-print",
2525
] }
2626
sea-orm-migration = { workspace = true }
2727

@@ -43,4 +43,4 @@ anyhow = { workspace = true }
4343
tempfile = { workspace = true }
4444
indexmap = { workspace = true }
4545
url = { workspace = true }
46-
pgp = {workspace = true}
46+
pgp = { workspace = true }

jupiter/src/storage/cl_storage.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ use callisto::{
77
};
88
use common::errors::MegaError;
99
use common::model::Pagination;
10-
use sea_orm::RelationTrait;
1110
use sea_orm::prelude::Expr;
1211
use sea_orm::sea_query::OnConflict;
1312
use sea_orm::{
1413
ActiveModelTrait, ColumnTrait, Condition, EntityTrait, IntoActiveModel, JoinType,
1514
PaginatorTrait, QueryFilter, QuerySelect, Set,
1615
};
16+
use sea_orm::{QueryOrder, RelationTrait};
1717

1818
use crate::model::common::{ItemDetails, ListParams};
1919
use crate::storage::base_storage::{BaseStorage, StorageConnector};
@@ -69,7 +69,7 @@ impl ClStorage {
6969
]
7070
};
7171

72-
let query = mega_cl::Entity::find()
72+
let base_query = mega_cl::Entity::find()
7373
.join(
7474
JoinType::LeftJoin,
7575
callisto::entity_ext::mega_cl::Relation::ItemLabels.def(),
@@ -80,20 +80,23 @@ impl ClStorage {
8080
)
8181
.filter(mega_cl::Column::Status.is_in(status))
8282
.filter(cond)
83-
.distinct();
83+
.distinct()
84+
.order_by_asc(mega_cl::Column::Id);
8485

8586
let mut sort_map = HashMap::new();
8687
sort_map.insert("created_at", mega_cl::Column::CreatedAt);
8788
sort_map.insert("updated_at", mega_cl::Column::UpdatedAt);
8889

89-
let query = apply_sort(query, params.sort_by.as_deref(), params.asc, &sort_map);
90-
let paginator = query.paginate(self.get_connection(), page.per_page);
91-
let num_pages = paginator.num_items().await?;
90+
let sorted_query = apply_sort(base_query, params.sort_by.as_deref(), params.asc, &sort_map);
9291

93-
let (cl_list, page) = paginator
94-
.fetch_page(page.page - 1)
95-
.await
96-
.map(|m| (m, num_pages))?;
92+
let paginator = sorted_query.paginate(self.get_connection(), page.per_page);
93+
let total = paginator.num_items().await?;
94+
95+
let cl_list = paginator.fetch_page(page.page - 1).await?;
96+
97+
if cl_list.is_empty() {
98+
return Ok((vec![], 0));
99+
}
97100

98101
let ids = cl_list.iter().map(|m| m.id).collect::<Vec<_>>();
99102

@@ -124,7 +127,7 @@ impl ClStorage {
124127

125128
let res = combine_item_list::<mega_cl::Entity>(labels, assignees, conversations);
126129

127-
Ok((res, page))
130+
Ok((res, total))
128131
}
129132

130133
pub async fn get_cl_suggestions_by_query(

jupiter/src/storage/issue_storage.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use callisto::sea_orm_active_enums::ReferenceTypeEnum;
55
use sea_orm::prelude::Expr;
66
use sea_orm::{
77
ActiveModelTrait, ColumnTrait, Condition, EntityTrait, IntoActiveModel, JoinType,
8-
PaginatorTrait, QueryFilter, QuerySelect, RelationTrait, Set, TransactionTrait,
8+
PaginatorTrait, QueryFilter, QueryOrder, QuerySelect, RelationTrait, Set, TransactionTrait,
99
};
1010

1111
use callisto::{
@@ -53,7 +53,8 @@ impl IssueStorage {
5353
)
5454
.filter(mega_issue::Column::Status.eq(params.status))
5555
.filter(cond)
56-
.distinct();
56+
.distinct()
57+
.order_by_asc(mega_issue::Column::Id);
5758

5859
let mut sort_map = HashMap::new();
5960
sort_map.insert("created_at", mega_issue::Column::CreatedAt);
@@ -62,11 +63,12 @@ impl IssueStorage {
6263
let query = apply_sort(query, params.sort_by.as_deref(), params.asc, &sort_map);
6364

6465
let paginator = query.paginate(self.get_connection(), page.per_page);
65-
let num_pages = paginator.num_items().await?;
66-
let (issues, page) = paginator
67-
.fetch_page(page.page - 1)
68-
.await
69-
.map(|m| (m, num_pages))?;
66+
let total = paginator.num_items().await?;
67+
let issues = paginator.fetch_page(page.page - 1).await?;
68+
69+
if issues.is_empty() {
70+
return Ok((vec![], 0));
71+
}
7072

7173
let issue_ids = issues.iter().map(|m| m.id).collect::<Vec<_>>();
7274

@@ -99,7 +101,7 @@ impl IssueStorage {
99101

100102
let res = combine_item_list::<mega_issue::Entity>(labels, assignees, conversations);
101103

102-
Ok((res, page))
104+
Ok((res, total))
103105
}
104106

105107
pub async fn get_issue_suggestions_by_query(

0 commit comments

Comments
 (0)