From 8dcb9930f2497706f03729df6e88c75ee91a6755 Mon Sep 17 00:00:00 2001 From: Pote <81638931+willpote@users.noreply.github.com> Date: Mon, 9 Feb 2026 12:18:06 -0600 Subject: [PATCH 1/9] Add status filter to list_requests and fix pagination cursor formatting Co-authored-by: Cursor --- .../guest/assessor/assessor-guest/Cargo.lock | 4 +- ...37_request_status_status_created_index.sql | 4 + crates/indexer/src/db/market.rs | 270 ++++++++++++++++-- crates/indexer/src/db/provers.rs | 2 +- crates/indexer/src/db/requestors.rs | 2 +- .../lambdas/indexer-api/src/routes/market.rs | 20 +- .../tests/local_integration/market.rs | 56 ++++ 7 files changed, 328 insertions(+), 30 deletions(-) create mode 100644 crates/indexer/migrations/37_request_status_status_created_index.sql diff --git a/crates/guest/assessor/assessor-guest/Cargo.lock b/crates/guest/assessor/assessor-guest/Cargo.lock index 4b387b956d..f7c7d128a9 100644 --- a/crates/guest/assessor/assessor-guest/Cargo.lock +++ b/crates/guest/assessor/assessor-guest/Cargo.lock @@ -1765,7 +1765,7 @@ dependencies = [ [[package]] name = "boundless-assessor" -version = "1.3.1" +version = "1.3.2" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -1778,7 +1778,7 @@ dependencies = [ [[package]] name = "boundless-market" -version = "1.3.1" +version = "1.3.2" dependencies = [ "alloy", "alloy-chains", diff --git a/crates/indexer/migrations/37_request_status_status_created_index.sql b/crates/indexer/migrations/37_request_status_status_created_index.sql new file mode 100644 index 0000000000..233315a5ae --- /dev/null +++ b/crates/indexer/migrations/37_request_status_status_created_index.sql @@ -0,0 +1,4 @@ +-- Index for filtering requests by status sorted by created_at +-- Complements idx_request_status_status_updated which sorts by updated_at +CREATE INDEX IF NOT EXISTS idx_request_status_status_created + ON request_status (request_status, created_at DESC); diff --git a/crates/indexer/src/db/market.rs b/crates/indexer/src/db/market.rs index 2df040a693..167d7b84e2 100644 --- a/crates/indexer/src/db/market.rs +++ b/crates/indexer/src/db/market.rs @@ -811,6 +811,7 @@ pub trait IndexerDb { cursor: Option, limit: u32, sort_by: RequestSortField, + status: Option, ) -> Result<(Vec, Option), DbError>; async fn get_requests_by_request_id( @@ -3196,37 +3197,72 @@ impl IndexerDb for MarketDb { cursor: Option, limit: u32, sort_by: RequestSortField, + status: Option, ) -> Result<(Vec, Option), DbError> { let sort_field = match sort_by { RequestSortField::UpdatedAt => "updated_at", RequestSortField::CreatedAt => "created_at", }; - let rows = if let Some(c) = &cursor { - let query_str = format!( - "SELECT * FROM request_status - WHERE {} < $1 OR ({} = $1 AND request_digest < $2) - ORDER BY {} DESC, request_digest DESC - LIMIT $3", - sort_field, sort_field, sort_field - ); - sqlx::query(&query_str) - .bind(c.timestamp as i64) - .bind(&c.request_digest) - .bind(limit as i64) - .fetch_all(&self.pool) - .await? - } else { - let query_str = format!( - "SELECT * FROM request_status - ORDER BY {} DESC, request_digest DESC - LIMIT $1", - sort_field - ); - sqlx::query(&query_str).bind(limit as i64).fetch_all(&self.pool).await? + let rows = match (&cursor, &status) { + (Some(c), Some(s)) => { + let query_str = format!( + "SELECT * FROM request_status + WHERE request_status = $1 + AND ({} < $2 OR ({} = $2 AND request_digest < $3)) + ORDER BY {} DESC, request_digest DESC + LIMIT $4", + sort_field, sort_field, sort_field + ); + sqlx::query(&query_str) + .bind(s.to_string()) + .bind(c.timestamp as i64) + .bind(&c.request_digest) + .bind(limit as i64) + .fetch_all(&self.pool) + .await? + } + (Some(c), None) => { + let query_str = format!( + "SELECT * FROM request_status + WHERE {} < $1 OR ({} = $1 AND request_digest < $2) + ORDER BY {} DESC, request_digest DESC + LIMIT $3", + sort_field, sort_field, sort_field + ); + sqlx::query(&query_str) + .bind(c.timestamp as i64) + .bind(&c.request_digest) + .bind(limit as i64) + .fetch_all(&self.pool) + .await? + } + (None, Some(s)) => { + let query_str = format!( + "SELECT * FROM request_status + WHERE request_status = $1 + ORDER BY {} DESC, request_digest DESC + LIMIT $2", + sort_field + ); + sqlx::query(&query_str) + .bind(s.to_string()) + .bind(limit as i64) + .fetch_all(&self.pool) + .await? + } + (None, None) => { + let query_str = format!( + "SELECT * FROM request_status + ORDER BY {} DESC, request_digest DESC + LIMIT $1", + sort_field + ); + sqlx::query(&query_str).bind(limit as i64).fetch_all(&self.pool).await? + } }; - let mut results = Vec::new(); + let mut results = Vec::new(); for row in rows { results.push(self.row_to_request_status(&row)?); } @@ -3237,7 +3273,7 @@ impl IndexerDb for MarketDb { RequestSortField::UpdatedAt => r.updated_at, RequestSortField::CreatedAt => r.created_at, }; - RequestCursor { timestamp, request_digest: r.request_digest.to_string() } + RequestCursor { timestamp, request_digest: format!("{:x}", r.request_digest) } }) } else { None @@ -5555,6 +5591,192 @@ mod tests { assert_eq!(count, 0); } + #[sqlx::test(migrations = "./migrations")] + async fn test_list_requests_with_status_filter(pool: sqlx::PgPool) { + let test_db = test_db(pool).await; + let db: DbObj = test_db.db; + + let base_ts = 1700000000u64; + + // Create requests with different statuses + let mut status1 = create_test_status(B256::from([1; 32]), RequestStatusType::Submitted); + status1.created_at = base_ts; + status1.updated_at = base_ts; + + let mut status2 = create_test_status(B256::from([2; 32]), RequestStatusType::Locked); + status2.created_at = base_ts + 100; + status2.updated_at = base_ts + 100; + status2.lock_prover_address = Some(Address::from([0xAA; 20])); + status2.locked_at = Some(base_ts + 100); + + let mut status3 = create_test_status(B256::from([3; 32]), RequestStatusType::Fulfilled); + status3.created_at = base_ts + 200; + status3.updated_at = base_ts + 200; + status3.fulfill_prover_address = Some(Address::from([0xBB; 20])); + status3.fulfilled_at = Some(base_ts + 200); + + let mut status4 = create_test_status(B256::from([4; 32]), RequestStatusType::Expired); + status4.created_at = base_ts + 300; + status4.updated_at = base_ts + 300; + + let mut status5 = create_test_status(B256::from([5; 32]), RequestStatusType::Submitted); + status5.created_at = base_ts + 400; + status5.updated_at = base_ts + 400; + + db.upsert_request_statuses(&[ + status1.clone(), + status2.clone(), + status3.clone(), + status4.clone(), + status5.clone(), + ]) + .await + .unwrap(); + + // Filter by Submitted status + let (results, _) = db + .list_requests( + None, + 10, + RequestSortField::CreatedAt, + Some(RequestStatusType::Submitted), + ) + .await + .unwrap(); + assert_eq!(results.len(), 2); + assert!(results.iter().all(|r| r.request_status == RequestStatusType::Submitted)); + + // Filter by Locked status + let (results, _) = db + .list_requests(None, 10, RequestSortField::CreatedAt, Some(RequestStatusType::Locked)) + .await + .unwrap(); + assert_eq!(results.len(), 1); + assert_eq!(results[0].request_status, RequestStatusType::Locked); + + // Filter by Fulfilled status + let (results, _) = db + .list_requests( + None, + 10, + RequestSortField::CreatedAt, + Some(RequestStatusType::Fulfilled), + ) + .await + .unwrap(); + assert_eq!(results.len(), 1); + assert_eq!(results[0].request_status, RequestStatusType::Fulfilled); + + // Filter by Expired status + let (results, _) = db + .list_requests(None, 10, RequestSortField::CreatedAt, Some(RequestStatusType::Expired)) + .await + .unwrap(); + assert_eq!(results.len(), 1); + assert_eq!(results[0].request_status, RequestStatusType::Expired); + + // No filter (all statuses) + let (results, _) = + db.list_requests(None, 10, RequestSortField::CreatedAt, None).await.unwrap(); + assert_eq!(results.len(), 5); + + // Filter with pagination - get page 1 + let (page1, cursor1) = db + .list_requests(None, 1, RequestSortField::CreatedAt, Some(RequestStatusType::Submitted)) + .await + .unwrap(); + assert_eq!(page1.len(), 1, "Page 1 should have 1 result"); + assert!(cursor1.is_some(), "Page 1 should have a cursor"); + + // Get page 2 + let (page2, cursor2) = db + .list_requests( + cursor1, + 1, + RequestSortField::CreatedAt, + Some(RequestStatusType::Submitted), + ) + .await + .unwrap(); + assert_eq!(page2.len(), 1, "Page 2 should have 1 result"); + + // Get page 3 - should be empty + let (page3, cursor3) = db + .list_requests( + cursor2, + 1, + RequestSortField::CreatedAt, + Some(RequestStatusType::Submitted), + ) + .await + .unwrap(); + assert_eq!(page3.len(), 0, "Page 3 should be empty"); + assert!(cursor3.is_none(), "Page 3 should have no cursor"); + } + + #[sqlx::test(migrations = "./migrations")] + async fn test_list_requests_pagination_same_timestamp(pool: sqlx::PgPool) { + let test_db = test_db(pool).await; + let db: DbObj = test_db.db; + + let same_ts = 1700000000u64; + + // Use digests whose first hex char is > '0' to trigger the cursor formatting bug. + // When the cursor uses 0x-prefixed hex (B256::to_string()), the SQL string comparison + // "request_digest < '0x3030...'" incorrectly excludes digests starting with '1' or '2' + // because '1' > '0' and '2' > '0' in ASCII, making them appear "greater" than the cursor. + let mut status_a = create_test_status(B256::from([0x10; 32]), RequestStatusType::Submitted); + status_a.created_at = same_ts; + status_a.updated_at = same_ts; + + let mut status_b = create_test_status(B256::from([0x20; 32]), RequestStatusType::Submitted); + status_b.created_at = same_ts; + status_b.updated_at = same_ts; + + let mut status_c = create_test_status(B256::from([0x30; 32]), RequestStatusType::Submitted); + status_c.created_at = same_ts; + status_c.updated_at = same_ts; + + db.upsert_request_statuses(&[status_a.clone(), status_b.clone(), status_c.clone()]) + .await + .unwrap(); + + // Paginate through all 3 records one at a time + let mut all_digests = Vec::new(); + let mut cursor = None; + + for page_num in 1..=4 { + let (results, next_cursor) = + db.list_requests(cursor, 1, RequestSortField::CreatedAt, None).await.unwrap(); + + if results.is_empty() { + assert!( + next_cursor.is_none(), + "Page {}: empty results should have no cursor", + page_num + ); + break; + } + + for r in &results { + all_digests.push(r.request_digest); + } + cursor = next_cursor; + } + + assert_eq!( + all_digests.len(), + 3, + "Should retrieve all 3 records via pagination, got {} (digests: {:?})", + all_digests.len(), + all_digests + ); + + // Verify all 3 distinct digests were returned + let unique: std::collections::HashSet<_> = all_digests.iter().collect(); + assert_eq!(unique.len(), 3, "All 3 records should be unique"); + } + #[sqlx::test(migrations = "./migrations")] async fn test_get_requests_comprehensive_with_multiple_fulfillments(pool: sqlx::PgPool) { let test_db = test_db(pool).await; diff --git a/crates/indexer/src/db/provers.rs b/crates/indexer/src/db/provers.rs index 53b7dee457..ea7d1b5c52 100644 --- a/crates/indexer/src/db/provers.rs +++ b/crates/indexer/src/db/provers.rs @@ -85,7 +85,7 @@ pub trait ProversDb: IndexerDb { RequestSortField::UpdatedAt => r.updated_at, RequestSortField::CreatedAt => r.created_at, }; - RequestCursor { timestamp, request_digest: r.request_digest.to_string() } + RequestCursor { timestamp, request_digest: format!("{:x}", r.request_digest) } }) } else { None diff --git a/crates/indexer/src/db/requestors.rs b/crates/indexer/src/db/requestors.rs index fcc155256a..9879d27a3e 100644 --- a/crates/indexer/src/db/requestors.rs +++ b/crates/indexer/src/db/requestors.rs @@ -251,7 +251,7 @@ pub trait RequestorDb: IndexerDb { RequestSortField::UpdatedAt => r.updated_at, RequestSortField::CreatedAt => r.created_at, }; - RequestCursor { timestamp, request_digest: r.request_digest.to_string() } + RequestCursor { timestamp, request_digest: format!("{:x}", r.request_digest) } }) } else { None diff --git a/crates/lambdas/indexer-api/src/routes/market.rs b/crates/lambdas/indexer-api/src/routes/market.rs index ebf7eaffae..1bf6eb022b 100644 --- a/crates/lambdas/indexer-api/src/routes/market.rs +++ b/crates/lambdas/indexer-api/src/routes/market.rs @@ -32,7 +32,7 @@ use crate::{ utils::{format_eth, format_zkc, is_valid_ethereum_address}, }; use boundless_indexer::db::market::{ - RequestCursor, RequestSortField, RequestStatus, SortDirection, + RequestCursor, RequestSortField, RequestStatus, RequestStatusType, SortDirection, }; use boundless_indexer::db::{IndexerDb, ProversDb, RequestorDb}; @@ -2117,6 +2117,10 @@ pub struct RequestListParams { /// Sort field: "updated_at" or "created_at" (default "created_at") #[serde(default)] sort_by: Option, + + /// Filter by request status: "submitted", "locked", "fulfilled", or "expired" + #[serde(default)] + status: Option, } fn encode_request_cursor(cursor: &RequestCursor) -> Result { @@ -2396,7 +2400,19 @@ async fn list_requests_impl( _ => anyhow::bail!("Invalid sort_by. Must be 'updated_at' or 'created_at'"), }; - let (statuses, next_cursor) = state.market_db.list_requests(cursor, limit, sort_by).await?; + let status = match params.status.as_deref() { + Some("submitted") => Some(RequestStatusType::Submitted), + Some("locked") => Some(RequestStatusType::Locked), + Some("fulfilled") => Some(RequestStatusType::Fulfilled), + Some("expired") => Some(RequestStatusType::Expired), + None => None, + _ => anyhow::bail!( + "Invalid status. Must be 'submitted', 'locked', 'fulfilled', or 'expired'" + ), + }; + + let (statuses, next_cursor) = + state.market_db.list_requests(cursor, limit, sort_by, status).await?; let data = statuses.into_iter().map(|s| convert_request_status(s, state.chain_id)).collect::>(); diff --git a/crates/lambdas/indexer-api/tests/local_integration/market.rs b/crates/lambdas/indexer-api/tests/local_integration/market.rs index f43721ee2e..b764930202 100644 --- a/crates/lambdas/indexer-api/tests/local_integration/market.rs +++ b/crates/lambdas/indexer-api/tests/local_integration/market.rs @@ -713,6 +713,62 @@ async fn test_market_requests_pagination() { } } +#[tokio::test] +#[cfg_attr(not(feature = "test-rpc"), ignore = "Requires BASE_MAINNET_RPC_URL")] +async fn test_market_requests_pagination_completeness() { + let env = TestEnv::market().await; + + // Fetch all requests in one go with a large limit + let all: RequestListResponse = env.get("/v1/market/requests?limit=500").await.unwrap(); + let total_count = all.data.len(); + tracing::info!("Total requests: {}", total_count); + assert!(total_count > 0, "Need at least some requests for this test"); + + let all_digests: std::collections::HashSet = + all.data.iter().map(|r| r.request_digest.clone()).collect(); + + // Paginate through with limit=1 and collect all digests + let mut paginated_digests = Vec::new(); + let mut cursor: Option = None; + let max_pages = total_count + 5; + + for _ in 0..max_pages { + let url = match &cursor { + Some(c) => format!("/v1/market/requests?limit=1&cursor={}", c), + None => "/v1/market/requests?limit=1".to_string(), + }; + let page: RequestListResponse = env.get(&url).await.unwrap(); + + for r in &page.data { + paginated_digests.push(r.request_digest.clone()); + } + + if !page.has_more { + break; + } + cursor = page.next_cursor; + } + + let paginated_set: std::collections::HashSet = + paginated_digests.iter().cloned().collect(); + + assert_eq!( + paginated_digests.len(), + paginated_set.len(), + "Pagination should not return duplicate records" + ); + + assert_eq!( + paginated_set.len(), + all_digests.len(), + "Paginating one-by-one should return the same number of records as a bulk fetch. \ + Got {} via pagination vs {} via bulk. Missing: {:?}", + paginated_set.len(), + all_digests.len(), + all_digests.difference(&paginated_set).collect::>() + ); +} + #[tokio::test] #[cfg_attr(not(feature = "test-rpc"), ignore = "Requires BASE_MAINNET_RPC_URL")] async fn test_market_requests_sorting() { From 2df2615b83617147c8f8fdc46ccc9c8d0c42d5ac Mon Sep 17 00:00:00 2001 From: Pote <81638931+willpote@users.noreply.github.com> Date: Mon, 9 Feb 2026 12:43:36 -0600 Subject: [PATCH 2/9] Update pr command to open browser instead of submitting directly Co-authored-by: Cursor --- .cursor/commands/pr/COMMAND.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/.cursor/commands/pr/COMMAND.md b/.cursor/commands/pr/COMMAND.md index b7b9a67fc7..a5e5d83aec 100644 --- a/.cursor/commands/pr/COMMAND.md +++ b/.cursor/commands/pr/COMMAND.md @@ -7,8 +7,19 @@ Create/update a pull request for the current changes. 4. Write a clear commit message based on what changed (use commit message style below) 5. Commit and push to the current branch 6. Check if an existing PR exists. Ignore warnings about GraphQL: Projects (classic) being deprecated. - 1. If not, use `gh pr create --web --title --body <body>` to generate a pull request URL with title/description (use PR Title/Description Guidelines below) - 2. Else update the description with the new changes. + 1. If not, construct the GitHub PR creation URL and open it in the browser so the user can review before submitting: + ``` + REPO=$(gh repo view --json nameWithOwner -q .nameWithOwner) + BRANCH=$(git branch --show-current) + BASE=$(gh repo view --json defaultBranchRef -q .defaultBranchRef.name) + TITLE=$(python3 -c "import urllib.parse; print(urllib.parse.quote('<title>'))") + BODY=$(python3 -c "import urllib.parse; print(urllib.parse.quote('<body>'))") + URL="https://github.com/${REPO}/compare/${BASE}...${BRANCH}?expand=1&title=${TITLE}&body=${BODY}" + open "$URL" + ``` + Use the PR Title/Description Guidelines below for title and body. + IMPORTANT: Do NOT use `gh pr create` (without --web it submits directly, with --web it prints nothing in non-TTY shells). + 2. Else update the description with `gh pr edit`. 7. Return the PR URL when done # Commit message style From c71907cfaed0b652bb88b8625052758df4441ba8 Mon Sep 17 00:00:00 2001 From: Pote <81638931+willpote@users.noreply.github.com> Date: Tue, 10 Feb 2026 11:26:15 -0600 Subject: [PATCH 3/9] Rename migration 37 to 39 to avoid conflict with main Co-authored-by: Cursor <cursoragent@cursor.com> --- ...eated_index.sql => 39_request_status_status_created_index.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename crates/indexer/migrations/{37_request_status_status_created_index.sql => 39_request_status_status_created_index.sql} (100%) diff --git a/crates/indexer/migrations/37_request_status_status_created_index.sql b/crates/indexer/migrations/39_request_status_status_created_index.sql similarity index 100% rename from crates/indexer/migrations/37_request_status_status_created_index.sql rename to crates/indexer/migrations/39_request_status_status_created_index.sql From e17c7c70327ad0c5846c35e415c6927aa28bef5b Mon Sep 17 00:00:00 2001 From: Pote <81638931+willpote@users.noreply.github.com> Date: Tue, 10 Feb 2026 21:27:54 -0600 Subject: [PATCH 4/9] fix migration file merge --- ...eated_index.sql => 40_request_status_status_created_index.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename crates/indexer/migrations/{39_request_status_status_created_index.sql => 40_request_status_status_created_index.sql} (100%) diff --git a/crates/indexer/migrations/39_request_status_status_created_index.sql b/crates/indexer/migrations/40_request_status_status_created_index.sql similarity index 100% rename from crates/indexer/migrations/39_request_status_status_created_index.sql rename to crates/indexer/migrations/40_request_status_status_created_index.sql From ac38842dd358c834aecacb0f64095fe0e5381b08 Mon Sep 17 00:00:00 2001 From: Pote <81638931+willpote@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:04:06 -0600 Subject: [PATCH 5/9] fix migration numbers --- .../migrations/40_request_status_status_created_index.sql | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 crates/indexer/migrations/40_request_status_status_created_index.sql diff --git a/crates/indexer/migrations/40_request_status_status_created_index.sql b/crates/indexer/migrations/40_request_status_status_created_index.sql deleted file mode 100644 index 233315a5ae..0000000000 --- a/crates/indexer/migrations/40_request_status_status_created_index.sql +++ /dev/null @@ -1,4 +0,0 @@ --- Index for filtering requests by status sorted by created_at --- Complements idx_request_status_status_updated which sorts by updated_at -CREATE INDEX IF NOT EXISTS idx_request_status_status_created - ON request_status (request_status, created_at DESC); From a1414e508572033dc038aad60c33c8c784c4b6fe Mon Sep 17 00:00:00 2001 From: Pote <81638931+willpote@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:04:13 -0600 Subject: [PATCH 6/9] fix migration numbers --- .../migrations/41_request_status_status_created_index.sql | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 crates/indexer/migrations/41_request_status_status_created_index.sql diff --git a/crates/indexer/migrations/41_request_status_status_created_index.sql b/crates/indexer/migrations/41_request_status_status_created_index.sql new file mode 100644 index 0000000000..233315a5ae --- /dev/null +++ b/crates/indexer/migrations/41_request_status_status_created_index.sql @@ -0,0 +1,4 @@ +-- Index for filtering requests by status sorted by created_at +-- Complements idx_request_status_status_updated which sorts by updated_at +CREATE INDEX IF NOT EXISTS idx_request_status_status_created + ON request_status (request_status, created_at DESC); From 3ad56454184bb34ab80961e5e526ef97ea0e2ea8 Mon Sep 17 00:00:00 2001 From: Pote <81638931+willpote@users.noreply.github.com> Date: Wed, 25 Feb 2026 10:11:24 -0600 Subject: [PATCH 7/9] Migration fix --- .../migrations/41_request_status_status_created_index.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/indexer/migrations/41_request_status_status_created_index.sql b/crates/indexer/migrations/41_request_status_status_created_index.sql index 233315a5ae..6bdda1f621 100644 --- a/crates/indexer/migrations/41_request_status_status_created_index.sql +++ b/crates/indexer/migrations/41_request_status_status_created_index.sql @@ -2,3 +2,4 @@ -- Complements idx_request_status_status_updated which sorts by updated_at CREATE INDEX IF NOT EXISTS idx_request_status_status_created ON request_status (request_status, created_at DESC); +Here are some of the names. \ No newline at end of file From ecc00c0f0f8ee1379a1bb8d519b79ff1dd6c0d06 Mon Sep 17 00:00:00 2001 From: Pote <81638931+willpote@users.noreply.github.com> Date: Wed, 25 Feb 2026 10:11:47 -0600 Subject: [PATCH 8/9] Migration fix --- ...eated_index.sql => 42_request_status_status_created_index.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename crates/indexer/migrations/{41_request_status_status_created_index.sql => 42_request_status_status_created_index.sql} (100%) diff --git a/crates/indexer/migrations/41_request_status_status_created_index.sql b/crates/indexer/migrations/42_request_status_status_created_index.sql similarity index 100% rename from crates/indexer/migrations/41_request_status_status_created_index.sql rename to crates/indexer/migrations/42_request_status_status_created_index.sql From 16cf7898b4ecbd6e0f81f1fc862b76ea71ff2080 Mon Sep 17 00:00:00 2001 From: Pote <81638931+willpote@users.noreply.github.com> Date: Wed, 25 Feb 2026 10:12:52 -0600 Subject: [PATCH 9/9] fix --- .../migrations/42_request_status_status_created_index.sql | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/indexer/migrations/42_request_status_status_created_index.sql b/crates/indexer/migrations/42_request_status_status_created_index.sql index 6bdda1f621..e53d87cbc2 100644 --- a/crates/indexer/migrations/42_request_status_status_created_index.sql +++ b/crates/indexer/migrations/42_request_status_status_created_index.sql @@ -1,5 +1,4 @@ -- Index for filtering requests by status sorted by created_at -- Complements idx_request_status_status_updated which sorts by updated_at CREATE INDEX IF NOT EXISTS idx_request_status_status_created - ON request_status (request_status, created_at DESC); -Here are some of the names. \ No newline at end of file + ON request_status (request_status, created_at DESC); \ No newline at end of file