elif_orm/query/
pagination.rs

1//! Query Builder pagination operations
2
3use serde_json::Value;
4use super::builder::QueryBuilder;
5use super::types::*;
6
7impl<M> QueryBuilder<M> {
8    /// Add LIMIT clause
9    pub fn limit(mut self, count: i64) -> Self {
10        self.limit_count = Some(count);
11        self
12    }
13
14    /// Add OFFSET clause
15    pub fn offset(mut self, count: i64) -> Self {
16        self.offset_value = Some(count);
17        self
18    }
19
20    /// Add pagination (LIMIT + OFFSET)
21    pub fn paginate(mut self, per_page: i64, page: i64) -> Self {
22        self.limit_count = Some(per_page);
23        self.offset_value = Some((page - 1) * per_page);
24        self
25    }
26    
27    /// Cursor-based pagination (for better performance on large datasets)
28    pub fn paginate_cursor<T: Into<Value>>(mut self, cursor_column: &str, cursor_value: Option<T>, per_page: i64, direction: OrderDirection) -> Self {
29        self.limit_count = Some(per_page);
30        
31        if let Some(cursor_val) = cursor_value {
32            match direction {
33                OrderDirection::Asc => {
34                    self = self.where_gt(cursor_column, cursor_val);
35                }
36                OrderDirection::Desc => {
37                    self = self.where_lt(cursor_column, cursor_val);
38                }
39            }
40        }
41        
42        self.order_by.push((cursor_column.to_string(), direction));
43        
44        self
45    }
46}