GraphQL Clojure: получение полей запроса GQL - PullRequest
2 голосов
/ 13 февраля 2020

Я использую библиотеку lacinia для моего сервера GrapQL Clojure.
Для этой простой схемы:

input QueryConfig {
  startDate: String!
  endDate: String!
}


type MyData{
  x: Float!
  y: Float!
  z: Float!
}

schema {
    query: Query
}

type Query {
  myQuery(config:QueryConfig) : [MyData]
}

Я отправляю следующий запрос:

{
  myQuery(config:{startDate:"2020-01-01",endDate:"2020-01-01"}){
    x
  }
}

В моем коде распознавателя я хотел бы знать, какие поля были запрошены (x в приведенном выше примере), поэтому я не буду перебирать результаты из моей БД и извлекать только значения x .

В коде распознавателя контекст содержит ключ : graphql-query , который содержит весь запрос. Однако синтаксический анализ текста запроса кажется неудобным.

(defn my-resolver
  [context args value]
  ;TODO find out what fields were asked and fetch from DB
  )

Каким будет правильный способ получения полей запроса?

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

Из документов :

Также можно получить все поля, которые будут выбраны, используя selections-seq. Это ленивая, в первую очередь навигация по всем полям в дереве выбора.

Таким образом, вы можете использовать: (executor/selections-seq context), чтобы получить все поля, отправленные запросом.

1 голос
/ 14 февраля 2020

Lacinia позволяет предварительно просматривать вложенные выборки:

Средство распознавания полей может «предварительно просматривать», какие поля будут выделены под ним в дереве выбора. Этот инструмент часто используется для оптимизации операций извлечения данных.

Пример кода из документов :

(require
  '[com.walmartlabs.lacinia.executor :as executor])

(defn resolve-hero
  [context args _]
  (if (executor/selects-field? context :character/friends)
    (fetch-hero-with-friends args)
    (fetch-hero args)))
...