Представление вычислений / функций скрипта в запросах и схеме GraphQL

Мы используем GraphQL в качестве языка запросов для механизма агрегирования данных.

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

Я изучаю специальные скаляры и директивы

Пример -

{
    item{
        units
        price_per_unit
        market_price: function:multiply(units, price_per_unit)
        market_price_usd: function:usdPrice(units, price_per_unit, currency)
    }
}

где функция: умножение уже определена в схеме GraphQL как тип

functions {
    multiply(operand 1, operand2) {
        result
    }
    usdPrice(operand1, operand2, currency) {
        result: {
                if(currency == GBP) {
                    operand1 * operand2 * .76
                }
            {
    }

внутренний преобразователь умножит операнд 1 и операнд 2 для создания результата.


person am00100    schedule 24.09.2018    source источник


Ответы (1)


Это не то, в чем GraphQL особенно хорош. Безусловно, проще всего будет получить отдельные поля, а затем выполнить вычисления на клиенте, что-то вроде

data.item.forEach((i) => { i.total_price = i.units * i.price_per_unit });

В частности, в GraphQL нет возможности запускать какие-либо «подзапросы». Учитывая функцию «умножения», как вы показали, нет синтаксиса GraphQL, который позволил бы вам «вызывать» ее с любыми конкретными входными данными.

Если вы считаете, что определенные вычисленные значения достаточно распространены, вы также можете добавить их в схему GraphQL и вычислить их на стороне сервера, если потребуется, с использованием настраиваемой функции преобразователя.

type Item {
  units: Int!
  pricePerUnit: CurrencyValue!
  # computed, always units * pricePerUnit
  marketPrice: CurrencyValue!
}
type CurrencyValue {
  amount: Float!
  currency: Currency!
  # computed, always amount * currency { usd }
  usd: Float!
}
type Currency {
  code: String!
  "1 currency = this many US$"
  usd: Float!
}

разрешая такие запросы, как

{
  item {
    marketPrice { usd }
  }
}
person David Maze    schedule 25.09.2018