-
-
Notifications
You must be signed in to change notification settings - Fork 778
Fixed relative cursors to handle nullable types. #8230
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Fixed relative cursors to handle nullable types. #8230
Conversation
…ly fails to highlight a flaw in the implementation. The algorithm expects that null values are smaller than any other value when ordering.
The PR looks very good.
This is another aspect we were also looking into ... especially as with postgres null order can be configured to be at the beginning of a set or at the and of a set. I will copy over some new tests that we had in our work branch for nullable cursor values. Ping me on slack once you have solved the null ordering issue and we can see to get this one merged. |
…ll values are ordered first or last.
Ping me once you need help, want another review or are ready to merge. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Copilot reviewed 34 out of 34 changed files in this pull request and generated no comments.
Comments suppressed due to low confidence (1)
src/GreenDonut/src/GreenDonut.Data.EntityFramework/Expressions/ExpressionHelpers.cs:73
- The variable 'forward' is not defined in the current scope; please define it or pass it as a parameter to ensure correct directional logic in the expression building.
var greaterThan = forward ? key.Direction == CursorKeyDirection.Ascending : key.Direction == CursorKeyDirection.Descending;
🧭 Paging Cursor Enhancements: Nullable Keys and Null Ordering Support
Summary
This PR introduces enhancements to the paging logic to correctly handle sorting and filtering when cursor keys are nullable. The main change is that the
WHERE
condition used in pagination must now adapt based on three factors:null
or not.null
values first or last.🔍 Why This Is Needed
When performing cursor-based pagination on fields that can be
null
, it's essential to construct theWHERE
clause correctly. Incorrect assumptions aboutnull
ordering or the presence ofnull
values can result in missing or duplicated records across pages.🔧 Implementation Details
To support this behavior, the following changes were made:
Cursor Key Metadata
IsNullable
) to indicate whether they are nullable.Null Ordering in Cursor
NullsFirst
flag to indicate hownull
values are ordered.null
value:null
is found → we can determine the null ordering: nulls first(nulls last).null
values in the dataset, making null ordering irrelevant.✅ Benefits
null
records might be skipped or duplicated.nulls first
andnulls last
configurations in the database.If our assumption about null ordering is incorrect, secondary ordering keys may appear to be sorted in reverse (opposite to the database's actual null handling behavior), particularly when paginating backward from the last page.
This only affects the visual or logical order of
null
values relative to each other and does not break pagination—all items will still be included in the correct pages.