← Analytics / analytics / graphql-api / features
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í:
- Některá pole obsahují skalární typy (například
[String]) a fungují jako běžná pole, která lze filtrovat - Některá pole obsahují složitější typy (například
[Subrequest].) Následující část popisuje jejich chování.
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
}