netbox-community / netbox

The premier source of truth powering network automation. Open source under Apache 2. Try NetBox Cloud free: https://netboxlabs.com/free-netbox-cloud/
http://netboxlabs.com/oss/netbox/
Apache License 2.0
16.21k stars 2.59k forks source link

GraphQL Pagination #16224

Open jepify opened 5 months ago

jepify commented 5 months ago

NetBox version

v4.0.2

Feature type

Data model extension

Proposed functionality

Pagination in GraphQL. With the newly Strawberry.rocks GraphQL engine, it is possible to implement Pagination with a few simple modifications.

GraphQL Pagination Strawberry Pagination Strawberry Django offset-based Strawberry Django cursor-based

Given the different ways of implementing pagination, it should be able to co-exist with non paginated queries, if needed. This could be done by e.g. keeping the regular e.g. device_list query and a device_connection query.

Use case

With large tables with e.g. interfaces doing queries with nested objects takes a lot of time due to the translation from QuerySets via the Execution of fields part of the spec.

Other forks like Nautobot supports offset-based pagination and the Rest API supports offset-based, so it would be a nice addition to the future use of GraphQL.

Currently if we want to do pagination for GraphQL we are to utilize the ordering and pagination of the Rest API with ordering and id__gtqueries.

The query could be:

query MyQuery {
  device_list(first: 2, after:"YXJyYXljb25uZWN0aW9uOjM=") {
    edges {
      cursor
      node {
        id
        name
      }
    }
    page_info {
      has_next_page
      has_previous_page
      start_cursor
      end_cursor
    }
  }
  device_role_list(pagination: {offset: 2, limit: 2}) {
    name
    id
  }
}

And would result in:

{
  "data": {
    "device_list": {
      "edges": [
        {
          "cursor": "YXJyYXljb25uZWN0aW9uOjQ=",
          "node": {
            "id": "33577",
            "name": "01-02-1 Cable management (U22)"
          }
        },
        {
          "cursor": "YXJyYXljb25uZWN0aW9uOjU=",
          "node": {
            "id": "33576",
            "name": "01-02-1 RJ45 PP (U26)"
          }
        }
      ],
      "page_info": {
        "has_next_page": true,
        "has_previous_page": true,
        "start_cursor": "YXJyYXljb25uZWN0aW9uOjQ=",
        "end_cursor": "YXJyYXljb25uZWN0aW9uOjU="
      }
    },
    "device_role_list": [
      {
        "name": "Access Switch",
        "id": "30"
      },
      {
        "name": "Analyzer",
        "id": "826"
      }
    ]
  }
}

Database changes

None

External dependencies

None

github-actions[bot] commented 2 months ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. NetBox is governed by a small group of core maintainers which means not all opened issues may receive direct feedback. Do not attempt to circumvent this process by "bumping" the issue; doing so will result in its immediate closure and you may be barred from participating in any future discussions. Please see our contributing guide.