Skip to content

Valemid

Valemid võimaldavad parameetril arvutada oma väärtuse automaatselt iga salvestamisega, tuginedes sama objekti andmetele, selle ülemobjektidele, alam-objektidele või sellele viitavatele objektidele.

Valemi kasutamiseks: sea parameetri definitsioonil lipp formula ja kirjuta avaldis valemi väärtusena. Arvutatud parameetreid ei saa käsitsi muuta ja need jäetakse objekti dubleerimisel vahele.

Valemid hinnatakse kahes etapis, nii et teistest valemiparameetritest sõltuvad parameetrid lahendatakse õigesti.

INFO

Kaheetapiline hindamine tähendab, et valem võib turvaliselt viidata teisele sama objekti arvutatud parameetrile. Esimene etapp lahendab lihtsad väljad; teine lahendab arvutatud parameetrite vahelised sõltuvused.

Süntaks

Valemid kasutavad Pöördpoola notatsiooni (Reverse Polish Notation, RPN, tuntud ka postfiksnotatsioonina): väärtused tulevad esimesena, operaator viimasena. Mootor liigub valemis vasakult paremale ühe väärtustepinuga. Iga teigend kas:

  • Lükkab väärtuse pinusse (literaal või väljaviide), või
  • Käivitab operaatori, mis võtab pinust väärtusi ja lükkab tulemuse tagasi.
first_name " " last_name CONCAT
│           │   │         └── võta kogu pinu, ühenda väärtused, lükka ühendatud string
│           │   └── lükka välja `last_name` väärtus
│           └── lükka stringiliteraal " "
└── lükka välja `first_name` väärtus

Keeles ei ole sulge ega kandilisi sulge. Komposeerumine toimub loomulikult pinul — iga operaator toodab ühe väärtuse, mille järgmine operaator tarbib.

Vaikimisi CONCAT

Kui valem ei lõpe tuntud operaatori võtmesõnaga, lisab mootor vaikimisi CONCAT ja ühendab kogu pinu stringina. See teeb lihtsad stringikompositsioonid lühikeseks:

first_name " " last_name                  → "John Doe"          (vaikimisi CONCAT)
first_name " " last_name CONCAT           → "John Doe"          (selgesõnaline, sama tulemus)
'Nr ' vr_nr '. ' otsuse_kp                → "Nr 12. 2026-01-01"

Operaatorite klassid

Iga operaator kuulub ühte järgmistest klassidest:

  • Muutuva arvuga reduktorid tarbivad kogu pinu ja lükkavad ühe tulemuse. Enamik koondoperaatoreid on reduktorid — CONCAT, SUM, MIN, IN jne.
  • Fikseeritud arvuga operaatorid võtavad pinust teadaoleva arvu pilusid. EQ võtab 2, ABS võtab 1, IF võtab 3 jne.
  • Väärtuste kaupa operaatorid (ABS, ROUND) võtavad ühe sisendpilu ja rakendavad operatsiooni iga selle väärtuse suhtes, lükkades tagasi sama pikkusega pilu.

Mitme väärtusega (loend) parameetrid

Entu parameetrid on mitme väärtusega: üks väljaviide võib lükata ühe pinupiluna N väärtusest koosneva loendi. Operaatorid käsitlevad loendeid nii:

  • Muutuva arvuga reduktorid lamendavad pilud üheks väärtusjadaks enne operatsiooni rakendamist. _child.*.price SUM on lihtsalt loendipilu redutseerimine — alusväärtused summeeritakse.
  • Väärtuste kaupa operaatorid rakenduvad iga väärtusele sisendpilus — _child.*.delta ABS tagastab absoluutsete deltade loendi, sama pikkusega kui sisend.
  • Binaarvõrdlused (EQ, GT, …) kasutavad ANY semantikat ristkorrutise üle: tõene, kui mõni vasak väärtus rahuldab operaatorit mõne parema väärtuse suhtes.

Väljaviited

Sama objekt

ViideLahendatakse
propertyNameSelle parameetri väärtus(ed) praegusel objektil
_idPraeguse objekti ID
'literal' või "literal"Stringiliteraal
123 / 45.67 / -2Arvliteraal
true / falseTõeväärtuse literaal

Viidatavad objektid

ViideLahendatakse
propertyName.*.propertyParameetri väärtus kõigist propertyName-i poolt viidatavatest objektidest
propertyName.type.propertyParameetri väärtus viidatavatest objektidest filtreerituna objektitüübi järgi
propertyName.*._idKõigi viidatavate objektide ID-d
propertyName.type._idTüübi järgi filtreeritud viidatavate objektide ID-d

Alam-objektid

ViideLahendatakse
_child.*.propertyNamepropertyName kõigist alam-objektidest
_child.typeName.propertyNamepropertyName konkreetset tüüpi alam-objektidest
_child.*._idKõigi alam-objektide ID-d
_child.typeName._idKonkreetset tüüpi alam-objektide ID-d

Viitajate objektid

Objektid, mis viitavad sellele objektile enda viiteparameetrite kaudu:

ViideLahendatakse
_referrer.*.propertyNamepropertyName kõigist objektidest, mis sellele objektile viitavad
_referrer.typeName.propertyNamepropertyName konkreetset tüüpi viitajatest
_referrer.*._idKõigi viitajate ID-d
_referrer.typeName._idKonkreetset tüüpi viitajate ID-d

Viitaja on objekt, mis osutab praegusele objektile kasutaja määratud reference-tüüpi parameetri kaudu. Süsteemsed viiteparameetrid (_parent, _owner, _editor, _viewer, _expander) ei lähe _referrer-i arvestusse.

INFO

typeName viiakse vastavusse viitaja objektitüübi name parameetriga (nt invoice), mitte kuvanimega label. Kui tüübi name ja label erinevad, kasuta name väärtust.

INFO

Erinevalt sama objekti valemitest sõltub _referrer valem teistest objektidest. Selle väärtus uueneb, kui viitav objekt luuakse, muudetakse, kustutatakse või selle viide muutub — Entu paneb seejärel sihtobjekti automaatsesse uuesti-koondamise järjekorda, et selle _referrer (ja _child) valemid ümber arvutada. Tulemus on lõppkokkuvõttes järjepidev: see ei pruugi uueneda samas päringus, mis viitavat objekti muutis.

Operaatorid

Muutuva arvuga reduktorid (tarbivad kogu pinu)

OperaatorTulemusMärkused
CONCATstringLamenda kõik pinu väärtused, teisenda stringiks, ühenda eraldajata.
CONCAT_WSstringLamenda kõik pinu väärtused; viimane väärtus on eraldaja; ülejäänud ühendatakse sellega.
SUMnumberRange arvutüüp — mitte-arv kuskil → väärtust pole.
SUBTRACTnumberVasakult paremale: esimesest lahutatakse ülejäänud. Range arvutüüp.
MULTIPLYnumberKõigi väärtuste korrutis. Range arvutüüp.
DIVIDEnumberEsimene jagatud ülejäänutega järjest. Range arvutüüp. Nulliga jagamine → väärtust pole.
COUNTnumberKõigi alusväärtuste arv. Tühi pinu → 0.
AVERAGEnumberAritmeetiline keskmine. Range arvutüüp.
MIN, MAXnumber või stringVõrdle < / > abil. Kõik väärtused peavad olema sama primitiivtüüpi (kõik arvud või kõik stringid — ISO 8601 kuupäevad võrdluvad õigesti stringidena).
IN, NINtõeväärtusEsimene pilu = otsitav, ülejäänud pilud = otsingulist. IN on tõene, kui mõni otsitav väärtus on rangelt võrdne mõne loendi väärtusega; NIN on eitus.

Binaarvõrdlused (tagastavad tõeväärtuse)

OperaatorKäitumine
EQ, NERange === / !== ristkorrutise üle.
GT, GTE, LT, LTEJärjestus ristkorrutise üle. Mõlemad pooled peavad olema arvud või mõlemad stringid — sobimatu tüübiga paarid jäetakse vahele.

Kõik kuus kasutavad ANY semantikat: tõene, kui mõni vasak väärtus rahuldab operaatorit mõne parema väärtuse suhtes.

Tingimuslik

OperaatorArvKäitumine
IF3Võtab else, then, cond. Tagastab then, kui cond on true, else, kui false.
WHEN2Võtab then, cond. Tagastab then, kui cond on true; muidu parameetrit ei kirjutata.

Mõlemad nõuavad, et cond lahendaks täpselt üheks tõeväärtuseks. Mõlemad harud arvutatakse enne tingimuse käivitamist (laisk hindamine puudub).

Väärtuste kaupa

OperaatorArvKäitumine
ABS1Iga arvu absoluutväärtus sisendpilus.
ROUND2Võtab decimals (üks arv) ja value. Ümardab iga arvu väärtusest decimals kümnendkohani.

Muud

OperaatorArvKäitumine
EXISTS1Tõene, kui sisendpilu laheneb vähemalt üheks väärtuseks.

Tühja sisendi käitumine

Enamik operaatoreid tagastab väärtuseta (parameetrit ei kirjutata), kui sisendid lahenevad tühjaks:

OperaatorTühi sisend
COUNT0
CONCAT, CONCAT_WS, SUM, SUBTRACT, MULTIPLY, DIVIDE, AVERAGE, MIN, MAXväärtust pole (parameetrit ei kirjutata)
ABS, ROUNDväärtust pole
IN, NINtühi otsitav või tühi otsingulist → vastavalt false / true
EQ, NE, GT, GTE, LT, LTEtühi pool → väärtust pole
EXISTStagastab alati tõeväärtuse
IF, WHENväärtust pole, kui cond on tühi või mitte üks tõeväärtus; WHEN tagastab väärtuseta, kui cond on false

Näited

Koondamine

Summa alam-objektide üleselt:

_child.*.price SUM

Konkreetset tüüpi alam-objektide loendamine:

_child.invoice._id COUNT

Keskmine hind:

_child.*.price AVERAGE

Varaseim tähtaeg:

_child.*.due_date MIN

Aritmeetika

Kasum:

income expenses SUBTRACT

Maksuga koguhind:

price tax SUM quantity MULTIPLY

Ümarda 2 kümnendkohani:

total quantity DIVIDE 2 ROUND

Absoluutne erinevus, ümardatud:

sum ABS invoice_sum ABS SUBTRACT 2 ROUND

Stringid

Täisnimi (vaikimisi CONCAT):

first_name " " last_name

Täisnimi selgesõnalise CONCAT_WS-iga:

first_name last_name " " CONCAT_WS

Kahekihiline ühendamine — esinejate loend ühendatakse ", "-ga, seejärel pealkirjale eelistatakse:

artist ", " CONCAT_WS title " - " CONCAT_WS

Tingimused

Silt hinnaläve järgi:

price 100 GT "expensive" "cheap" IF

Märgista ainult eelarve ületamisel (else puudub):

total budget GT "over budget" WHEN

Kuuluvuse kontroll sisemise loendiga:

status_code 10 20 30 IN "active" "inactive" IF

Märgi, kas kuupäev on määratud:

paid_date EXISTS "✓" "—" IF

Tähtaja ületamise kontroll kuupäeva järgi:

due_date "2026-01-01" LT "overdue" "ok" IF

Välista keelatud staatused (väli elementide loendina):

status banned_status.*.code NIN "ok" "blocked" IF

Komposeerumise reeglid

Kuna muutuva arvuga reduktorid tarbivad kogu pinu, võib valem praktiliselt sisaldada ainult ühte reduktorit enne fikseeritud arvuga operatsioone. Kui reduktor on käivitunud, asetub kõik järgnevalt lükatav selle tulemuse peale — ja järgmine reduktor neelab mõlemad.

Kui vajad kahe eraldiseisva reduktoritulemuse kombinatsiooni (nt loendus ja summa kokku stringiks renderdatud), jaga arvutus mitmeks valemiparameetriks: defineeri üks parameeter, mille valem toodab loenduse, teine parameeter summa jaoks, ja kolmas parameeter, mis viitab mõlemale. Kaheetapiline hindaja lahendab sõltuvuse.

Fikseeritud arvuga operaatoreid (EQ, GT, IN, IF, ROUND, ABS, …) saab vabalt aheldada.