elif_orm/query/
pagination.rs

1//! Query Builder pagination operations
2
3use super::builder::QueryBuilder;
4use super::types::*;
5use serde_json::Value;
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>>(
29        mut self,
30        cursor_column: &str,
31        cursor_value: Option<T>,
32        per_page: i64,
33        direction: OrderDirection,
34    ) -> Self {
35        self.limit_count = Some(per_page);
36
37        if let Some(cursor_val) = cursor_value {
38            match direction {
39                OrderDirection::Asc => {
40                    self = self.where_gt(cursor_column, cursor_val);
41                }
42                OrderDirection::Desc => {
43                    self = self.where_lt(cursor_column, cursor_val);
44                }
45            }
46        }
47
48        self.order_by.push((cursor_column.to_string(), direction));
49
50        self
51    }
52}