在GraphQL查询和模式中表示计算/脚本功能

时间:2018-09-24 20:33:49

标签: graphql graphql-java

我们正在使用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模式中,已经将function:multiply定义为类型

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

内部解析器会将操作数1和操作数2相乘以创建结果。

1 个答案:

答案 0 :(得分:0)

这不是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 }
  }
}