Finantstehnoloogia valdkonnas peame tihti töötlema ĂŒsna suuri valuutakursi andmehulkasid. Me saame andmeid erinevatest allikatest, ja igaĂŒhel neist on oma tĂ”lgendus, kuidas projitseerida kursse homme, ĂŒlehomme, jĂ€rgmisel kuul ja isegi jĂ€rgmistel kolmel aastal. Kui keegi oskaks kursse ennustada, oleks mĂ”istlik ettevĂ”te lĂ”petada ja lihtsalt raha edasi-tagasi vahetada. Ă”igestiMĂ”ned allikad on usaldusvÀÀrsemad, mĂ”ned pakuvad puhtalt prĂŒgi, haruldaste peaaegu Ă”igete vÀÀrtuste sissekannetega, kuid eksootiliste paaride jaoks. Meie töö on filtreerida need kĂŒmned tuhanded vÀÀrtused sekundis ning mÀÀrata, mida nĂ€idata klientidele. Peame filtreerima ainulaadse Ă”ige vÀÀrtuse tonni mustuse ja mudase seest, nagu flamingod lĂ”unasöögi ajal.

Flamingo eristav tunnus on suur allapoole kÔverdatud nokk, millega nad filtreerivad toitu veest vÔi mudast.
 âÂ
Nii sĂŒndis teekond , mis salvestab olekukĂ€igu mitme vÀÀrtuse jaoks mÀÀratud ajavahemikes. Selle all toimub halvimate ja aegunud andmete automaatne filtreerimine ning juurdepÀÀs viimastele N kontrollitud vÀÀrtustele iga vĂ”tme (valuutapaaride, meie juhul) jaoks.
Oletame, et kogume kursse kolmele valuutpaarile. Lihtsaim mÀÀratlus Vela aktiivsete seisundite salvestamiseks nÀeks vÀlja nii:
defmodule Pairs do
use Vela,
eurusd: [sorter: &Kernel. 0
endVÀÀrtuste vÀrskendamine
funktsioon teeb jÀrjestikku jÀrgmist:
- kutsub esile
validatorvĂ€ljaande vÀÀrtuse peale, kui see on mÀÀratud (vt peatĂŒkk Valideerimine allpool); - lisab vÀÀrtuse kas heade vÀÀrtuste rikka, kui validatsioon Ă”nnestus, vĂ”i teenindusliku rea
:__errors__vastasel juhul; - kutsub esile sortimise, kui
sorteron selle vĂ”tme jaoks mÀÀratud, vĂ”i lihtsalt paneb vÀÀrtuse nimekirja ette (LIFO, vt peatĂŒkk Sorteerimine allpool); - lĂ”ikab rida vastavalt parameetrile
:limitmis on loomisel edastatud; - tagastab vÀrskendatud struktuuri.
Vela.
iex|1 > pairs = %Pairs{}
iex|2 > Vela.put(pairs, :eurcad, 1.0)
#â %Pairs{..., eurcad: [1.0], ...}
iex|3 > Vela.put(pairs, :eurcad, -1.0)
#â %Pairs{__errors__: [eurcad: -1.0], ...}
iex|4 > pairs |> Vela.put(:eurusd, 2.0) |> Vela.put(:eurusd, 1.0)
#â %Pairs{... eurusd: [1.0, 2.0]}Samuti Vela rakendab , nii et vÀÀrtuste uuendamiseks vĂ”ib kasutada mĂ”nda tavalist struktuuride sĂŒgava uuendamise funktsioonidest : , , , , ja .
Valideerimine
Validaator vÔib olla mÀÀratletud kui:
- vĂ€lisfunktsioon ĂŒhe argumendiga (
&MyMod.my_fun/1), see saab ainult kontrollimise vÀÀrtuse; - vÀlisfunktsioon kahe argumendiga,
&MyMod.my_fun/2, see saab paariserie, valuekontrollimiseks; - moodul, mis rakendab ;
- konfigureerimisparameeter
threshold, ja - valikuliselt -compare_by, vt peatĂŒkk Comparison allpool.
Kui kontrollimine on edukas, lisatakse vÀÀrtus vastava vÔtme alla nimekirja, vastasel juhul saadetakse tuple {serie, value} aadressile :__errors_.
VÔrdlus
Nendes ridades salvestatavad vÀÀrtused vĂ”ivad olla mis tahes. Et Ă”petada Vela neid vĂ”rdlema, tuleb edastada compare_by parameeter rida mÀÀratlusse (kui vÀÀrtusi ei saa vĂ”rrelda tavalise Kernel.<\/2); see parameeter peab olema tĂŒĂŒbiga (Vela.value() -> number()). Vaikimisi on see lihtsalt & &1.
Samuti vÔib rida mÀÀratlusse edastada parameetri comparator delta vÀÀrtuste arvutamiseks (min/max); nÀiteks edastades Date.diff/2 komparatoorina, on vÔimalik saada korrektsed deltid kuupÀevade jaoks.
Teine mugav viis töötamiseks on parameetri edastamine threshold, mis mÀÀrab maksimaalse lubatava suhte uue vÀÀrtuse ja {min, max} vahemiku vahel. Kuna see on vĂ€ljendatud protsentides, ei kasuta kontroll comparator, kuid kasutab endiselt compare_by. NĂ€iteks, et mÀÀrata kĂŒnnis kuupĂ€eva vÀÀrtuste jaoks, tuleb mĂ€rkida compare_by: &DateTime.to_unix/1 (tĂ€isarvuline vÀÀrtus) ja threshold: 1, mille tulemuseks on, et uued vÀÀrtused on lubatud ainult siis, kui nad on ±band vahe ulatuses praegustest vÀÀrtustest.
LÔpuks saab kasutada Vela.equal?/2 compare/2 , et vÔrrelda kahte vahemÀlu. Kui vÀÀrtused mÀÀravad funktsiooni vÔi equal?/2compare/2 ==/2.
, siis neid funktsioone kasutatakse vÔrdlemiseks, vastasel juhul kasutame lihtsalt
VÀÀrtuste saamine Praeguse oleku töötlemine algab tavaliselt kÔnegaVela.purge/1 validator , mis eemaldab aegunud vÀÀrtused (kui seondubajatempleid). SeejÀrel saab kutsuda Vela.slice/1, mis tagastab mÀrksÔna ridade nimed vÔtmetena ja esimesed, kehtivad vÀÀrtused.
Samuti saab kasutada get_in/2/pop_in/2 madalama taseme juurdepÀÀsuks vÀÀrtustele igas reas.
Rakendus
Vela vĂ”ib osutuda ÀÀrmiselt kasulikuks ajasari vahemĂ€lu kui protsessi tĂŒĂŒp GenServer/Agent. Me ei taha kunagi kasutada aegunud kursi vÀÀrtusi ja selleks hoiame lihtsalt protsessi olekut, mida töödeldakse Vela, koos valideerijaga, mis on nĂ€idatud allpool.
@impl Vela.Validator
def valid?(_key, %Rate{} = rate),
do: Rate.age(rate) < @death_ageja Praeguse oleku töötlemine algab tavaliselt kĂ”nega rahulikult eemaldab kĂ”ik aegunud vÀÀrtused iga kord, kui vajame andmeid. Aktiivsete vÀÀrtuste juurde pÀÀsemiseks kutsume lihtsalt Vela.slice/1, ja kui vajame vĂ€ikest ajalugu kursist (kogu rida tervikuna), tagastame selle lihtsalt â juba sorteerituna â valideeritud vÀÀrtustega.
Edu ajavahemike vahemÀlu loomisel!
Allikas: habr.com
