Tekninen määrittely. ETL-työkalu. ExtraTerrestriaLs / Aureolis Oy



Samankaltaiset tiedostot
Tekninen määrittely. ETL-työkalu. ExtraTerrestriaLs / Aureolis Oy

ETL-DEMO. Esimerkki ETL-kuvauskielen käyttöstä

Kehitysohje. ETL-työkalu. ExtraTerrestriaLs / Aureolis Oy

Tekninen määrittely. ETL-työkalu. ExtraTerrestriaLs / Aureolis Oy

T Testitapaukset TC-1

T Testiraportti TR-2. ETL-työkalu

T Vaatimusmäärittelydokumentti. ETL-työkalu

Arkkitehtuurikuvaus. Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy. Ryhmä 14

T Testiraportti TR-3. ETL-työkalu

Ohjelmoinnin perusteet Y Python

T SEPA - päiväkirja: Design Patterns. ETL työkalu

Ylläpitodokumentti. Boa Open Access. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

Johdanto Javaan ja tietokantojen käsittelyyn Java Database Connectivity (JDBC)

Tiedonhallinnan perusteet. Viikko 1 Jukka Lähetkangas

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin jatkokurssi, kurssikoe

Written by Administrator Monday, 05 September :14 - Last Updated Thursday, 23 February :36

Ohjelmoinnin perusteet Y Python

17 BUDJETOINTI. Asiakaskohtainen Budjetti Ylläpito-ohjelma. Dafo Versio 10 BUDJETOINTI. Käyttöohje. BudgCust Yleistä

Haaga-Helia/IltaTiko ict2tcd005: Ohjelmiston suunnittelutaito 1/7 Anne Benson. Tällä opintojaksolla käytämme VS:n kolmen kokonaisuuden luomiseen:

SQL-perusteet, SELECT-, INSERT-, CREATE-lauseet

Ohjelmoinnin perusteet Y Python

Insert lauseella on kaksi muotoa: insert into taulu [(sarakenimet)] values (arvot)

Taulukot. Jukka Harju, Jukka Juslin

T SEPA - päiväkirja: Design Patterns. ETL työkalu

Ohjelmoinnin perusteet Y Python

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

SYÖTTÖPOHJA LUKUJEN SYÖTTÖÖN ERI TARKOITUKSIIN

RockID-varastonhallintajärjestelmän käyttöohje. v. 1.0

Jouni Huotari OLAP-ohjetekstit kopioitu Microsoftin ohjatun OLAP-kuution teko-ohjeesta. Esimerkin kuvaus ja OLAP-määritelmä

TIETOJEN TUONTI TIETOKANNASTA + PIVOT-TAULUKON JA OLAP-KUUTION TEKO

Kehitysohje. ETL-työkalu. ExtraTerrestriaLs / Aureolis Oy

TIEDONHALLINTA - SYKSY Luento 10. Hannu Markkanen /10/12 Helsinki Metropolia University of Applied Sciences

Käyttöohje. Ticket Inspector. Versio 1.0. Sportum Oy

Ohjelmoinnin perusteet Y Python

Digi-tv vastaanottimella toteutetut interaktiiviset sovellukset

Kansionäkymä listasta suuriin kuvakkeisiin

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

1. Uuden Ilmon käytön eroavaisuudet vanhasta Ilmosta lyhyesti

Visma Business AddOn Tositteiden tuonti. Käsikirja

Ohjelmoinnin perusteet Y Python

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

Opettajana Mika Sorsa, HAMK:n ammatillisen opettajakoulutuksen opetusharjoittelija

SELECT-lauseen perusmuoto

Ohjelmoinnin perusteet Y Python

Valppaan asennus- ja käyttöohje

XML prosessori. XML prosessointi. XML:n kirjoittaminen. Validoiva jäsennin. Tapahtumaohjattu käsittely. Tapahtumaohjattu käsittely.

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Harjoitus 5. Esimerkki ohjelman toiminnasta: Lausekielinen ohjelmointi I Kesä 2018 Avoin yliopisto 1 / 5

Asiointipalvelun ohje

Sokkelon sisältö säilötään linkitetyille listalle ja tekstitiedostoon. Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

KAAVAT. Sisällysluettelo

Luento 5. Timo Savola. 28. huhtikuuta 2006

Testidatan generointi

Järjestelmäarkkitehtuuri (TK081702) Hajautettu tietokanta. Hajautuksen hyötyjä

Harjoitus 5 (viikko 41)

Tik Tietojenkäsittelyopin ohjelmatyö Tietotekniikan osasto Teknillinen korkeakoulu KÄYTTÖOHJE. LiKe Liiketoiminnan kehityksen tukiprojekti

Rajapinta (interface)

Tietokanta.java Luokka tarjoaa välineet tietokannan lukemiseen. Haetuista tiedoista muodostetaan kurssi- ja opetus-olioita.

Webforum. Version 14.4 uudet ominaisuudet. Viimeisin päivitys:

FROM-lausekkeessa voidaan määritellä useampi kuin yksi taulu, josta tietoja haetaan: Tuloksena on taululistassa lueteltujen taulujen rivien

T Edistymisraportti. ExtraTerrestriaLs I1 iteraatio

Suvi Junes/Pauliina Munter Tietohallinto/Opetusteknologiapalvelut 2014

Sisältö. 2. Taulukot. Yleistä. Yleistä

Ohjelmoinnin perusteet, syksy 2006

Webforum. Version 15.1 uudet ominaisuudet. Päivitetty:

TIEDONHALLINTA - SYKSY Luento 11. Hannu Markkanen /10/12 Helsinki Metropolia University of Applied Sciences

Sisältö. 22. Taulukot. Yleistä. Yleistä

Excel pivot. Sisällys

Sähköposti ja uutisryhmät

Ohjelmoinnin perusteet Y Python

Vaatimusmäärittely Ohjelma-ajanvälitys komponentti

Ohjelmisto on selainpohjaisen käyttöliittymän tarjoava tietokantajärjestelmä merikotkien seurantaan WWF:n Merikotka-työryhmän tarpeisiin.

Ohjelmoinnin perusteet Y Python

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

TIETOKANTOJEN PERUSTEET MARKKU SUNI

Harjoituksen aiheena on tietokantapalvelimen asentaminen ja testaaminen. Asennetaan MySQL-tietokanta. Hieman linkkejä:

Helsingin yliopisto/tktl Kyselykielet, s 2006 Optimointi Harri Laine 1. Kyselyn optimointi. Kyselyn optimointi

811120P Diskreetit rakenteet

Olio-ohjelmointi Javalla

HAAGA-HELIA Heti-09 1 (12) ICT05 Tiedonhallinta ja Tietokannat O.Virkki Näkymät

Subversion-ohje. Linux Traffic Control-käyttöliittymä Ryhmä paketti2

CODEONLINE. Monni Oo- ja Java-harjoituksia. Version 1.0

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

Formaalit menetelmät: Kirjaston formalisointi Z-kuvauskielellä

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta Toteuta Pythonilla seuraava ohjelma:

Tietokannat II -kurssin harjoitustyö

HELIA 1 (17) Outi Virkki Tiedonhallinta

Tietokannan luominen:

Suunnitteluvaihe prosessissa

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Käyttöohje. Boa Open Access. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

I. Ristiintaulukointi Excelillä / Microsoft Office 2010

Liite 1: KualiKSB skenaariot ja PoC tulokset. 1. Palvelun kehittäjän näkökulma. KualiKSB. Sivu 1. Tilanne Vaatimus Ongelma jos vaatimus ei toteudu

Harjoitustyö 3 - Millosemeni

Excel-taulukkoon X- ja Y-sarakkeisiin tallennettujen koordinaattien muuntaminen paikkatietokohteiksi

Maksuturva-palvelun rajapintakuvaus verkkokaupalle / MAKSUN PERUUTUS

Transkriptio:

Tekninen määrittely ETL-työkalu ExtraTerrestriaLs / Aureolis Oy Versio Päivämäärä Tekijä Muutos 0.1 13.11.2004 Timo Sallinen Ensimmäinen versio 0.2 25.11.2004 Jani Honkanen ETL-moottori 0.3 26.11.2004 Teemu Nousiainen kieli 0.4 27.11.2004 Mikko Ruokojoki Rakenteellisia muokkauksia dokumenttiin. 0.5 27.11.2004 Jani Honkanen Arkkitehtuuri 0.6 28.11.2004 Jani Malmi Toimenpiteiden yleiskuvausta 0.7 28.11.2004 Jani Honkanen Katselmoinnissa sovittuja korjauksia 0.8 28.11.2004 Teemu Nousiainen kielen esimerkki liitteisiin. 0.9 28.11.2004 Timo Sallinen Lisätty dokumentaatiogeneraattori, korjauksia 1.0 29.11.2004 Mikko Ruokojoki Pieniä korjauksia tehty 1,1 29.11.2004 Teemu Nousiainen [ETL-29] 1.2 29.11.2004 Mika Suvanto Kpl 3.1.5 lisätty ja siistitty kuvia Sivu 1 / 20

Sisällysluettelo Tekninen määrittely...1 1 Johdanto...3 1.1 Dokumentin tarkoitus...3 1.2 Sovelluksen yleiskuvaus... 3 1.3 Sanasto... 3 2 Arkkitehtuuri...3 2.1 Johdanto... 3 2.2 Suunnitteluperiaatteet...5 2.3 Toimenpiteet... 5 2.3.1 Toimenpiteiden parametrointi... 5 2.3.2 Toimenpiteiden käyttämä tietokantaluokka... 5 2.4 Java-pakettien nimeäminen...5 3 Moduulit... 5 3.1 kieli... 5 3.1.1 Rakenne...6 3.1.2 Prosessikuvaus...6 3.1.3 Konfiguraatio...6 3.1.4 Projektimäärittely... 6 3.1.5 Parseri ja lataaja...6 3.2 ETL-moottori... 7 3.2.1 Yleiskuvaus... 7 3.2.2 ETL-toimenpiteistä koostuvan prosessin esitysmuoto olioina... 7 3.2.3 Toimenpiteiden ajaminen ja ajojärjestyksen suunnittelu... 8 3.2.4 Rajapinta moottorin ja Javalla ohjelmoitujen toimenpidekomponenttien välillä...9 3.2.5 ETL-prosessin aikana tapahtuvien virheiden hallinta... 10 3.2.6 Tietovaraston hallinta, lookup-toiminnot, Slowly Changing Dimensions... 10 3.2.7 Tietokantojen ja väliaikaisvarastojen hallinta... 10 3.2.8 Rajapinta prosessikuvauksen lataamiseen...12 3.2.9 Rajapinta prosessin suorittamiseen ja konfiguroimiseen... 12 3.2.10 Dokumentaatiogeneraattorin tarvitsemien tietojen kerääminen ETL-prosessista... 12 3.3 Toimenpiteet... 12 3.3.1 Yleiskuvaus... 12 3.3.2 Uusien toimenpiteiden ohjelmoiminen... 13 3.3.3 Copy... 14 3.3.4 Insert...14 3.3.5 Pivot... 15 3.3.6 Muita toimenpidekomponentteja...16 3.4 Dokumentaatiogeneraattori... 17 3.4.1 Yleiskuvaus... 17 3.4.2 Lähtöaineiston kerääminen...17 3.4.3 Aineiston käsittely...17 3.4.4 Dokumentin tuottaminen...17 4 Viitteet... 18 5 Liitteet...19 5.1 Esimerkki kuvauskielestä...19 Sivu 2 / 20

1 Johdanto 1.1 Dokumentin tarkoitus Dokumentti määrittelee teknisen toteutuksen ETL-työkalulle, riittävällä tarkkuudella implementoinnin mahdollistamiseksi. Sovelluskomponenttien väliset rajapinnat kuvataan UMLluokkakaavioilla. Kohderyhmänä ovat projektiryhmä, asiakas ja tulevat sovelluskehittäjät. Järjestelmää suunnitellaan jonkin verran pidemmälle kuin on tarkoitus tämän projektin aikana toteuttaa. Tarkempi kuvaus tämän projektin aikana toteutettavista toiminnoista löytyy vaatimusmäärittelystä ja projektisuunnitelmasta. Lukijalla oletetaan olevan hyvät yleistiedot ETL-prosesseista ja tietovarastoinnista. 1.2 Sovelluksen yleiskuvaus Sovelluksen tarkka yleiskuvaus löytyy vaatimusmäärittelystä [1]. 1.3 Sanasto Sanasto löytyy vaatimusmäärittelystä [1]. 2 Arkkitehtuuri 2.1 Johdanto ETL-työkalu koostuu seuraavista komponenteista: kieli, jolla suunnitellaan ETL-prosessi ETL-moottori, joka koordinoi prosessin suoritusta ETL-toimenpiteet, joita käytetään työkaluina ETL-prosessissa Dokumentaatiogeneraattori, jolla tuotetaan rakennekuvaus suunnitellusta ETL-prosessista Lisäksi lähdedatan lukeminen ja tietovaraston hallinta kuuluvat järjestelmään, mutta ETLtyökaluissa ne mielletään yleensä mieluummin osaksi samaa kokonaisuutta kuin erillisiksi komponenteiksi, riippuvuuksien takia. Tuotantokäytössä ETL-työkalu pyörii loppuasiakkaan koneella Java-prosessina, joka suorittaa ETLprosessin määrätyllä tavalla ja määrättyinä aikoina. Työkalu lukee asiakkaan tietojärjestelmiä, pääasiassa operatiivisia tietokantoja ja tiedostoja, sekä tuottaa prosessin tuloksen tietovarastoon. Kaikki prosessointi tapahtuu tavallisesti loppuasiakkaan tietokoneilla, käyttäen useampia tietokantoja ja mahdollisesti joitakin ulkoisia järjestelmiä (lähdedatan lukemiseen). Kunkin komponentin arkkitehtuuri on kuvattu tässä dokumentissa omassa luvussaan. Sivu 3 / 20

Kuva 1: Deployment-kaavio tuotannossa olevasta ETL-työkalusta Sivu 4 / 20

2.2 Suunnitteluperiaatteet Seuraavia yleisiä ohjenuoria pyritään noudattamaan koko suunnittelun ajan: Moduulijako pitää olla erittäin selkeä (tarkasti määritellyt rajapinnat), koska suunnittelussa on mukana monta ihmistä ja lisäksi kommunikointimahdollisuudet ovat heikot. Pitää keskittyä erityisen tarkasti järjestelmän runko-osiin, koska jatkokehitystä on tarkoitus tehdä paljon, myös räätälöidysti eri asiakkaille. Varotaan tekemästä työkalusta liian yleiskäyttöistä, koska markkinoilla on jo isojen firmojen suurella budjetilla tekemiä yleiskäyttöisiä ETL-työkaluja. Tehdään kevyt ( light-weight ) suunnittelutyökalu ja suunnataan se ainoastaan ohjelmointitaitoisten ihmisten käyttöön. 2.3 Toimenpiteet ETL-työkalu käyttää toimenpiteitä suorittamaan kannan transaktioita. Toimenpiteet muodostavat prosessin, jota ETL-moottori ohjaa. ETL-moottorin ja toimenpiteiden välillä käytetään rajapintaa, jossa välitetään tietoa mm. kannoista ja lähde ja kohdetauluista. Toimenpiteiden tarkemmat kuvaukset löytyvät tämän dokumentin kohdasta moduulit, kappale 3. 2.3.1 Toimenpiteiden parametrointi Toimenpiteiden parametrointi on kuvattu moduulien kappaleessa. 2.3.2 Toimenpiteiden käyttämä tietokantaluokka Toimenpiteet käyttävät tietokantaluokkaa, jonka kautta hoidetaan tietokantaan liittyvät toiminnot kuten tietokannan avaaminen ja sql-lauseiden ajaminen. 2.4 Java-pakettien nimeäminen Kaikki luokat ja paketit laitetaan com.aureolis.etltool-nimiavaruuden alle. Tämän alle luodaan funktionaalisesti jaettuja alipaketteja, joihin toiminnalliset luokat ja rajapinnat sijoitetaan. com.aureolis.eltool.database -tietokantojen käsittely com.aureolis.etltool.engine -etl-moottori com.aureolis.etltool.operation -toimenpiteet (operaatiot) com.aureolis.etltool.transfer -datan siirtäminen toimenpiteiden välillä com.aureolis.etltool.processlanguage -etl-prosessin kuvauskieli com.aureolis.etltool.documentation -dokumentaatiogeneraattorin pääpaketti 3 Moduulit 3.1 kieli kieli kuvaa ETL-prosessin, lähdeaineistot, kohdekannat ja toimenpiteet. kielen toteutustavaksi valittiin projektin puitteista luotava XML-kieli. Syitä valintaan olivat: Helppo muokattavuus sekä käsin (valmiit editorit), että koneellisesti Sivu 5 / 20

Voidaan käyttää olemassa olevia parseritoteutuksia (helppo validointi ja jäsennys) Helppo dokumentoinnin generointi kieli on määritelty XML-Scheman avulla, joka toimii lopullisena tarkkana kieliopillisena spesifikaationa. Tämän kappaleen tarkoitus on kielen esitteleminen yleisellä tasolla. Esimerkki kuvauskielestä löytyy liitteistä. 3.1.1 Rakenne kieli jakautuu kolmeen osaan, moottorin konfiguraatioon, projektimäärittelyyn ja itse prosessin kuvaamiseen. Yhdessä tiedostossa ei tarvitse määritellä kaikkia näitä, vaan ne voidaan jakaa ylläpidollisesti loogisiksi kokonaisuuksiksi eri tiedostoihin. 3.1.2 Prosessikuvaus Prosessikuvaus rakentuu joukosta toimenpiteitä, jotka käyttävät toistensa tuloksia syötteinään. On myös määritelty erikseen toimenpiteet, jotka hakevat dataolioita (tauluja) työskentelytilaan ja niitä, jotka vievät prosessin tuotteet tietovarastoon. Jokaisella prosessilla on oma id:nsä (yksilöivä nimi). Yksi prosessi käyttää aina yhtä työskentelytietokantaa. Toimenpiteiden lisäksi prosessista voidaan kutsua aliprosesseja määritetyillä parametreilla. Aliprosessille voidaan määrittää oma työskentelytietokanta. Usein käytetyistä aliprosesseista voidaan täten laatia yleiskäyttöisiä kirjastoja. 3.1.3 Konfiguraatio Konfiguraatiossa määritellään käytettävät tietokannat ja prosessien ajastus. Jokaiselle käytettävälle tietokannalle määritellään yhteysasetusten (sis. URL, käyttäjätunnus, tyyppi ja salasana) lisäksi id, johon prosessikuvauksen toimenpiteet viittaavat. Ajastus toteutetaan UNIXin crontab:in tyyppisesti, eli prosessin käynnistämisajankohta määritellään viikonpäivien, kuukausien, päivien jne. perusteella. Jokainen ajastuselementti viittaa käynnistettävän prosessin nimeen. 3.1.4 Projektimäärittely Projektimäärittelyä käytetään koko ETL-moottorin konfiguroimiseen. Se sisältää viittaukset konfiguraatiotiedostoon ja prosessikuvaustiedostoihin. 3.1.5 Parseri ja lataaja XML-kielisen kuvaustiedoston parsimiseen voidaan käyttää valmiita parsereita. Parseriksi on valittu Apache- projektin Xerces, josta käytetään DOM- parsimista. Xerces on varsin monipuolinen ja yleisesti käytetty parseri, joka on vapaasti saatavilla. Näiden seikkojen takia päädyimme siihen. DOM -parsiminen valittiin sen monipuolisuuden vuoksi verrattuna SAX:iin, myöskään luettavat tiedostot eivät todennäköisesti ole kovin suuria, joten muistinkulutus ei ole ongelma. Parserin vaihtaminen myöhemmin vaatii todennäköisesti lataajakomponentin uudelleenkirjoittamista, mikäli uusi parseri ei ole API -yhteensopiva Xercesin kanssa, mutta ei vaikuta muihin ohjelman osiin. Lataaja käyttää parserilta saamaansa DOM-puuta prosessin ja konfiguraation rakentamiseen. Tämä tapahtuu mm. prosessin osalta kutsumalla ProcessBuilder -luokan metodeita prosessien lisäämiseksi. Lataajan tehtävänä on myös tehdä prosessin loogista tarkistusta varmistamalla että määrittelyt ovat mahdollisia ja määriteltyjä. Tässä tukeudutaan vahvasti kutsuttavien luokkien toteutukseen. Esimerkkinä prosessin työtietokannan viittaus lataajan tehtävänä on tarkistaa, että annettu tietokanta on määritelty konfiguraatiotiedostossa ja jos näin ei ole, antaa virheilmoitus ja Sivu 6 / 20

keskeyttää lataaminen ja prosessin rakennus. 3.2 ETL-moottori 3.2.1 Yleiskuvaus ETL-moottorin päätehtävänä on suorittaa annettu ETL-prosessi ja tuottaa prosessin lopputulos tietovarastoon. Oleellisia osia moottorissa ovat: ETL-toimenpiteistä koostuvan prosessin esitysmuoto olioina Toimenpiteiden ajaminen ja ajojärjestyksen suunnittelu Rajapinta moottorin ja Javalla ohjelmoitujen toimenpidekomponenttien välillä ETL-prosessin aikana tapahtuvien virheiden hallinta Tietovaraston hallinta, lookup-toiminnot, Slowly Changing Dimensions Tietokantojen ja väliaikaisvarastojen hallinta Rajapinta prosessikuvauksen lataamiseen Rajapinta prosessin suorittamiseen ja konfiguroimiseen Dokumentaatiogeneraattorin tarvitsemien tietojen kerääminen ETL-prosessista 3.2.2 ETL-toimenpiteistä koostuvan prosessin esitysmuoto olioina Prosessi kuvataan moottorin sisällä verkkona, jossa solmut vastaavat toimenpiteitä ja solmut on kytketty toisiinsa sen mukaan, minkä toimenpiteiden tuloksia kukin toimenpide käyttää syötteenään. Prosessin ajon aikana OperationNode-luokka vastaa yhtä tällaista solmua ja sisältää viittauksen EtlOperation-olioon, jossa on varsinainen toimenpiteen toteutus. OperationNode-oliossa on lista edeltävistä ja seuraavista solmuista, sekä InputArguments-rakenne, johon kerätään syötetaulut sitä mukaa kun edeltäviä toimenpiteitä saadaan suoritettua. Solmulla on myös nimi, mutta sitä ei käytetä solmun tunnistamiseen vaan ainoastaan debug-viesteissä ja väliaikaistauluja luotaessa. Lisäksi nimi voi olla null. Prosessin voi suorittaa vain kerran, minkä jälkeen se on ladattava kuvaustiedostosta uudestaan (mm. OperationNode ja EtlOperation -oliot ovat kertakäyttöisiä). Mutta jos nähdään tulevaisuudessa tarvetta suorittaa prosessi useampaan kertaan ilman latausta, voidaan toteuttaa toinen vastaavanlainen toimenpidegraafi, jossa jokainen solmu sisältää EtlOperationFactory-olion. Sivu 7 / 20

Kuva 2: Prosessin rakenteen kuvaamiseen liittyvät luokat (moottorin sisäinen esitystapa) 3.2.3 Toimenpiteiden ajaminen ja ajojärjestyksen suunnittelu ProcessRun-olio vastaa yhtä prosessin suorituskertaa ja sisältää ajojärjestyksen koordinointiin liittyvän koodin. ProcessRun aloittaa prosessin käynnistämällä joukon sellaisia toimenpiteitä, jotka eivät käytä syötteenä mitään toista toimenpidettä (yleensä nämä ovat asiakkaan lähdedataa lukevia toimenpiteitä). Toimenpiteen suoritusta varten luodaan OperationExecutor-olio, joka käynnistää toimenpiteen erillisessä säikeessä ja ilmoittaa lopulta tuloksen ProcessRun:lle. Kukin toimenpide voidaan suorittaa aikaisintaan silloin, kun kaikki sen syötteenä käyttämät toimenpiteet on saatu suoritettua. Ajojärjestyksen suunnittelu ja aikataulutus voidaan eriyttää myöhemmin toiseen luokkaan, jos tarvetta ilmenee. ProcessRun ei tee erityistä aikataulutusta tai toimenpiteiden priorisointia, mutta on suunniteltu siten, että näitä ominaisuuksia voidaan myöhemmin lisätä. Sivu 8 / 20

3.2.4 Rajapinta moottorin ja Javalla ohjelmoitujen toimenpidekomponenttien välillä Kun moottori päättää suorittaa toimenpiteen, se kutsuu ko. toimenpiteen run()-metodia. Argumentteina annetaan syötetaulut ja paluuarvona saadaan tulostaulut sekä tietoja tapahtuneista virheistä. EngineServices-luokka sisältää moottorin tarjoamia palveluita, joilla toimenpidekomponentti pääsee käsiksi työtietokantoihin sekä muihin tarpeellisiin moduuleihin. Moduulit ovat nimettyjä olioita, jotka luodaan konfiguraatiotiedoston perusteella ja jotka auttavat toimenpidekomponentteja prosessin suorittamisessa. Moduuleihin voi kuulua esim. tietojen lukemista tietovarastossa olevista lookup-tauluista tai jostain ulkoisesta järjestelmästä. Kuva 3: Rajapinta moottorin ja toimenpidekomponenttien välillä Sivu 9 / 20

InputArguments ja OperationResult sisältävät yhden tai useamman viittauksen tietokantatauluihin, jotka toimivat toimenpiteen syötteenä/tuloksena. Näiden rakenteesta kerrotaan tarkemmin kohdassa 3.2.7. Tämä rajapinta on tarkoitus pitää sellaisena, että toimenpidekomponenteissa mahdollisesti olevat ohjelmointivirheet haittaisivat mahdollisimman vähän järjestelmän toimintaa. Tämä siksi, että toimenpidekomponentteja voi lopullisessa työkalussa olla paljon (kymmeniä) ja uusia toimenpiteitä on lisäksi tarkoitus ohjelmoida räätälöidysti asiakasprojekteissa. 3.2.5 ETL-prosessin aikana tapahtuvien virheiden hallinta Yleisesti ETL-prosessin pitää pystyä jatkumaan lähdedatassa olevista virheistä huolimatta. Lähdedatassa olevia virheitä pyritään suodattamaan erityisillä puhdistustoimenpiteillä (projektikohtaisesti). Lisäksi toimenpidekomponentit saattavat tuottaa virheitä, jos toimenpidettä ei pystytä ajamaan johtuen lähdetauluissa tai niiden riveissä olevista virheistä. Toimenpidekomponenteille tarjotaan mahdollisuus kirjata tällaisia virheitä virhelokiin, joka on käytännössä tietovarastossa sijaitseva taulu. Lisäksi toimenpide voi tuottaa virhetaulun aivan samaan tapaan kuin tavallisen tulostaulun, ja tätä virhetaulua voidaan edelleen käsitellä ETLprosessissa. Toimenpidekomponentti palauttaa tuloksen mukana tietoja tapahtuneista virheistä ja niiden vakavuudesta, minkä perusteella moottori päättää, voidaanko prosessia jatkaa. On myös mahdollista, että tietokantayhteys katkeaa tai sattuu joku muu tilapäinen häiriö. Häiriötilanteisiin varaudutaan tallentamalla prosessin välituloksia sopivin väliajoin (määritelty käsin prosessikuvauksessa) ja mahdollistamalla prosessin käynnistys jostain välituloksesta alkaen. Pelkkästä tietokantayhteyden katkeamisesta pyritään toipumaan yrittämällä yhteydenmuodostusta uudellen. Välituloksella tarkoitetaan sellaista taulujoukkoa, joka sisältää kaikki seuraavaksi ajettavien toimenpiteiden tarvitsemat syötetaulut. Moottori varautuu lisäksi joihinkin toimenpidekomponenteissa oleviin ohjelmointivirheisiin: Toimenpiteen edistymistä tarkkaillaan getprogress-metodilla. Näin huomataan, onko toimenpide jäänyt jumiin. Väliaikaisten tietokantataulujen poistaminen hoidetaan keskitetysti, jotta ne eivät jää kantaan roikkumaan prosessiajon jälkeen. 3.2.6 Tietovaraston hallinta, lookup-toiminnot, Slowly Changing Dimensions Tietovaraston käsittelyä ei ole tarkasti suunniteltu, mutta varastoon kirjoittaminen tulee tapahtumaan etupäässä siihen tarkoitetuilla toimenpidekomponenteilla (rivien / taulujen lisääminen ja päivittäminen varastoon). Tietovarastossa olevan (vanhan) tiedon lukeminen prosessin aikana toteutetaan luultavasti myös toimenpidekomponenteilla ja/tai Javalla tehdyllä moduuleilla, joita voidaan kutsua mistä tahansa kohdasta ETL-prosessia. 3.2.7 Tietokantojen ja väliaikaisvarastojen hallinta ETL-prosessin aikana käytetään välitulosten tallentamiseen väliaikaisia tietokantatauluja, jotka luodaan tarvittaessa ja tuhotaan prosessin päättymisen jälkeen. Moottori tarjoaa toimenpidekomponenteille seuraavia väliaikaistauluihin liittyviä palveluita: Sivu 10 / 20

Halutunmuotoisten taulujen luonti Taulujen nimien valitseminen (törmäysten estämiseksi) Toimenpiteen tulostaulujen automaattinen droppaaminen sitten, kun niitä ei enää käytetä Toimenpiteen sisäisten väliaikaistaulujen droppaaminen heti toimenpiteen päätyttyä Valmiita toimintoja taulujen kopiointiin, tuomiseen toisesta tietokannasta jne. Taulujen lukuoikeuksien hallinta ja taulujen monistaminen (jos samaa taulua käyttää syötteenä useampi toimenpide, joista osa haluaa tehdä muutoksia suoraan ko. tauluun) Moottorin väliaikaistaulujen hallinnointiin tarkoitetut WorkingDatabaseManager, WorkingDatabase ja WorkingTable käyttävät hyväkseen yleisempiä DatabaseManager ja Database -luokkia. SqlTableolio taas on pelkkä viittaus jossakin kannassa olevaan tauluun, eikä Database-luokka pidä erikseen kirjaa ko. tietokannassa olevista tauluista. Yhtä fyysistä taulua kohti voi siis olla olemassa useampia SqlTable-olioita. Toimenpidekomponentin ei ole tarkoitus käsitellä Working-luokkia suoraan missään tilanteessa, vaan niitä käytetään moottorissa sisäisesti. Toimenpidekomponentti käyttää EngineServicesluokassa olevia palvelumetodeja. Kuva 4: Työtietokantojen hallintaan liittyvät luokat Tietokannassa olevaan tauluun viitataan SqlTable-luokalla, joka sisältää taulun nimen ja tietokannan lisäksi kuvauksen taulun muodosta (SqlTableFormat) sekä loogisen taulunimen, jota käytetään debug-viesteissä ja muissa vastaavissa tarkoituksissa (ei kuitenkaan taulun tunnistavana nimenä). SqlTableFormat sisältää luettelon taulun sarakkeiden nimistä ja tyypeistä, listan primary key Sivu 11 / 20

-sarakkeista ja joukon indeksejä. 3.2.8 Rajapinta prosessikuvauksen lataamiseen Tarkoituksena on eriyttää moottori kuvauskielitiedoston lataajasta, jotta kuvauskieli ja sen esitysmuodon yksityiskohdat voivat vaihdella ilman että moottoria tarvitsee muuttaa. kielen lataajakomponentti syöttää prosessin moottorille ProcessBuilder-olion kautta, joka sisältää metodit mm. toimenpidekomponenttien lisäämiseen ja niiden linkittämiseen. Lisäksi lataajakomponentin tehtävä on luoda EtlOperationFactory-oliot ja antaa niille konfiguraatioparametrit. kielessä määritellyn prosessin ei tarvitse vastata rakenteeltaan kovin tarkasti moottorin sisäisesti käyttämää muotoa, vaan kuvauskielen lataajakomponentti voi esimerkiksi lisätä joitakin toimenpiteitä ilman, että prosessin suunnittelija on niitä erikseen kuvauksessa maininnut. Tällaisia toimenpiteitä voivat olla esimerkiksi taulujen automaattinen kopiointi työkantojen välillä tai indeksien poistaminen tilapäisesti raskaan lisäysoperaation ajaksi. 3.2.9 Rajapinta prosessin suorittamiseen ja konfiguroimiseen Prosessin ajamiseen liittyvät toiminnot löytyvät pääasiassa ProcessRun-luokasta ja konfiguroimiseen liittyvät toiminnot tämän lisäksi ProcessBuilder-luokasta. Prosessien ajastettuun ajoon ja konfiguraatioon liittyvät suunnitelmat löytyvät kuvauskielen schema:sta. 3.2.10 Dokumentaatiogeneraattorin tarvitsemien tietojen kerääminen ETLprosessista Moottoriin tullaan toteuttamaan mm. seuraavien tietojen kerääminen prosessista: Toimenpideverkon rakenne Toimenpiteiden nimet, tyypit ja kuvaukset Kunkin toimenpiteen syöte/tulostaulujen rakenne (kaikissa tapauksissa rakennetta ei voi ennustaa tarkasti ennen prosessin ajoa, koska se riippuu lähdedatasta) Käytetyt väliaikaistietokannat Ei ole tässä vaiheessa määritelty, jääkö näiden tietojen kerääminen moottorin vai kuvauskieliparserin tehtäväksi. Moottoria tähän voidaan tarvita esimerkiksi silloin, jos halutaan kuvaukset tulostaulujen rakenteesta ja sisällöstä jollakin annetulla esimerkkilähdedatalla. 3.3 Toimenpiteet 3.3.1 Yleiskuvaus Toimenpiteet ovat yhtenäisen rajapinnan toteuttavia Java-komponentteja, jotka suorittavat datan käsittelyyn liittyviä tehtäviä ( transformations ). Toteutettavia perustoimenpiteitä ovat: Copy Insert / append Sivu 12 / 20

Update Aggregate (sum, count, min, max, average ja näitä käyttävät lausekkeet) Rajaus (where) Lookup (tietovarastotauluista lukeminen. Useita toimenpiteitä? SCD?) Sarakkeiden tyyppien ja sarakeleveyksien muunnos, taulun ja sarakkeiden muodon tarkistus Join (left / right / full) Pivot / unpivot (samankaltaisten sarakkeiden yhdistäminen) Distinct (duplikaattien poisto) Merge (samankaltaisten rivien yhdistäminen, liittyy datan puhdistukseen) Union, intersection, difference (joukko-opillisen operaatiot) Indeksien luominen / poistaminen Jokainen Javalla tehty toimenpidekomponentti toteuttaa EtlOperationFactory-luokan, jolle välitetään prosessin latausvaiheessa sellaiset parametrit, jotka pysyvät vakiona prosessin suorituskertojen yli. Joka kerta kun prosessi ajetaan, moottori luo factory-luokkien create()-metodia kutsumalla jokaisesta toimenpidekomponentista EtlOperation-rajapintaa toteuttavan olion, jonka tehtävä on suorittaa toimenpide juuri kyseisen prosessiajon aikana. Kun toimenpide on määrä suorittaa, moottori antaa sille joukon viittauksia edeltävien toimenpiteiden tuottamiin tauluihin (usein vain yhden taulun) InputArguments-luokassa. Toimenpidekomponentti voi kutsua moottorin palveluja luodakseen omaan käyttöön väliaikaisia tauluja sekä joukon tulostauluja, joihin se kirjoittaa lopullisen tuloksensa. Toimenpidekomponentin ei yleensä tarvitse murehtia taulujen nimien valinnoista (törmäysten välttämisestä) tai väliaikaisten taulujen poistamisesta. Toimenpidekomponentti palauttaa tuloksensa OperationResult-oliossa, joka sisältää tulostaulujen kuvauksen lisäksi tietoa toimenpiteen aikana tapahtuneista virheistä. Lähdedatassa olevat virheet tulee toimenpiteiden yleensä tunnistaa ja tuottaa niistä virheilmoitukset moottorin virheidenhallintajärjestelmää varten. Tietokantayhteyksien katketessa tai konfiguraatiovirheen sattuessa taas toimenpidekomponentti heittää poikkeuksen, minkä jälkeen moottori saattaa yrittää (osa)prosessin suoritusta uudelleen. Alla on kuvaukset suunnitelluista toimenpidekomponenteista ja niiden ominaisuuksista. 3.3.2 Uusien toimenpiteiden ohjelmoiminen Toimenpidekomponentteja luodaan sekä tämän projektin aikana että räätälöidysti eri asiakkaita varten. Toimenpidekomponentin luominen tehdään seuraavasti: Suunnittele komponentti (parametrit, syötteet, tulokset, toiminta, virhetilanteet jne.) ja kirjoita siitä samanlainen kuvaus kuin allaolevissa toimenpidekomponenttien kuvauksissa. Suunnittele samalla, miten toimenpidekomponentti kuvataan kuvauskielessä. Räätälöityjä komponentteja varten ei yleensä kannata tehdä muutoksia kuvauskieleen. Tee komponentille Java-pakkaus. Jos kyseessä on työkaluun liitettävä yleiskäyttöinen komponentti, pakkaus tulee luoda com.aureolis.etltool.operation-pakkauksen alle. Jos kyseessä on asiakasprojektiin tehty räätälöity komponentti, voidaan käyttää jotain projektikohtaista Sivu 13 / 20

pakkausnimeä (tai laittaa samaan pakkaukseen muiden toimenpiteiden kanssa). Tee EtlOperationFactory:n toteuttava luokka. Tähän luokkaan ei yleensä pidä laittaa mitään muuttuvia attribuutteja, vaan ainoastaan konfiguraatiotietoa, joka pysyy vakiona olion olemassaolon ajan. Samaa EtlOperationFactory-oliota voidaan käyttää useiden prosessiajojen ajan. Tee EtlOperation:n toteuttava luokka, jonka instanssin EtlOperationFactory.create()-metodi luo. Tätä EtlOperation:n toteuttamaa oliota käytetään vain yhden prosessiajon ajan ja sen jälkeen se hylätään, eikä moottori käytä samaa oliota enää seuraavassa prosessiajossa (vaan luo uuden create()-metodilla). Luokan toteutuksessa kannattaa ottaa mallia olemassaolevista toimenpidekomponenteista ja hyödyntää moottorin palveluita mahdollisimman tehokkaasti. Jos kyseessä on ETL-työkaluun kuuluva yleiskäyttöinen toimenpidekomponentti, tee tarvittavat muutokset kuvauskieleen (schema) ja lataajakomponenttiin. 3.3.3 Copy Parametrit Syötteet Tulos Mitä tietokantatyyppejä tuetaan? Voidaanko ajaa suoraan tietokannan sisällä? Muokkaako suoraan syötetauluja? Osaako käsitellä useita tietokantoja ilman raskasta kopiointia? Tulostaulujen avaimet ja indeksit Virhetilanteet - Tekee kopion lähdetaulusta/tauluista. String targetdatabase: tietokanta, johon taulut kopioidaan. Oletuksena tehdään kopiot kustakin taulusta siihen kantaan, jossa taulu tällä hetkellä on. Vain yksi argumentti (nimellä ei väliä), joka sisältää kopioitavan taulun (SqlTable) tai taulujoukon (SqlTableGroup). Uusi taulu (SqlTable) tai uudet taulut (SqlTableGroup), jotka ovat samanmuotoisia ja -sisältöisiä kuin lähdetaulut. Kaikki. Kyllä. Ei. - Eivät muutu. 3.3.4 Insert Parametrit Lisää kaikki lähdetaulussa olevat rivit kohdetauluun. Kohdetaulun ei tarvitse olla tyhjä, mutta rakenteeltaan sen on oltava yhteensopiva lähdetaulun kanssa. Ei ole. Sivu 14 / 20

Syötteet Tulos Mitä tietokantatyyppejä tuetaan? Voidaanko ajaa suoraan tietokannan sisällä? Muokkaako suoraan syötetauluja? Osaako käsitellä useita tietokantoja ilman raskasta kopiointia? Tulostaulujen avaimet ja indeksit Virhetilanteet from: taulu, josta rivit luetaan (oltava SqlTable). into: taulu, johon rivit lisätään (oltava SqlTable). Taulu ei saa sisältää rivejä, joiden primary key on sama kuin jonkin lisättävän rivin. Sama taulu, joka annettiin argumenttina into. Tauluun lisätään kaikki from-taulun rivit. Kaikki. Vain sisäkkäisiä kyselyjä tukevilla tietokannoilla. Kyllä. Ei. Jos from-taulu ei ole samassa kannassa kuin into-taulu, se kopioidaan sinne ennen toimenpiteen suoritusta. Into-taulun indekseihin ei tehdä muutoksia. Jos taulujen rakenteet eivät ole yhteensopivia tai tulee primary key -törmäys, koko operaatio epäonnistuu. 3.3.5 Pivot Generoi jokaisesta lähdetaulun rivistä tietyn määrän rivejä. Jos lähdetaulussa on esimerkiksi erikseen sarakkeet jokaisen kuukauden myyntituloja varten, voidaan niiden sijaan tehdä kohdetauluun sarake, joka kertoo kuukauden nimen ja toinen sarake, joka kertoo ko. kuukauden myynnin (jokaisesta lähdetaulun rivistä muodostuu silloin 12 kohdetaulun riviä). Sivu 15 / 20

Parametrit Syötteet Tulos Mitä tietokantatyyppejä tuetaan? Voidaanko ajaa suoraan tietokannan sisällä? Muokkaako suoraan syötetauluja? Osaako käsitellä useita tietokantoja ilman raskasta kopiointia? Tulostaulujen avaimet ja indeksit Virhetilanteet - String locatorcolumnname: kohdetauluun tulevan uuden sarakkeen nimi, jonka sisältö kertoo, mitä lähdetaulun saraketta käyttäen rivi tuotettiin (esim. kuukausi). - String locatorcolumntype: em. sarakkeen tyyppi. - String valuecolumnname: kohdetauluun tulevan uuden sarakkeen nimi, joka sisältää lähdetaulusta poistetussa sarakkeessa olleen arvon (esim. kuukauden myynti). - String valuecolumntype: em. sarakkeen tyyppi. - String[] sourcecolumns: lähdetaulussa olevien sarakkeiden nimet, jotka muutetaan riveiksi. - Object[] locatorcolumnvalues: jokaista lähdetaulun (muutettavaa) saraketta vastaava arvo, joka kirjoitetaan locatorcolumnnamesarakkeeseen kohdetaulussa. Näiden arvojen pitää olla JDBC:n hyväksymää tyyppiä (ks. esim. PreparedStatement.setObject). Yksi taulu Yksi taulu Kaikki Vain sisäkkäisiä kyselyjä tukevilla tietokannoilla. Ei Ei Primary keyt ja uniikit indeksit poistetaan. Tavalliset (ei-uniikit) indeksit, jotka koskevat vain muuttumattomia sarakkeita, pysyvät ennallaan. Muuttuneita sarakkeita koskevat indeksit poistetaan. 3.3.6 Muita toimenpidekomponentteja Lähes kaikki perustoimenpiteet on suunniteltu alustavasti, mutta käyttäen vanhempaa versiota moottorirajapinnasta kuin yllä kuvatut toimenpiteet. Nämä suunnitelmat löytyvät toimenpiteiden alustavasta suunnitelmasta [2]. Sivu 16 / 20

3.4 Dokumentaatiogeneraattori 3.4.1 Yleiskuvaus Dokumentaatiogeneraattori luo automaattisesti dokumentaation prosessikuvauksen perusteella. Prosessista luodaan visuaalinen relaatiomallin mukainen kuvaus. Dokumentaation pohjana käytetään prosessikuvaustiedostoa ja tilanteesta riippuen ETL-moottorilta saatavia lisätietoja, kuten väliaikaisten taulujen ominaisuudet. ETL-prosessidokumentaatioon liitetään seuraavat tiedot: Toimenpiteiden tyyppi Toimenpiteiden muodostama verkko (riippuvuudet) Toimenpiteiden syöte- ja tulostaulut (väliaikaiset prosessin aikaiset taulut) Dokumentaatiogeneraattori on periaatteessa itsenäinen komponentti, mutta toiminnallisesti apuna käytetään muita komponentteja, näistä tärkeimpänä kuvauskieliparseria. 3.4.2 Lähtöaineiston kerääminen Dokumentaation muodostaminen aloitetaan prosessikuvauksesta, tästä generoidaan parserilla vastaavanlainen oliorakenne (verkko), kuten ETL-moottorissa. Toiminnallisesti varaudutaan siihen, että dokumentaatio voidaan generoida käyttämällä lähteenä pelkästään prosessikuvausta. Jos dokumentaation halutaan tieto käytetyistä väliaikaista tauluista ja prosessin ajon aikana muodostuvista parametreista (esim taulujen nimistä), täytyy tieto kysyä ETL-moottorilta prosessin ajon jälkeen. ETL-moottorin täytyy tallentaa tarvittavat prosessin aikaiset tiedot solmuihin (OperationNode), tai tarjota ne jonkin rajapinnan kautta siten, että tieto voidaan liittää oikeaan toimenpiteeseen. Prosessin ajon jälkeen toimenpiteiden muodostama verkko käydään läpi ja siitä poimitaan tiedot käytetyistä tauluista. OperationNode-verkko, joka sisältää nyt kaiken informaation lähetetään varsinaiselle generaattorille, joka muokkaa sen haluttuun loppumuotoon. Tämän rajapinnan tulee olla sellainen, että tuotettavan dokumentaation loppuformaatti on parametroitavissa, käytännössä komponenttia vaihtamalla.. Toimenpideverkko käydään läpi jollakin algoritmilla lähtöaineistosta tietovarastoon päin. Toimenpiteiden tosiasiallisella suoritusjärjestyksellä (joka määräytyy prosessin ajon aikana) ei ole merkitystä, kunhan toimenpiteiden keskinäinen järjestys pysyy oikeana. Relaatiomallliin kuvataan toimenpiteet syöte- ja tulostauluihin. Toimenpiteiden tulostauluista osoitetaan viittaus siihen toimenpiteeseen, jonka syöte tämä on. 3.4.3 Aineiston käsittely Suunniteltava tarkemmin. Tässä voitaisiin käyttää jotain oliopohjaista välimuotoa, jolla eriytetään lähtöaineiston lukeminen ja lopullisen tulosteformaatin tuottaminen. Käytettävän rajapinnan kautta tulisi voida määritellä halutunlaisia komponentteja eri tulosmuotojen tukemiseen. 3.4.4 Dokumentin tuottaminen Dokumentaation loppumuotoja voivat olla mm.: PDF Sivu 17 / 20

HTML SVG Generaattorin pitää osata ottaa huomioon mahdollisen formaatin / median tuottamat rajoitteet (esimerkiksi A4-paperikoko) relaatiomallin visuaalista esitystä muodostettaessa. Relaatiomallin esitys tuotettaneen tässä vaiheessa SVG-formaatissa. XML-pohjaisena tämä mahdollistaa joustavan ohjelmallisen generaation. Lisäksi vektorimalli soveltuu tarkoitukseen erinomaisesti. 4 Viitteet [1] T-76.115 Vaatimusmäärittely ExtraTerrestriaLs / Aureolis Oy [2] Toimenpiteiden_alustava_suunnitelma.sxw Sivu 18 / 20

5 Liitteet 5.1 Esimerkki kuvauskielestä <?xml version="1.0" encoding="utf-8"?> <etl xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:nonamespaceschemalocation="skema strom.xsd"> <!-- Tämä esimerkki pohjautuu seuraavanlaiseen tietokantaan (alleviivatut ovat avaimia): Tuote(_tkoodi_, kuvaus, hinta) Myymala(_mtunnus_, osoite) Myynti(tkoodi, mtunnus, ajankohta) ; Jokaista myytyä tuotetta kohden yksi rivi. ETL-prosessi muodostaa päivittäisen snapshotin myydyistä tuotteista, ja muodostaa tietovarastoon taulun, joka kertoo menneen vuorokauden myynnin tuotteittain ja myymälöittäin. --> <etlprocess name="myynnit1" workingdatabaseid="tyokanta"> <operations> <!-- Haetaan aluksi kopiot tauluista "snapshotmaisesti" operationaalisesta kannasta --> <importsql name="tuotteet" sourcetable="tuote" sourcedatabaseid="kirjanpito"/> <importsql name="myymalat" sourcetable="myymala" sourcedatabaseid="kirjanpito"/> <importsql name="myynnit" sourcetable="myynti" sourcedatabaseid="kirjanpito"/> DAY)"/> <!-- Suodatetaan viimeisimmän vuorokauden aikana myydyt tuotteet --> <filter name="viimeisimmat" source="myynnit" where="ajankohta >= (now() - INTERVAL 1 <call name="myynnit" file="esimerkki3_sub.xml"> <!-- source taas viittaa tässä tiedostossa olevaan toimenpiteen nimeen, argumentin nimeä taas käytetään aliprosessitiedostossa --> <argument name="tuot" source="tuotteet"/> <argument name="myym" source="myymalat"/> <argument name="myyn" source="myynnit"/> </call> <!-- source:ssa mainitaan nyt aliprosessin nimi ja pisteen jälkeen ko. aliprosessin sisällä olevan operaation nimi --> <export source="myynnit.myyntituotteittain" destinationdatabaseid="tietovarasto" destinationtable="paivanmyyntituotteittain"/> <export source="myynnit.myyntimyymaloittain" destinationdatabaseid="tietovarasto" destinationtable="paivanmyyntimyymaloittain"/> </operations> </etlprocess> <!-- Määritellään ETL-prosessissa käytettävät tietokannat --> <configuration> <database id="kirjanpito"> <url>jdbc:mysql://database.firma.com/kirjanpito</url> <type>mysql</type> <username>teemu</username> <password>d3f0lrpbmq</password> </database> <database id="tyokanta"> <url>jdbc:mysql://dw.firma.com/workdb</url> <type>mysql</type> <username>teemu</username> <password>d3f0lrpbmq</password> </database> <database id="tietovarasto"> <url>jdbc:mysql://dw.firma.com/dw</url> <type>mysql</type> <username>teemu</username> <password>d3f0lrpbmq</password> </database> <!-- Määritellään prosessien ajastus - tämä voisi olla käytännössä eri tiedostossa --> <timing> <timedprocess processname="myynnit1"> Sivu 19 / 20

<parameters/> <!-- Lauantaina --> <weekday range="5"/> <hour range="12"/> </timedprocess> </timing> </configuration> </etl> Sivu 20 / 20

Toimenpiteiden alustava suunnitelma Yleinen toimenpiteiden input-luokka DataBundle Toimenpiteissä käytetään yleistä DataBundle input-luokkaa. Kussakin toimenpiteen rajapinnassa on kerrottu toimenpiteen omat vaatimukset kyseiselle luokalle. Input-luokka on yleinen Java-luokka, jonka ETL-moottori initialisoi toimenpidettä varten. Se välittää toimenpiteelle joko itse datan (taulussa tms jos ei suuri määrä?) tai viittauksen dataan johonkin tietokannan tauluun. Se mitä välitetään on toimenpidekohtainen. Input-luokassa välitetään myös tieto suorasti tai epäsuorasti siitä mihin syntynyt output-data halutaan. Yleinen toimenpiteiden käyttämä tietokanta-luokka dbhandler Tietokantaluokka, jossa on ETL-moottorin avaama yhteys (yhteydet) toimenpidettä varten. ETLmoottori lukee configista tietokannan ominaisuudet ja asettaa ne tässä luokassa voimaan ja avaa yhteyden. Tietokantaluokassa täytyisi olla jokin metodi, jolla toimenpide voisi saada haluamansa yhteyden juuri oikeaan kantaan. Tarvittavia metodeja: Tietokannan avaaminen ja sulkeminen: -db.opendb(dbname) -db.closedb(dbname) Tietokannan tyypin palautus nimen perusteella: -db.type(dbname) Prosesssin suoritus (sql-lause) -db.process(sql_sentence) -db.commit(dbname) -db.rollback(dbname)

Summaus Rajapinta Kenttä db DataBundle input Tietokantaluokka, jossa on ETL-moottorin initialisoima yhteys (yhteydet) ja toimenpide voi käsitellä kantoja metodien avulla. Lueteltu alussa. -dbinputname (kannan nimi jos sitä käytetään) -dbinputtablename (input-taulun nimi) -dbinputfieldname (input-kentän nimi) -datatable (data jos ei kannassa) -dboutputname (kannan nimi jos sitä käytetään) -dboutputtablename (output-taulun nimi) -dboutputtablefieldname (output-taulun rivin Field-arvo) Toteutus Tilanteesta riippuen toiminnot suoritetaan joko sisäisesti tai generoidaan tietokantaan suoritettaviksi. Toimintojen tulisi toimia erilaisissa tietokannoissa ja siten on pystyttävä lennosta valitsemaan kuinka sql-generoidaan tietokantaan. Jos dbinputname on tyhjä oletetaan että data on input-luokassa datatable:ssa muuten luetaan input kannasta. Jos dboutputname on tyhjä palautetaan summa DataElementissä ETL-moottorille muuten se tallennetaan kantaan (Alla kuvattu tarkemmin dboutputtablename). dboutputtablename sisältää seuraavat kentät: - Field (merkkijono) - Value (numeerinen) Syntyvän rivin Fieldiksi tulee: (dbinputname + dbinputtablename + dbinputfieldname + Sum ) tai dboutputtablefieldname ja valueksi laskettu summa. Tätä taulua voivat periaatteessa käyttää muutkin toimenpiteet joiden arvoksi tulee yksi numeerinen arvo (ks. keskiarvo, count). Virhetilanteet Virhetilanteessa toimenpide palauttaa exceptionin, jonka etl-mootori voi ottaa kiinni ja analysoida tarkemmin.

Copy Rajapinta Kenttä db DataBundle input Tietokantaluokka, jossa on ETL-moottorin initialisoima yhteys (yhteydet) ja toimenpide voi käsitellä kantoja metodien avulla. Lueteltu alussa. -dbinputname (kannan nimi jos sitä käytetään) -dbinputtablename (input-taulun nimi) -datatable -dboutputname (kannan nimi jos sitä käytetään) -dboutputtablename (output-taulun nimi) Toteutus Tilanteesta riippuen toiminnot suoritetaan joko sisäisesti tai generoidaan tietokantaan suoritettaviksi. Toimintojen tulisi toimia erilaisissa tietokannoissa ja siten on pystyttävä lennosta valitsemaan kuinka sql-generoidaan tietokantaan. Jos dbinputname on tyhjä oletetaan että data on input-luokassa datatable:ssa muuten luetaan input kannasta. Jos dboutputname on tyhjä palautetaan syntynyt taulu DataElementissä ETL-moottorille muuten se tallennetaan kantaan. Copy tulee toimimaan create-moodissa (muut vaihtoehdot olisivat: replace, insert ja append, mutta niitä tuskin vielä toteutetaan?) mikä tarkoittaa sitä että toimenpide yrittää aina luoda uuden taulun haluttuun kantaan ja jos taulu on jo olemassa copy palauttaa virheen. Alkuperäisen taulun ominaisuudet (kenttien nimet ja tyypit) luetaan kannasta tai datatablesta ja niiden perusteella luodaan uusi taulu tai uusi datatable. Itse data voidaan kopioda insert-lauseilla toiseen kantaan uuteen tauluun. Virhetilanteet Virhetilanteessa toimenpide palauttaa exceptionin, jonka etl-mootori voi ottaa kiinni ja analysoida tarkemmin.

Join Rajapinta Kenttä db DataBundle input Tietokantaluokka, jossa on ETL-moottorin initialisoima yhteys (yhteydet) ja toimenpide voi käsitellä kantoja metodien avulla. Lueteltu alussa. -dbinputname (kannan nimi jos sitä käytetään) -dbinputtable1name (input1-taulun nimi) -dbinputtable2name (input2-taulun nimi) -dbinputtable1fields (valitut kentät hashmap:ssa tms) -dbinputtable2fields (valitut kentät hashmap:ssa tms) -dbinputtable1primary (kenttä joka vastaa toisen taulun kenttää) -dbinputtable2primary (kenttä joka vastaa toisen taulun kenttää) -datatable1 -datatable2 -dboutputname (kannan nimi jos sitä käytetään) -dboutputtablename (output-taulun nimi) Toteutus Tilanteesta riippuen toiminnot suoritetaan joko sisäisesti tai generoidaan tietokantaan suoritettaviksi. Toimintojen tulisi toimia erilaisissa tietokannoissa ja siten on pystyttävä lennosta valitsemaan kuinka sql-generoidaan tietokantaan. Jos dbinputname on tyhjä oletetaan että data on input-luokissa datatable1:ssa ja datatable2:ssa muuten luetaan input kannasta. Jos dboutputname on tyhjä palautetaan syntynyt taulu DataElementissä ETL-moottorille muuten se tallennetaan kantaan. Join tulee toimimaan tavallisessa moodissa (muut vaihtoehdot olisivat: inner-, left- ja right-join, mutta niitä tuskin vielä toteutetaan?) mikä tarkoittaa sitä että vain ne rivit syntyvät joilla on löytynyt kummastakin taulusta pari. Parien löytämisessä ei käytetä kuin yhtä kenttää kustakin taulusta. Jos Primary-kenttiä ei ole syötetty tehdään täysi join. Joinia voidaan rajata tarkemmin toisella toimenpiteellä - rajauksella. Alkuperäisten taulujen ominaisuudet (kenttien nimet ja tyypit) luetaan kannasta tai datatablesta ja niiden perusteella luodaan uusi taulu tai uusi datatable, jossa ovat vain valitut kentät. Itse data voidaan kopioda insert-lauseilla kantaan uuteen tauluun. Virhetilanteet Virhetilanteessa toimenpide palauttaa exceptionin, jonka etl-mootori voi ottaa kiinni ja analysoida tarkemmin.

Rajaus Equals (myöhemmin voi lisätä >, <,!=, like, in jne) Rajapinta Kenttä db DataBundle input Tietokantaluokka, jossa on ETL-moottorin initialisoima yhteys (yhteydet) ja toimenpide voi käsitellä kantoja metodien avulla. Lueteltu alussa. -dbinputname (kannan nimi jos sitä käytetään) -dbinputtablename (input1-taulun nimi) -dbinputfield1 (kentän nimi jota verrataan joko toiseen kenttään tai inputstringiin) -dbinputfield2 (vaihtoehtoinen 2 kentän nimi jota verrataan ensimmäiseen) -dbinputstring (merkkijono tai numero johon verrataan) -datatable -dboutputname (kannan nimi jos sitä käytetään) -dboutputtablename (output-taulun nimi) Toteutus Tilanteesta riippuen toiminnot suoritetaan joko sisäisesti tai generoidaan tietokantaan suoritettaviksi. Toimintojen tulisi toimia erilaisissa tietokannoissa ja siten on pystyttävä lennosta valitsemaan kuinka sql-generoidaan tietokantaan. Jos dbinputname on tyhjä oletetaan että data on input-luokissa datatable:ssa muuten luetaan input kannasta. Jos dboutputname on tyhjä palautetaan syntynyt taulu DataElementissä ETL-moottorille muuten se tallennetaan kantaan. Equals-rajaus valitsee ne rivit, joissa dbinputfield1=dbinputfield2 tai jos dbinputfield2 on tyhjä niin dbinputfield1= dbinputstring. Alkuperäisten taulujen ominaisuudet (kenttien nimet ja tyypit) luetaan kannasta tai datatablesta ja niiden perusteella luodaan uusi taulu tai uusi datatable, jossa ovat vain valitut kentät. Itse data voidaan kopioda insert-lauseilla kantaan uuteen tauluun. Virhetilanteet Virhetilanteessa toimenpide palauttaa exceptionin, jonka etl-mootori voi ottaa kiinni ja analysoida tarkemmin.

Keskiarvo Rajapinta Kenttä db DataBundle input Tietokantaluokka, jossa on ETL-moottorin initialisoima yhteys (yhteydet) ja toimenpide voi käsitellä kantoja metodien avulla. Lueteltu alussa. -dbinputname (kannan nimi jos sitä käytetään) -dbinputtablename (input-taulun nimi) -dbinputfieldname (input-kentän nimi) -datatable (data jos ei kannassa) -dboutputname (kannan nimi jos sitä käytetään) -dboutputtablename (output-taulun nimi) -dboutputtablefieldname (output-taulun rivin Field-arvo) Toteutus Tilanteesta riippuen toiminnot suoritetaan joko sisäisesti tai generoidaan tietokantaan suoritettaviksi. Toimintojen tulisi toimia erilaisissa tietokannoissa ja siten on pystyttävä lennosta valitsemaan kuinka sql-generoidaan tietokantaan. Jos dbinputname on tyhjä oletetaan että data on input-luokassa datatable:ssa muuten luetaan input kannasta. Jos dboutputname on tyhjä palautetaan summa DataElementissä ETL-moottorille muuten se tallennetaan kantaan (Alla kuvattu tarkemmin dboutputtable). dboutputtablename sisältää seuraavat kentät: - Field (merkkijono) - Value (numeerinen) Syntyvän rivin Fieldiksi tulee: (dbinputname + dbinputtablename + dbinputfieldname + Average ) tai dboutputtablefieldname ja valueksi laskettu keskiarvo. Tätä taulua voivat periaatteessa käyttää muutkin toimenpiteet joiden arvoksi tulee yksi numeerinen arvo (ks. summaus ja count). Virhetilanteet Virhetilanteessa toimenpide palauttaa exceptionin, jonka etl-mootori voi ottaa kiinni ja analysoida tarkemmin.

Count Rajapinta Kenttä db DataBundle input Tietokantaluokka, jossa on ETL-moottorin initialisoima yhteys (yhteydet) ja toimenpide voi käsitellä kantoja metodien avulla. Lueteltu alussa. -dbinputname (kannan nimi jos sitä käytetään) -dbinputtablename (input-taulun nimi) -dbinputfieldname (input-kentän nimi) -datatable (data jos ei kannassa) -dboutputname (kannan nimi jos sitä käytetään) -dboutputtablename (output-taulun nimi) -dboutputtablefieldname (output-taulun rivin Field-arvo) Toteutus Tilanteesta riippuen toiminnot suoritetaan joko sisäisesti tai generoidaan tietokantaan suoritettaviksi. Toimintojen tulisi toimia erilaisissa tietokannoissa ja siten on pystyttävä lennosta valitsemaan kuinka sql-generoidaan tietokantaan. Jos dbinputname on tyhjä oletetaan että data on input-luokassa datatable:ssa muuten luetaan input kannasta. Jos dboutputname on tyhjä palautetaan summa DataElementissä ETL-moottorille muuten se tallennetaan kantaan (Alla kuvattu tarkemmin dboutputtable). dboutputtablename sisältää seuraavat kentät: - Field (merkkijono) - Value (numeerinen) Syntyvän rivin Fieldiksi tulee: (dbinputname + dbinputtablename + dbinputfieldname + Count ) tai dboutputtablefieldname ja valueksi laskettu lkm. Tätä taulua voivat periaatteessa käyttää muutkin toimenpiteet joiden arvoksi tulee yksi numeerinen arvo (ks. summaus ja keskiarvo). Virhetilanteet Virhetilanteessa toimenpide palauttaa exceptionin, jonka etl-mootori voi ottaa kiinni ja analysoida tarkemmin.

Merge Rajapinta Kenttä db DataBundle input Tietokantaluokka, jossa on ETL-moottorin initialisoima yhteys (yhteydet) ja toimenpide voi käsitellä kantoja metodien avulla. Lueteltu alussa. -dbinputname (kannan nimi jos sitä käytetään) -dbinputtablename (input1-taulun nimi) -dbinputtablename2 (input2-taulun nimi) -datatable1 (data jos ei kannassa) -datatable2 (data jos ei kannassa) -dboutputname (kannan nimi jos sitä käytetään) -dboutputtablename (output-taulun nimi) Toteutus Tilanteesta riippuen toiminnot suoritetaan joko sisäisesti tai generoidaan tietokantaan suoritettaviksi. Toimintojen tulisi toimia erilaisissa tietokannoissa ja siten on pystyttävä lennosta valitsemaan kuinka sql-generoidaan tietokantaan. Jos dbinputname on tyhjä oletetaan että data on input-luokissa datatable:eissa muuten luetaan input kannasta. Jos dboutputname on tyhjä palautetaan summa DataElementissä ETL-moottorille muuten se tallennetaan kantaan (Alla kuvattu tarkemmin dboutputtable). Merge-toimenpide yhdistää kaksi taulua yhteen. Ensin insertoidaan toisen taulun tiedot ja sitten toisen. Myöhemmin toiminnon yhteyteen voi lisätä myös sortin. Virhetilanteet Virhetilanteessa toimenpide palauttaa exceptionin, jonka etl-mootori voi ottaa kiinni ja analysoida tarkemmin.

Insert Rajapinta Kenttä db DataBundle input Tietokantaluokka, jossa on ETL-moottorin initialisoima yhteys (yhteydet) ja toimenpide voi käsitellä kantoja metodien avulla. Lueteltu alussa. -dbinputname (kannan nimi jos sitä käytetään) -dbinputtablename (input-taulun nimi) -datatable -dboutputname (kannan nimi jos sitä käytetään) -dboutputtablename (output-taulun nimi) Toteutus Tilanteesta riippuen toiminnot suoritetaan joko sisäisesti tai generoidaan tietokantaan suoritettaviksi. Toimintojen tulisi toimia erilaisissa tietokannoissa ja siten on pystyttävä lennosta valitsemaan kuinka sql-generoidaan tietokantaan. Jos dbinputname on tyhjä oletetaan että data on input-luokassa datatable:ssa muuten luetaan input kannasta. Jos dboutputname on tyhjä palautetaan syntynyt taulu DataElementissä ETL-moottorille muuten se tallennetaan kantaan. Insert olettaa että taulu on jo olemassa ja lisää rivit siihen jos taulua ei löydy insert palauttaa virheen. Alkuperäisen taulun ominaisuudet (kenttien nimet ja tyypit) luetaan kannasta tai datatablesta ja niiden perusteella insertoidaan olemassa olevaan tauluun tai datatableen. Virhetilanteet Virhetilanteessa toimenpide palauttaa exceptionin, jonka etl-mootori voi ottaa kiinni ja analysoida tarkemmin.

Delete Rajapinta Kenttä db DataBundle input Tietokantaluokka, jossa on ETL-moottorin initialisoima yhteys (yhteydet) ja toimenpide voi käsitellä kantoja metodien avulla. Lueteltu alussa. -dbinputname (kannan nimi jos sitä käytetään) -dbinputtablename (input-taulun nimi) -datatable Toteutus Tilanteesta riippuen toiminnot suoritetaan joko sisäisesti tai generoidaan tietokantaan suoritettaviksi. Toimintojen tulisi toimia erilaisissa tietokannoissa ja siten on pystyttävä lennosta valitsemaan kuinka sql-generoidaan tietokantaan. Jos dbinputname on tyhjä oletetaan että data on input-luokassa datatable:ssa muuten luetaan input kannasta. Jos dboutputname on tyhjä palautetaan syntynyt taulu DataElementissä ETL-moottorille muuten se tallennetaan kantaan. Delete tyhjentää koko taulun sisällön. Tässä vaiheessa emme toteuta mitä rajausta tähän toimenpiteeseen vaan sellainen voidaan tehdä yhdistelemällä muita komentoja. Virhetilanteet Virhetilanteessa toimenpide palauttaa exceptionin, jonka etl-mootori voi ottaa kiinni ja analysoida tarkemmin.

Union Rajapinta Kenttä db DataBundle input Tietokantaluokka, jossa on ETL-moottorin initialisoima yhteys (yhteydet) ja toimenpide voi käsitellä kantoja metodien avulla. Lueteltu alussa. -dbinputname (kannan nimi jos sitä käytetään) -dbinputtablename (input1-taulun nimi) -dbinputtablename2 (input2-taulun nimi) -datatable1 (data jos ei kannassa) -datatable2 (data jos ei kannassa) -dboutputname (kannan nimi jos sitä käytetään) -dboutputtablename (output-taulun nimi) Toteutus Tilanteesta riippuen toiminnot suoritetaan joko sisäisesti tai generoidaan tietokantaan suoritettaviksi. Toimintojen tulisi toimia erilaisissa tietokannoissa ja siten on pystyttävä lennosta valitsemaan kuinka sql-generoidaan tietokantaan. Jos dbinputname on tyhjä oletetaan että data on input-luokissa datatable:eissa muuten luetaan input kannasta. Jos dboutputname on tyhjä palautetaan syntynyt taulu DataElementissä ETLmoottorille muuten se tallennetaan kantaan. Union-toimenpide yhdistää kaksi taulua yhteen niin ettei siinä ole duplikaattirivejä. Ensin insertoidaan toisen taulun tiedot ja sitten toisen mikäli niitä ei ole jo taulussa. Virhetilanteet Virhetilanteessa toimenpide palauttaa exceptionin, jonka etl-mootori voi ottaa kiinni ja analysoida tarkemmin.

Intersection Rajapinta Kenttä db DataBundle input Tietokantaluokka, jossa on ETL-moottorin initialisoima yhteys (yhteydet) ja toimenpide voi käsitellä kantoja metodien avulla. Lueteltu alussa. -dbinputname (kannan nimi jos sitä käytetään) -dbinputtablename (input1-taulun nimi) -dbinputtablename2 (input2-taulun nimi) -datatable1 (data jos ei kannassa) -datatable2 (data jos ei kannassa) -dboutputname (kannan nimi jos sitä käytetään) -dboutputtablename (output-taulun nimi) Toteutus Tilanteesta riippuen toiminnot suoritetaan joko sisäisesti tai generoidaan tietokantaan suoritettaviksi. Toimintojen tulisi toimia erilaisissa tietokannoissa ja siten on pystyttävä lennosta valitsemaan kuinka sql-generoidaan tietokantaan. Jos dbinputname on tyhjä oletetaan että data on input-luokissa datatable:eissa muuten luetaan input kannasta. Jos dboutputname on tyhjä palautetaan syntynyt taulu DataElementissä ETLmoottorille muuten se tallennetaan kantaan. Intersection-toimenpide yhdistää kaksi taulua yhteen niin että siinä on vain ne rivit, jotka löytyvät kummastakin. Lähdetään ensimmäisen taulun riveistä liikkeelle. Katsotaan ensimmäiselle riville löytyykö toisesta ja jos löytyy niin rivi listätään muuten ei ja sitten katsotaan toinen rivi jne. Virhetilanteet Virhetilanteessa toimenpide palauttaa exceptionin, jonka etl-mootori voi ottaa kiinni ja analysoida tarkemmin.