@@ -70,6 +70,7 @@ use crate::model::schema::files::dsl::*;
7070use std:: fmt:: { Debug , Formatter , Result as fmtResult} ;
7171use diesel:: sql_types:: Bool ;
7272use diesel:: sqlite:: Sqlite ;
73+ use crate :: model:: models:: { FileOrderBy , FileQueryOptions , OrderDirection } ;
7374
7475impl Debug for File {
7576 fn fmt ( & self , f : & mut Formatter < ' _ > ) -> fmtResult {
@@ -136,7 +137,29 @@ fn build_file_condition(condition: FileCondition) -> Box<dyn BoxableExpression<f
136137pub fn select_files_by_conditions (
137138 conn : & mut SqliteConnection ,
138139 conditions : Vec < FileCondition > ,
139- limit : i64 ,
140+ limit : Option < i64 > ,
141+ ) -> Result < Vec < File > , diesel:: result:: Error > {
142+ let mut query = files:: table. into_boxed :: < Sqlite > ( ) ;
143+
144+ // 对每个条件应用 AND 逻辑
145+ for condition in conditions {
146+ let boxed_condition = build_file_condition ( condition) ;
147+ query = query. filter ( boxed_condition) ;
148+ }
149+
150+ if let Some ( limit) = limit {
151+ query = query. limit ( limit)
152+ }
153+
154+ query
155+ . select ( File :: as_select ( ) )
156+ . load ( conn)
157+ }
158+
159+ pub fn select_files_by_conditions_with_options (
160+ conn : & mut SqliteConnection ,
161+ conditions : Vec < FileCondition > ,
162+ options : FileQueryOptions ,
140163) -> Result < Vec < File > , diesel:: result:: Error > {
141164 let mut query = files:: table. into_boxed :: < Sqlite > ( ) ;
142165
@@ -146,8 +169,52 @@ pub fn select_files_by_conditions(
146169 query = query. filter ( boxed_condition) ;
147170 }
148171
172+ // 应用查询选项(排序、限制等)
173+ if let Some ( limit) = options. limit {
174+ query = query. limit ( limit) ;
175+ }
176+
177+ if let Some ( offset) = options. offset {
178+ query = query. offset ( offset) ;
179+ }
180+
181+ // 应用排序
182+ for order_by in options. order_by {
183+ query = match order_by {
184+ FileOrderBy :: Id ( direction) => {
185+ match direction {
186+ OrderDirection :: Asc => query. order ( files:: id. asc ( ) ) ,
187+ OrderDirection :: Desc => query. order ( files:: id. desc ( ) ) ,
188+ }
189+ } ,
190+ FileOrderBy :: Type ( direction) => {
191+ match direction {
192+ OrderDirection :: Asc => query. order ( files:: type_. asc ( ) ) ,
193+ OrderDirection :: Desc => query. order ( files:: type_. desc ( ) ) ,
194+ }
195+ } ,
196+ FileOrderBy :: Path ( direction) => {
197+ match direction {
198+ OrderDirection :: Asc => query. order ( files:: path. asc ( ) ) ,
199+ OrderDirection :: Desc => query. order ( files:: path. desc ( ) ) ,
200+ }
201+ } ,
202+ FileOrderBy :: ReferenceCount ( direction) => {
203+ match direction {
204+ OrderDirection :: Asc => query. order ( files:: reference_count. asc ( ) ) ,
205+ OrderDirection :: Desc => query. order ( files:: reference_count. desc ( ) ) ,
206+ }
207+ } ,
208+ FileOrderBy :: GroupId ( direction) => {
209+ match direction {
210+ OrderDirection :: Asc => query. order ( files:: group_id. asc ( ) ) ,
211+ OrderDirection :: Desc => query. order ( files:: group_id. desc ( ) ) ,
212+ }
213+ } ,
214+ } ;
215+ }
216+
149217 query
150- . limit ( limit)
151218 . select ( File :: as_select ( ) )
152219 . load ( conn)
153220}
0 commit comments