Skip to content
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

HasPreviousPage is always false #2737

Closed
salim-dev opened this issue Jul 5, 2018 · 8 comments

Comments

Projects
None yet
4 participants
@salim-dev
Copy link

commented Jul 5, 2018

Query :

PostsConnection(first:3, after: "cjhabyv7j002h0924alphj8rw"){
pageInfo{hasNextPage hasPreviousPage startCursor endCursor}
edges {node{
id
title
}
aggregate{count}
}

output:

{
"data": {
"setsConnection": {
"pageInfo": {
"hasNextPage": true,
"hasPreviousPage": false
"startCursor": "cjhabyv89002l09240y3rts33",
"endCursor": "cjhabyvaa002t0924vkgydelt"
},
"edges": [
{
"node": {
"id": "cjhabyv89002l09240y3rts33",
"title": "Title 10"
}
},
{
"node": {
"id": "cjhabyv9f002p09242pyuqecg",
"title": "Title 11"
}
},
{
"node": {
"id": "cjhabyvaa002t0924vkgydelt",
"title": "Title 12"
}
},
],
"aggregate": {
"count": 18
}
}
}
}

datamodel :

type Post {
id: ID!
createdAt: DateTime!
updatedAt: DateTime!
title: String!
content: String!
author: User!
isPublished: Boolean @default(value: false)
}

type User {
id: ID!
role: ROLE @default(value: CONTRIBUTOR)
createdAt: DateTime!
updatedAt: DateTime!
posts: [Post!]

}
enum ROLE {
ADMIN
EDITOR
CONTRIBUTOR
}

Versions (please complete the following information):

  • OS: `Windows 10
  • prisma CLI: prisma/1.11.0
  • Prisma Server: 1.11 / 1.10 / 1.9
  • Connectors : Mysql 5.7 , Postgres
@salim-dev

This comment has been minimized.

Copy link
Author

commented Jul 6, 2018

HasPreviousPage is always false if you are paging forwards

@salim-dev

This comment has been minimized.

Copy link
Author

commented Jul 6, 2018

does this link answer my problem ?
graphql/graphql-relay-js#58 (comment)

@salim-dev salim-dev changed the title hasPreviousPage Not Working HasPreviousPage is always false Jul 6, 2018

@codepunkt

This comment has been minimized.

Copy link
Contributor

commented Jul 6, 2018

Same problem here, running on 1.11.0.

@marktani

This comment has been minimized.

Copy link
Contributor

commented Jul 6, 2018

@salim-dev please provide more information, the following is not clear (also compare to the bug report template):

  • A clear and concise description of what the bug is.
  • Steps to reproduce the behavior
  • A clear and concise description of what you expected to happen.

Thanks!

@codepunkt

This comment has been minimized.

Copy link
Contributor

commented Jul 6, 2018

Will most likely get back at this in the afternoon and provide a clearer description. I think what we assume is an error might be intended behavior.

@codepunkt

This comment has been minimized.

Copy link
Contributor

commented Jul 8, 2018

Sorry, didn't find the time so far.

The hasPreviousPage provided by PageInfo on connection queries seems to be false in circumstances where i, and i assume @salim-dev aswell, would expect them to be true.

A simple example where you have a list of 5 posts (ids "1"-"5") in the database and query postsConnection, paginating forward using a first limit and an after cursor:

first after startCursor endCursor hasNextPage hasPreviousPage
2 "1" "2" true false
2 "2" "3" "4" true false
2 "4" "5" false false

We might only want to show 2 items at a time with forward & back buttons. The hasNextPage tells us reliably if we can expect another page or should disable the forward button. The hasPreviousPage doesn't do so. While we can still try to fetch the results from the previous page on click of the back button by querying with a before with the value of the startCursor, we don't know beforehand if we will get any results or simply turn up empty.

What is expected is instead this:

first after startCursor endCursor hasNextPage hasPreviousPage
2 "1" "2" true false
2 "2" "3" "4" true true
2 "4" "5" false true

The same problem occurs when paginating backwards using last and before instead of first and after - hasPreviousPage is correctly set but hasNextPage is always false.

The relay spec states:

hasPreviousPage is used to indicate whether more edges exist prior to the set defined by the clients arguments. If the client is paginating with last/before, then the server must return true if prior edges exist, otherwise false. If the client is paginating with first/after, then the client may return true if edges prior to after exist, if it can do so efficiently, otherwise may return false.

hasNextPage is used to indicate whether more edges exist following the set defined by the clients arguments. If the client is paginating with first/after, then the server must return true if further edges exist, otherwise false. If the client is paginating with last/before, then the client may return true if edges further from before exist, if it can do so efficiently, otherwise may return false.

Therefore i assume this could be handled as a feature request. A feature, i might add, that would be very helpful because basic bi-directional windowed pagination can not be performed satisfyingly at the moment.

@marktani

This comment has been minimized.

Copy link
Contributor

commented Jul 11, 2018

Thanks a lot for that detailed description @codepunkt.
This is indeed a feature request. Could you please formulate a new feature request?

I'm closing this issue as it's not a bug. Thanks @codepunkt @salim-dev!

@marktani marktani closed this Jul 11, 2018

@codepunkt

This comment has been minimized.

Copy link
Contributor

commented Jul 12, 2018

Done at #2765

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.