INTEGRITY Dokumentace

Vnořené struktury

Podporovány jsou dva druhy vnořených struktur: pole a mapy. Pole obou těchto typů jsou pole (array); pokud jsou součástí výsledku dotazu, který je již polem objektů, stanou se vnořenými poli.

Pole

GraphQL API podporuje dva různé druhy polí:

Pole neskalárních typů se chovají jako jediná hodnota. Pole nelze stránkovat, filtrovat, filtrovat podle něj, seskupovat ani podle něj seskupovat.

Naproti tomu si můžete zvolit, která pole podkladového typu chcete načíst.

Mějme například tato pole:

type SubRequest {
    url: String!
    status: Int
}

type Request {
    date: Date!
    datetime: DateTime!
    subRequests: [SubRequest!]!
}

Dotazem můžete zjistit stav podle dílčího požadavku:

{
    requests {
        date
        subRequests {
            # discard the url, only need the status
            status
        }
    }
}

Výsledky by byly:

{
    "requests": [
        {
            "date": "2018-01-01",
            "subRequests": [{"status": 404}, {"status": 200}, {"status": 404}]
        },
        {
            "date": "2018-01-01",
            "subRequests": [{"status": 200}]
        }
    ]
}

Mapy

Mapy se chovají podobně jako pole, ale lze je seskupovat pomocí sum funkce. Používají se v agregovaných datových sadách, například httpRequest1dGroups.

Příklady map:

type URLStatsMapElem {
    url: String!
    requests: Int
    bytes: Int
}

type Request {
    date: Date!
    datetime: DateTime!
    urlStatsMap: [URLStatsMapElem!]!
}

Dotaz:

{
    requests {
        sum {
            urlStatsMap {
                url
                requests
                bytes
            }
        }
        dimensions {
            date
        }
    }
}

Odpověď:

{
    "requests": [
        {
            "sum": {
                "urlStatsMap": [
                    {
                        "url": "hello-world.org/1",
                        "requests": 123,
                        "bytes": 1024
                    },
                    {
                        "url": "hello-world.org/10",
                        "requests": 1230,
                        "bytes": 10240
                    }
                ]
            }
            "dimensions" {
                "date": "2018-10-19"
            }
        },
        ...
    ]
}

Příklady

Dotazování polí typu Array v syrových (raw) datasetech:

query NestedFields($zoneTag: string, $start: Time, $end: Time) {
	viewer {
		zones(filter: { zoneTag: $zoneTag }) {
			events(limit: 2, filter: { datetime_geq: $start, datetime_leq: $end }) {
				matches {
					ruleId
					action
					source
				}
			}
		}
	}
}

Příklad odpovědi:

{
  "data": {
    "viewer": {
      "zones": [
        {
          "events": [
            {
              "matches": [
                {
                  "action": "allow",
                  "ruleId": "rule-id-one",
                  "source": "asn"
                },
                {
                  "action": "block",
                  "ruleId": "rule-id-two",
                  "source": "asn"
                }
              ]
            }
          ]
        }
      ]
    }
  },
  "errors": null
}

Dotazování polí typu Map v agregovaných datasetech:

query MapCapacity(
	$zoneTag: string
	$dateStart: Date
	$dateEnd: Date
	$start: Time
	$end: Time
) {
	viewer {
		zones(filter: { zoneTag: $zoneTag }) {
			httpRequests1mGroups(
				limit: 10
				filter: {
					date_geq: $dateStart
					date_leq: $dateEnd
					datetime_geq: $start
					datetime_lt: $end
				}
			) {
				sum {
					countryMap {
						clientCountryName
						requests
						bytes
						threats
					}
				}
				dimensions {
					datetimeHour
				}
			}
		}
	}
}

Příklad odpovědi:

{
  "data": {
    "viewer": {
      "zones": [
        {
          "httpRequests1mGroups": [
            {
              "dimensions": {
                "datetime": "2019-03-08T17:00:00Z"
              },
              "sum": {
                "countryMap": [
                  {
                    "bytes": 51911317,
                    "clientCountryName": "XK",
                    "requests": 4492,
                    "threats": 0
                  },
                  {
                    "bytes": 1816103586,
                    "clientCountryName": "T1",
                    "requests": 132423,
                    "threats": 0
                  },
                  ...
                ]
              }
            }
          ]
        }
      ]
    }
  },
  "errors": null
}