Fix pagination by anchor for queued messages, tasks and metrics
This commit is contained in:
@@ -472,9 +472,18 @@ pub(crate) async fn queued_message_query(
|
||||
|
||||
let mut total = 0;
|
||||
if let Some(anchor) = req.request.anchor {
|
||||
let anchor = anchor.id();
|
||||
if anchor > due_from {
|
||||
due_from = anchor;
|
||||
let anchor_id = anchor.id();
|
||||
if let Some(archive) = req.server.read_message_archive(anchor_id).await?
|
||||
&& let Ok(archived) = archive.unarchive::<Message>()
|
||||
&& let Some(anchor_due) = archived.next_delivery_event(queue_name)
|
||||
&& anchor_due >= due_from
|
||||
&& anchor_due <= due_to
|
||||
{
|
||||
if params.sort_ascending {
|
||||
due_from = anchor_due;
|
||||
} else {
|
||||
due_to = anchor_due;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -399,7 +399,7 @@ pub(crate) async fn task_get(
|
||||
pub(crate) async fn task_query(
|
||||
mut req: RegistryQueryResponse<'_>,
|
||||
) -> trc::Result<QueryResponseBuilder> {
|
||||
let mut due_from = 100u64;
|
||||
let mut due_from = 1u64;
|
||||
let mut due_to = u64::MAX;
|
||||
let mut typ = None;
|
||||
|
||||
@@ -466,6 +466,7 @@ pub(crate) async fn task_query(
|
||||
.extract_parameters(req.server.core.jmap.query_max_results, None)?;
|
||||
|
||||
let mut from_id = 0u64;
|
||||
let mut to_id = u64::MAX;
|
||||
if let Some(anchor_id) = anchor_id
|
||||
&& let Some(anchor_task) = req
|
||||
.server
|
||||
@@ -478,8 +479,13 @@ pub(crate) async fn task_query(
|
||||
{
|
||||
let anchor_due = anchor_task.due_timestamp();
|
||||
if anchor_due >= due_from && anchor_due <= due_to {
|
||||
due_from = anchor_due;
|
||||
from_id = anchor_id;
|
||||
if params.sort_ascending {
|
||||
due_from = anchor_due;
|
||||
from_id = anchor_id;
|
||||
} else {
|
||||
due_to = anchor_due;
|
||||
to_id = anchor_id;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -497,7 +503,7 @@ pub(crate) async fn task_query(
|
||||
due: due_from,
|
||||
}));
|
||||
let to_key = ValueKey::from(ValueClass::TaskQueue(TaskQueueClass::Due {
|
||||
id: u64::MAX,
|
||||
id: to_id,
|
||||
due: due_to,
|
||||
}));
|
||||
|
||||
|
||||
@@ -411,17 +411,21 @@ pub(crate) async fn metric_query(
|
||||
if ts_from != 0 {
|
||||
ts_from = SnowflakeIdGenerator::from_timestamp(ts_from).unwrap_or(0);
|
||||
}
|
||||
if let Some(anchor) = req.request.anchor {
|
||||
let anchor = anchor.id();
|
||||
if anchor > ts_from {
|
||||
ts_from = anchor;
|
||||
}
|
||||
}
|
||||
|
||||
if ts_to != u64::MAX {
|
||||
ts_to = SnowflakeIdGenerator::from_timestamp(ts_to).unwrap_or(u64::MAX);
|
||||
}
|
||||
|
||||
if let Some(anchor) = req.request.anchor {
|
||||
let anchor = anchor.id();
|
||||
if params.sort_ascending {
|
||||
if anchor > ts_from {
|
||||
ts_from = anchor;
|
||||
}
|
||||
} else if anchor < ts_to {
|
||||
ts_to = anchor;
|
||||
}
|
||||
}
|
||||
|
||||
let from_key = ValueKey::from(ValueClass::Telemetry(TelemetryClass::Metric(ts_from)));
|
||||
let to_key = ValueKey::from(ValueClass::Telemetry(TelemetryClass::Metric(ts_to)));
|
||||
|
||||
|
||||
@@ -64,6 +64,7 @@ pub async fn insert_test_data(server: &Server) {
|
||||
let object_id = ObjectType::TlsInternalReport.to_id();
|
||||
let item_id = server.inner.data.queue_id_gen.generate();
|
||||
let mut batch = BatchBuilder::new();
|
||||
batch.clear(report.primary_key());
|
||||
report.write_ops(&mut batch, item_id, true);
|
||||
let report_bytes = report.to_pickled_vec();
|
||||
batch.set(
|
||||
@@ -77,6 +78,7 @@ pub async fn insert_test_data(server: &Server) {
|
||||
let object_id = ObjectType::DmarcInternalReport.to_id();
|
||||
let item_id = server.inner.data.queue_id_gen.generate();
|
||||
let mut batch = BatchBuilder::new();
|
||||
batch.clear(report.primary_key());
|
||||
report.write_ops(&mut batch, item_id, true);
|
||||
let report_bytes = report.to_pickled_vec();
|
||||
batch.set(
|
||||
|
||||
Reference in New Issue
Block a user