GraphQL

**GraphQL** on päringukeel tagarakendite loomiseks, mille abil saavad rakendused andmeid pärida. 

GraphQL on loodud Facebooki poolt. Arendamist alustati aastal 2012 ja esmane versioon tuli välja aastal 2015. 2016. aasta oktoobris tuli välja esimene stabiilne versioon GraphQL-ist.
Facebooki idee oli luua uut tüüpi suhtlusviis andmebaasi ja kliendi vahel. GraphQL suurimaks eeliseks REST-i ees peetakse 
võimalust pärida serverilt kõik andmed ühe päringuga, REST-i puhul võib selleks vaja minna rohkem kui ühte päringut. 
Lühidalt öeldes kontrollib GraphQL-i kasutades päringu vastust klient, REST-il kontrollib päringu vastust server.
REST-i puhul vastab igale internetiaadressile kindlat tüüpi info, GraphQL seevastu aga kasutab kõikide andmete edastamiseks 
vaid ühte kindlat internetiaadressi.

GraphQL on mitmeplatvormiline päringukeel, mida on võimalik kasutada JavaScriptis, Rubys, Scalas ja paljudes muudes programmeerimiskeeltes.

__TOC__
## Päringud ja mutatsioonid

GraphQL toetab kahte tüüpi päringuid, tavalisi andmepäringuid ja mutatsioone. Tavalised andmepäringud tagastavad kliendile ainult andmeid, samas kui mutatsioonid on mõeldud andmebaasis muudatuste tegemiseks. GraphQL päringud on üsna sarnased JSON-tüüpi andmestruktuuri omadega. Päringus tuleb algselt kirjeldada, kas tegemist on päringu või mutatsiooniga. Päringu jaoks kasutame 
tähistust *query* ja mutatsiooni jaoks *mutation*. Mutatsiooni ja päringu puhul kasutatakse sama struktuuri.

Näide
Kui serveris on defineeritud andmetüüp muutujale *name*, siis vastav päring tagastaks sellele vastava väärtuse.
Päringu

```typescript
query isikuNimi{
	nimi
}
```


vaste näeks välja järgnev JSON-tüüpi objekt:

```typescript
{
	data{
		nimi: "henri"
	}
}
```


Samuti saab päringutele kaasa anda muutujaid:
```typescript
query päringKoosMuutujatega($isikukood: string) {
	isik(isikukood: $isikukood) {
		nimi
	}
}
```



Päring nimega päringKoosMuutujatega ootab, et talle antaks kaasa muutuja nimega isikukood, mis on string tüüpi. Päring 
oskab selle muutuja põhjal tagastada isiku, kelle isikukood on võrdne päringule kaasa antud isikukoodiga.

## Skeem

GraphQL toetab ka andmete struktuuri kirjeldust. Selle abil saab server kontrollida, et andmed oleks oodatud tüüpi. 
Lisaks on võimalik kirjeldada projektile eriomaseid andmetüüpe.

Baas-andmetüüpideks on Int, Float, String, Boolean ja ID. Int on 32-bitine number. Float on kahe komakoha täpsusega 
ujukomaarv. String on tekstitüüpi väärtus ja boolean on tõeväärtusega andmetüüp. ID väärtustab unikaalset väärtust,
mis on string tüüpi, aga ei ole inimesele loetaval kujul.

Andmetüüpe saab ka määrata Non-Null-iks, mis tähendab, et nende väärtus ei saa olla null tüüpi ja peab alati tagastama enda 
tüüpi väärtuse. Selle tähiseks on skeemis "!".

Massiive saab tähistada, kui lisada andmetüübile ümber kantsulud. Nt [Int] tähistab Int-tüüpi massiivi.

GraphQL toetab ka liideseid (ingl k *interface*), mille eesmärgiks on luua projektile eriomaseid andmetüüpe.
Nt. liidese abil saame ära kirjeldada isiku järgneval viisil:


```typescript
interface isik {
	isikukood: Int!
	eesNimi: String!
	keskmineNimi: String
	pereNimi: String!
	vanus: Int!
	lapsed: [isik]
}
```



Näitest on näha, et liidesel isik on eesNimi, pereNimi, mis on teksti tüüpi Non-Null väljad, lisaks isikukood ja vanus, 
mis on Int-tüüpi Non-Null väljad. Väli lapsed on massiiv isik-tüüpi objektidest, mis ei pea alati vastust tagastama. Samamoodi 
võib väli keskmineNimi tagastada tühja väärtuse.

## Vaata ka
*Struktuurpäringukeel

## Viited