From 2bc29b9cc0cf0a4605c16b526a562301400e1554 Mon Sep 17 00:00:00 2001 From: Jkorf Date: Mon, 16 Feb 2026 15:36:47 +0100 Subject: [PATCH] wip --- CryptoExchange.Net/ExchangeHelpers.cs | 14 -- .../SharedApis/Models/Pagination.cs | 186 ++++++++++++++++++ 2 files changed, 186 insertions(+), 14 deletions(-) diff --git a/CryptoExchange.Net/ExchangeHelpers.cs b/CryptoExchange.Net/ExchangeHelpers.cs index 4efff1d..56377bc 100644 --- a/CryptoExchange.Net/ExchangeHelpers.cs +++ b/CryptoExchange.Net/ExchangeHelpers.cs @@ -450,20 +450,6 @@ namespace CryptoExchange.Net }; } - // Without date/time filter - public static PageRequest? GetNextPageRequestPageSimple( - PageRequest? currentPageRequest, - bool hasNextPage, - IEnumerable timeSelector, - DateTime? requestStartTime, - DateTime? requestEndTime - ) - { - if (CheckForNextPage(timeSelector, requestStartTime, requestEndTime, limit, direction)) - { - } - } - public static PageRequest? GetNextPageRequest( Func normalNextPageCallback, int responseLength, diff --git a/CryptoExchange.Net/SharedApis/Models/Pagination.cs b/CryptoExchange.Net/SharedApis/Models/Pagination.cs index 30ba2e5..a7def01 100644 --- a/CryptoExchange.Net/SharedApis/Models/Pagination.cs +++ b/CryptoExchange.Net/SharedApis/Models/Pagination.cs @@ -14,6 +14,7 @@ namespace CryptoExchange.Net.SharedApis public record PaginationParameters { + public DataDirection Direction { get; set; } public DateTime? StartTime { get; set; } public DateTime? EndTime { get; set; } public string? FromId { get; set; } @@ -39,5 +40,190 @@ namespace CryptoExchange.Net.SharedApis public static PageRequest NextStartTimeAsc(IEnumerable timestampSelector) => new PageRequest { StartTime = timestampSelector.Max().AddMilliseconds(1) }; public static PageRequest NextEndTimeDesc(IEnumerable timestampSelector) => new PageRequest { EndTime = timestampSelector.Min().AddMilliseconds(-1) }; } + + public static class Pagination + { + public static PaginationParameters GetPaginationParameters( + DataDirection direction, + DateTime? requestStartTime, + DateTime requestEndTime, + PageRequest? paginationRequest, + bool setOtherTimeLimiter = true, + TimeSpan? maxPeriod = null + ) + { + var startTime = paginationRequest?.StartTime ?? requestStartTime; + var endTime = paginationRequest?.EndTime ?? requestEndTime; + if (maxPeriod != null) + { + if (direction == DataDirection.Ascending) + { + if (startTime == null) + startTime = endTime.Add(-maxPeriod.Value); + else + endTime = startTime.Value.Add(maxPeriod.Value); + } + else + { + startTime = endTime.Add(-maxPeriod.Value); + } + } + return new PaginationParameters + { + StartTime = direction == DataDirection.Ascending || setOtherTimeLimiter ? startTime : null, + EndTime = direction == DataDirection.Descending || setOtherTimeLimiter ? endTime : null, + Direction = direction, + FromId = paginationRequest?.FromId, + Offset = paginationRequest?.Offset, + Page = paginationRequest?.Page + }; + } + + public static PageRequest? GetNextPageRequest( + Func nextPageRequest, + int resultCount, + IEnumerable timestamps, + DateTime? requestStartTime, + DateTime requestEndTime, + int limit, + DataDirection direction, + PaginationParameters lastPaginationData, + TimeSpan? maxTimespan = null + ) + { + if (HasNextPage(resultCount, timestamps, requestStartTime, requestEndTime, limit, direction)) + return nextPageRequest(); + + if (maxTimespan != null) + { + if (HasNextPeriod(requestStartTime, requestEndTime, direction, lastPaginationData, maxTimespan.Value)) + { + var (startTime, endTime) = GetNextPeriod(requestStartTime, requestEndTime, direction, lastPaginationData, maxTimespan.Value); + return new PageRequest + { + StartTime = startTime, + EndTime = endTime + }; + } + } + + return null; + } + + public static bool HasNextPage( + int resultCount, + IEnumerable timestamps, + DateTime? requestStartTime, + DateTime requestEndTime, + int limit, + DataDirection direction) + { + if (resultCount < limit) + return false; + + if (!timestamps.Any()) //? + return false; + + if (direction == DataDirection.Ascending) + { + if (timestamps.Max() >= requestEndTime) + return false; + + return true; + } + else + { + if (timestamps.Min() < requestStartTime) + return false; + + return true; + } + } + + public static PageRequest NextPageFromPage(PaginationParameters lastPaginationData) + { + return new PageRequest { Page = lastPaginationData.Page + 1 }; + } + public static PageRequest NextPageFromOffset(PaginationParameters lastPaginationData, int resultCount) + { + return new PageRequest { Offset = lastPaginationData.Offset + resultCount }; + } + public static PageRequest NextPageFromCursor(string nextCursor) + { + return new PageRequest { Cursor = nextCursor }; + } + public static PageRequest NextPageFromId(long nextFromId) + { + return new PageRequest { FromId = nextFromId.ToString() }; + } + public static PageRequest NextPageFromId(string nextFromId) + { + return new PageRequest { FromId = nextFromId }; + } + public static PageRequest NextPageFromTime(PaginationParameters lastPaginationData, DateTime lastTimestamp, bool setOtherTimeLimiter) + { + if (lastPaginationData.Direction == DataDirection.Ascending) + return new PageRequest { StartTime = lastTimestamp.AddMilliseconds(1), EndTime = setOtherTimeLimiter ? lastPaginationData.EndTime : null }; + else + return new PageRequest { EndTime = lastTimestamp.AddMilliseconds(-1), StartTime = setOtherTimeLimiter ? lastPaginationData.StartTime : null }; + } + + public static bool HasNextPeriod( + DateTime? requestStartTime, + DateTime requestEndTime, + DataDirection direction, + PaginationParameters lastPaginationParameters, + TimeSpan period) + { + if (direction == DataDirection.Ascending && lastPaginationParameters.StartTime == null) + throw new Exception(); + + if (direction == DataDirection.Ascending) + { + return (requestEndTime - lastPaginationParameters.EndTime!.Value).TotalSeconds > 1; + } + else + { + if (requestStartTime != null) + return (lastPaginationParameters.StartTime!.Value - requestStartTime.Value).TotalSeconds > 1; + else + return (lastPaginationParameters.StartTime!.Value - (lastPaginationParameters.EndTime!.Value - period)).TotalSeconds > 1; + } + } + + public static (DateTime? startTime, DateTime? endTime) GetNextPeriod( + DateTime? requestStartTime, + DateTime requestEndTime, + DataDirection direction, + PaginationParameters lastPaginationParameters, + TimeSpan period + ) + { + DateTime? nextStartTime = null; + DateTime? nextEndTime = null; + if (direction == DataDirection.Ascending) + { + if (lastPaginationParameters.StartTime != null) + nextStartTime = lastPaginationParameters.StartTime.Value.Add(period); + if (lastPaginationParameters.EndTime != null) + nextEndTime = lastPaginationParameters.EndTime.Value.Add(period); + } + else + { + if (lastPaginationParameters.StartTime != null) + nextStartTime = lastPaginationParameters.StartTime.Value.Add(-period); + if (lastPaginationParameters.EndTime != null) + nextEndTime = lastPaginationParameters.EndTime.Value.Add(-period); + } + + if (nextStartTime != null && nextStartTime < requestStartTime) + nextStartTime = requestStartTime; + + if (nextEndTime != null && nextEndTime > requestEndTime) + nextEndTime = requestEndTime; + + return (nextStartTime, nextEndTime); + } + } }