Commit a8772b50 authored by Eelco van der Wel's avatar Eelco van der Wel :speech_balloon:
Browse files

Add offset to search

- Adds `_offset` option to /search to enable pagination
- Might be a slower method, but at least pagination works
parent 3b479ceb
Showing with 18 additions and 5 deletions
+18 -5
......@@ -125,6 +125,8 @@ pub struct Search {
pub sort_order: SortOrder,
#[serde(default = "default_api_limit", rename = "_limit")]
pub limit: u64,
#[serde(rename = "_offset")]
pub offset: Option<u64>,
#[serde(rename = "[[edges]]")]
pub forward_edges: Option<EdgeSearch>,
#[serde(rename = "~[[edges]]")]
......
......@@ -71,6 +71,7 @@ pub fn get_item_base(tx: &Tx, rowid: Rowid) -> Result<Option<ItemBase>> {
deleted: None,
sort_order: SortOrder::Asc,
_limit: 1,
_offset: None,
};
let item = search_items(tx, &database_search)?.into_iter().next();
Ok(item)
......@@ -96,6 +97,7 @@ pub struct DatabaseSearch<'a> {
pub deleted: Option<bool>,
pub sort_order: SortOrder,
pub _limit: u64,
pub _offset: Option<u64>,
}
fn parse_item_base(row: &Row) -> Result<ItemBase> {
......@@ -169,14 +171,19 @@ pub fn search_items(tx: &Tx, query: &DatabaseSearch) -> Result<Vec<ItemBase>> {
let mut rows: Rows = stmt.raw_query();
let mut result = Vec::new();
let mut num_skip = query._offset.unwrap_or(0);
let mut num_left = query._limit;
while let Some(row) = rows.next()? {
if num_left == 0 {
break;
if num_skip == 0 {
if num_left == 0 {
break;
} else {
num_left -= 1;
}
result.push(parse_item_base(row)?);
} else {
num_left -= 1;
}
result.push(parse_item_base(row)?);
num_skip -= 1;
}
}
Ok(result)
}
......@@ -660,6 +667,7 @@ pub mod tests {
deleted,
sort_order: SortOrder::Asc,
_limit: u64::MAX,
_offset: None,
};
search_items(tx, &database_search)
}
......@@ -723,6 +731,7 @@ pub mod tests {
deleted: None,
sort_order: SortOrder::Asc,
_limit: 1,
_offset: None,
};
assert_eq!(search_items(&tx, &query)?.len(), 1);
......
......@@ -50,6 +50,7 @@ pub fn get_item_tx(tx: &Tx, schema: &Schema, id: &str) -> Result<Vec<Value>> {
deleted: None,
sort_order: SortOrder::Asc,
limit: 1,
offset: Some(0),
forward_edges: None,
backward_edges: None,
other_properties: Default::default(),
......@@ -333,6 +334,7 @@ pub fn search(tx: &Tx, schema: &Schema, query: Search) -> Result<Vec<Value>> {
deleted: query.deleted,
sort_order: query.sort_order,
_limit: query.limit,
_offset: query.offset,
};
let items = database_api::search_items(tx, &database_search)?;
let mut result = Vec::new();
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment