Skip to content

Commit a7fe57a

Browse files
committed
feat: add select by foreign key
1 parent efd7d90 commit a7fe57a

6 files changed

Lines changed: 84 additions & 5 deletions

File tree

file_classification_core/src/internal/files.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,4 +287,17 @@ pub fn decrease_files_reference_count_by_conditions(
287287

288288
// 减少引用计数
289289
query.set(files::reference_count.eq(files::reference_count - 1)).execute(conn)
290-
}
290+
}
291+
292+
pub fn select_file_by_group_id(
293+
conn: &mut AnyConnection,
294+
other_group_id: i64,
295+
) -> Result<Vec<File>, diesel::result::Error> {
296+
use crate::model::schema::file_groups;
297+
298+
files::table
299+
.inner_join(file_groups::table.on(files::id.eq(file_groups::file_id)))
300+
.filter(file_groups::group_id.eq(other_group_id as i32))
301+
.select(File::as_select())
302+
.load(conn)
303+
}

file_classification_core/src/internal/groups.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,3 +356,29 @@ pub fn decrease_groups_reference_count_by_conditions(
356356
// 减少引用计数
357357
query.set(groups::reference_count.eq(groups::reference_count - 1)).execute(conn)
358358
}
359+
360+
pub fn select_group_by_file_id(
361+
conn: &mut AnyConnection,
362+
other_file_id: i32,
363+
) -> Result<Vec<Group>, diesel::result::Error> {
364+
use crate::model::schema::file_groups;
365+
366+
groups::table
367+
.inner_join(file_groups::table.on(groups::id.eq(file_groups::group_id)))
368+
.filter(file_groups::file_id.eq(other_file_id))
369+
.select(Group::as_select())
370+
.load(conn)
371+
}
372+
373+
pub fn select_group_by_tag_id(
374+
conn: &mut AnyConnection,
375+
tag_id: i32,
376+
) -> Result<Vec<Group>, diesel::result::Error> {
377+
use crate::model::schema::group_tags;
378+
379+
groups::table
380+
.inner_join(group_tags::table.on(groups::id.eq(group_tags::group_id)))
381+
.filter(group_tags::tag_id.eq(tag_id))
382+
.select(Group::as_select())
383+
.load(conn)
384+
}

file_classification_core/src/internal/tags.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ pub fn delete_tag(conn: &mut AnyConnection, tag_id: i32) -> Result<usize, diesel
7979
}
8080

8181
use crate::model::schema::tags::dsl::*;
82-
use crate::model::schema::tags;
82+
use crate::model::schema::{groups, tags};
8383
use std::fmt::{Debug, Formatter, Result as fmtResult};
8484

8585
impl Debug for Tag {
@@ -93,9 +93,10 @@ impl Debug for Tag {
9393
}
9494

9595
use super::models::TagCondition;
96-
use crate::model::models::{OrderDirection, TagOrderBy, TagQueryOptions, UpdateTagDTO};
96+
use crate::model::models::{Group, OrderDirection, TagOrderBy, TagQueryOptions, UpdateTagDTO};
9797
use diesel::dsl::not;
9898
use diesel::sql_types::Bool;
99+
use crate::model::schema::group_tags::dsl::group_tags;
99100

100101
// 将 TagCondition 转换为 diesel 查询条件的辅助函数
101102
fn build_tag_condition(condition: TagCondition) -> Box<dyn BoxableExpression<tags::table, <AnyConnection as Connection>::Backend, SqlType=diesel::sql_types::Bool>> {
@@ -280,3 +281,16 @@ pub fn decrease_tags_reference_count_by_conditions(
280281
// 减少引用计数
281282
query.set(tags::reference_count.eq(tags::reference_count - 1)).execute(conn)
282283
}
284+
285+
pub fn select_tag_by_group_id(
286+
conn: &mut AnyConnection,
287+
group_id: i64,
288+
) -> Result<Vec<Tag>, diesel::result::Error> {
289+
use crate::model::schema::group_tags;
290+
291+
tags::table
292+
.inner_join(group_tags::table.on(tags::id.eq(group_tags::tag_id)))
293+
.filter(group_tags::group_id.eq(group_id as i32))
294+
.select(Tag::as_select())
295+
.load(conn)
296+
}

file_classification_core/src/service/files.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,3 +242,9 @@ pub fn delete_files_by_conditions(
242242
})
243243
}
244244

245+
pub fn select_file_by_group_id(
246+
conn: &mut AnyConnection,
247+
other_group_id: i64,
248+
) -> Result<Vec<File>, diesel::result::Error> {
249+
internal::files::select_file_by_group_id(conn, other_group_id)
250+
}

file_classification_core/src/service/groups.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::model::models::{FileCondition, FileGroupCondition, GroupCondition, Gr
22
use crate::service::AppError;
33
use crate::{internal::groups, model::models::{CreateGroupDTO, Group, GroupFilter}};
44
use diesel::result::Error;
5-
use diesel::Connection;
5+
use diesel::{Connection, JoinOnDsl};
66
use crate::utils::database::AnyConnection;
77

88
pub fn create_group(conn: &mut AnyConnection, name: &str) -> Result<usize, Error> {
@@ -184,3 +184,16 @@ pub fn delete_groups_by_conditions(
184184
})
185185
}
186186

187+
pub fn select_group_by_file_id(
188+
conn: &mut AnyConnection,
189+
other_file_id: i32,
190+
) -> Result<Vec<Group>, diesel::result::Error> {
191+
crate::internal::groups::select_group_by_file_id(conn, other_file_id)
192+
}
193+
194+
pub fn select_group_by_tag_id(
195+
conn: &mut AnyConnection,
196+
tag_id: i32,
197+
) -> Result<Vec<Group>, diesel::result::Error> {
198+
crate::internal::groups::select_group_by_tag_id(conn, tag_id)
199+
}

file_classification_core/src/service/tags.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::{
33
internal::tags,
44
model::models::{CreateTagDTO, Tag, TagFilter},
55
};
6-
use diesel::Connection;
6+
use diesel::{Connection, JoinOnDsl};
77
use crate::utils::database::AnyConnection;
88

99
pub fn create_tag(conn: &mut AnyConnection, name: &str) -> Result<Tag, diesel::result::Error> {
@@ -107,4 +107,11 @@ pub fn delete_tags_by_conditions(
107107

108108
Ok(total_deleted)
109109
})
110+
}
111+
112+
pub fn select_tag_by_group_id(
113+
conn: &mut AnyConnection,
114+
group_id: i64,
115+
) -> Result<Vec<Tag>, diesel::result::Error> {
116+
crate::internal::tags::select_tag_by_group_id(conn, group_id)
110117
}

0 commit comments

Comments
 (0)