Пустые объекты "узла", возвращаемые из ответа graphql - PullRequest
1 голос
/ 25 сентября 2019

Я только начал изучать graphql и создал запрос, который возвращает список первых 10 закрытых проблем с некоторыми атрибутами.К моему удивлению, объекты ответа в JSON, которые я получаю, иногда пусты, а иногда не пусты.Ответ случайный. Я также проверил с почтальоном.Поскольку я отображаю ответ json на классы Java, используя Джексона и выполняя некоторые операции, возникают исключения при обработке пустых объектов.

1) По сути, я хочу непустые объекты закрытых вопросов.Что-то не так в запросе?Если да, может кто-нибудь сказать правильный запрос?

2) Кроме того, я хотел бы знать логику возврата пустых объектов узла

Используемый запрос


{
  search(first: 20, type: ISSUE, query: "created:<2019-09-21 state:closed") {
    issueCount
    edges {
      node {
        ... on Issue {
          createdAt
          closedAt
          title
          url
          repository {
            name
          }
        }
      }
    }
  }
}

Ответ1

{
    "data": {
        "search": {
            "issueCount": 92339271,
            "edges": [
                {
                    "node": {
                        "createdAt": "2019-09-20T23:59:57Z",
                        "closedAt": "2019-09-21T19:59:32Z",
                        "title": "MJPEG stream won't open",
                        "url": "https://github.com/mpv-player/mpv/issues/6964",
                        "repository": {
                            "name": "mpv"
                        }
                    }
                },
                {
                    "node": {
                        "createdAt": "2019-09-20T23:59:50Z",
                        "closedAt": "2019-09-21T01:19:39Z",
                        "title": "Upgrade from v0.5.0 to v0.6.0 with attached volume failed",
                        "url": "https://github.com/longhorn/longhorn/issues/745",
                        "repository": {
                            "name": "longhorn"
                        }
                    }
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {
                        "createdAt": "2019-09-20T23:58:52Z",
                        "closedAt": "2019-09-21T01:55:15Z",
                        "title": "bad linkage",
                        "url": "https://github.com/signalapp/Signal-Desktop/issues/3608",
                        "repository": {
                            "name": "Signal-Desktop"
                        }
                    }
                },
                {
                    "node": {}
                },
                {
                    "node": {
                        "createdAt": "2019-09-20T23:58:36Z",
                        "closedAt": "2019-09-21T00:57:54Z",
                        "title": "Breaks Some Links on Firefox for Mac",
                        "url": "https://github.com/duckduckgo/duckduckgo-privacy-extension/issues/416",
                        "repository": {
                            "name": "duckduckgo-privacy-extension"
                        }
                    }
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {
                        "createdAt": "2019-09-20T23:56:11Z",
                        "closedAt": "2019-09-23T18:43:30Z",
                        "title": "ci: upload coverage reports from GitHub Actions",
                        "url": "https://github.com/hyperledger/aries-framework-go/issues/314",
                        "repository": {
                            "name": "aries-framework-go"
                        }
                    }
                },
                {
                    "node": {}
                },
                {
                    "node": {
                        "createdAt": "2019-09-20T23:56:07Z",
                        "closedAt": "2019-09-21T02:53:35Z",
                        "title": "0xxx.ws",
                        "url": "https://github.com/NanoMeow/QuickReports/issues/1885",
                        "repository": {
                            "name": "QuickReports"
                        }
                    }
                }
            ]
        }
    }
}

Ответ 2

{
    "data": {
        "search": {
            "issueCount": 92339271,
            "edges": [
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {
                        "createdAt": "2019-09-20T23:58:36Z",
                        "closedAt": "2019-09-21T00:57:54Z",
                        "title": "Breaks Some Links on Firefox for Mac",
                        "url": "https://github.com/duckduckgo/duckduckgo-privacy-extension/issues/416",
                        "repository": {
                            "name": "duckduckgo-privacy-extension"
                        }
                    }
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                },
                {
                    "node": {}
                }
            ]
        }
    }
}

1 Ответ

1 голос
/ 25 сентября 2019

Тип поля node - SearchResultItem, то есть интерфейс .Интерфейс - это абстрактный тип, который представляет один или несколько типов объектов, которые реализуют этот интерфейс.Другими словами, тип любого конкретного поля node в результатах поиска может быть одного из нескольких типов - Issue, PullRequest, Repository и т. Д.

При запросе абстрактного типа(интерфейс или объединение), мы должны использовать встроенные фрагменты , чтобы указать, какие поля для каждого возможного типа мы хотим получить.Поэтому для поиска пишем:

... on Issue {
  # some fields here
}
... on PullRequest {
  # some other fields here
}
... on Repository {
  # yet some other fields here
}

и так далее.Встроенные фрагменты только сообщают GraphQL, какие поля возвращать для данного типа. Они не фильтруют фактические результаты поиска. Вам не нужно указывать встроенный фрагмент для каждого возможного типа, но если вы его не предоставите, и этот тип возвращается в результатах, онбудет возвращен как пустой объект (опять же, потому что вы не указали GraphQL, какие поля вам нужны для этого конкретного типа).

GraphQL не предоставляет никаких встроенных методов для фильтрации, сортировки или других манипуляций свозвращенные данные.Это зависит от отдельной службы, чтобы реализовать эту функциональность, если это необходимо.В данном конкретном случае, даже если в поле search есть аргумент type, установка значения аргумента в ISSUE на самом деле будет по-прежнему возвращать два разных типа - Issue и PullRequest.Поэтому вам все еще нужен еще один встроенный фрагмент для PullRequest, если вы хотите избежать получения пустого объекта для некоторых результатов поиска.

...