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ä

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

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

T Testitapaukset TC-1

T Testiraportti TR-3. ETL-työkalu

T Testiraportti TR-2. ETL-työkalu

T Vaatimusmäärittelydokumentti. ETL-työkalu

Ohjelmoinnin perusteet Y Python

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

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

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

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

Ohjelmoinnin perusteet Y Python

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

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

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

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

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

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

Ohjelmoinnin jatkokurssi, kurssikoe

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

Ohjelmoinnin perusteet Y Python

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

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

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

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

Taulukot. Jukka Harju, Jukka Juslin

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

T Edistymisraportti. ExtraTerrestriaLs I1 iteraatio

Ohjelmoinnin perusteet Y Python

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

Ohjelmoinnin perusteet, syksy 2006

Vaatimusmäärittely Ohjelma-ajanvälitys komponentti

Asiointipalvelun ohje

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

Kansionäkymä listasta suuriin kuvakkeisiin

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

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

Digi-tv vastaanottimella toteutetut interaktiiviset sovellukset

Valppaan asennus- ja käyttöohje

811120P Diskreetit rakenteet

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

Harjoitus 5 (viikko 41)

SELECT-lauseen perusmuoto

Ohjelmoinnin perusteet Y Python

Visma Business AddOn Tositteiden tuonti. Käsikirja

Visual Case 2. Miika Kasnio (C9767)

TESTIRAPORTTI - VYM JA KANTA Virtuaaliyhteisöjen muodostaminen Versio 1.0

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

Ensimmäisessä vaiheessa ladataan KGU tietokanta Hallitse tietokantoja toiminnon avulla.

Webforum. Version 15.1 uudet ominaisuudet. Päivitetty:

Hohde Consulting 2004

Olio-ohjelmointi Javalla

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

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

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

ELM GROUP 04. Teemu Laakso Henrik Talarmo

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

18. Abstraktit tietotyypit 18.1

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

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

Opettajana Mika Sorsa, HAMK:n ammatillisen opettajakoulutuksen opetusharjoittelija

Osoitin ja viittaus C++:ssa

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

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

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

1. Omat operaatiot 1.1

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

Helsingin yliopisto, Tietojenkäsittelytieteen laitos Tietokantojen perusteet, , H.Laine

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

HELIA 1 (17) Outi Virkki Tiedonhallinta

Ohjelmoinnin perusteet Y Python

TIETOKANTOJEN PERUSTEET MARKKU SUNI

2. Olio-ohjelmoinista lyhyesti 2.1

Helsingin yliopisto Tietojenkäsittelytieteen laitos (H.Laine) Tietokantojen perusteet. Liitteenä: Tiivistelmä SQL-syntaksista

Sähköposti ja uutisryhmät

Suunnitteluvaihe prosessissa

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

Luento 5. Timo Savola. 28. huhtikuuta 2006

Ohjelmoinnin perusteet Y Python

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

Harjoitustyö: virtuaalikone

Ohjelmoinnin perusteet Y Python

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

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

Excel pivot. Sisällys

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

Taulukkolaskennan perusteet Taulukkolaskentaohjelmat

4. Luokan testaus ja käyttö olion kautta 4.1

Fakta versio Forecast versio

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

Ohjelmoinnin perusteet Y Python

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 Kuvauskieli 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 Kuvauskielen 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 3.2.2005 Timo Sallinen Ajantasaistettu, lisätty uusia toimenpiteitä 1.2 6.2.2005 Timo Sallinen Korjauksia 1.3 7.2.2005 Risto Kunnas Korjauksia, lisätty ImportSql Sivu 1 / 21

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 Kuvauskieli... 5 3.1.1 Rakenne...6 3.1.2 Prosessikuvaus...6 3.1.3 Konfiguraatio...6 3.1.4 Projektimäärittely... 6 3.2 ETL-moottori... 6 3.2.1 Yleiskuvaus... 6 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ä...8 3.2.5 ETL-prosessin aikana tapahtuvien virheiden hallinta... 9 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...11 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 Delete...16 3.3.7 Export... 16 3.3.8 Join... 17 3.3.9 Filter... 17 3.3.10 ImportCSV... 17 3.3.11 Muita toimenpidekomponentteja...17 3.4 Dokumentaatiogeneraattori... 18 3.4.1 Yleiskuvaus... 18 3.4.2 Lähtöaineiston kerääminen...18 Sivu 2 / 21

3.4.3 Aineiston käsittely...18 3.4.4 Dokumentin tuottaminen...19 4 Viitteet... 19 5 Liitteet...20 5.1 Esimerkki kuvauskielestä...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: Kuvauskieli, 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 / 21

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

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.etltool.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.docgen -dokumentaatiogeneraattorin pääpaketti 3 Moduulit 3.1 Kuvauskieli Kuvauskieli kuvaa ETL-prosessin, lähdeaineistot, kohdekannat ja toimenpiteet. Kuvauskielen toteutustavaksi valittiin projektin puitteista luotava XML-kieli. Syitä valintaan olivat: Helppo muokattavuus sekä käsin, että koneellisesti Voidaan käyttää olemassa olevia parseritoteutuksia (helppo validointi ja jäsennys) Sivu 5 / 21

Helppo dokumentoinnin generointi Kuvauskieli 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 Kuvauskieli 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.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 Sivu 6 / 21

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. Kuva 2: Prosessin rakenteen kuvaamiseen liittyvät luokat (moottorin sisäinen esitystapa) Sivu 7 / 21

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ä. 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ä. Sivu 8 / 21

Kuva 3: Rajapinta moottorin ja toimenpidekomponenttien välillä 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 Sivu 9 / 21

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ö. Tähän varaudutaan tallentamalla prosessin välituloksia sopivin väliajoin (määritelty käsin prosessikuvauksessa) ja mahdollistamalla prosessin käynnistys jostain välituloksesta alkaen. 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: 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. Sivu 10 / 21

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 -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. Kuvauskielen 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. Kuvauskielessä 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. Sivu 11 / 21

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 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 Delete, taulun tai rivien poisto Sivu 12 / 21

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 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 ja lataajakomponenttiin. Sivu 13 / 21

3.3.3 Copy Kuvaus 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 Kuvaus Parametrit Syötteet Tulos Mitä tietokantatyyppejä tuetaan? Voidaanko ajaa suoraan tietokannan sisällä? Muokkaako suoraan syötetauluja? Lisää kaikki lähdetaulussa olevat rivit kohdetauluun. Kohdetaulun ei tarvitse olla tyhjä, mutta rakenteeltaan sen on oltava yhteensopiva lähdetaulun kanssa. Ei ole. 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ä. Sivu 14 / 21

Osaako käsitellä useita tietokantoja ilman raskasta kopiointia? Tulostaulujen avaimet ja indeksit Virhetilanteet 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 Kuvaus Parametrit Syötteet Tulos Mitä tietokantatyyppejä tuetaan? 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ä). - 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 Sivu 15 / 21

Voidaanko ajaa suoraan tietokannan sisällä? Muokkaako suoraan syötetauluja? Osaako käsitellä useita tietokantoja ilman raskasta kopiointia? Tulostaulujen avaimet ja indeksit Virhetilanteet 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 Delete Kuvaus Syötteet Parametrit Osaako käsitellä useita tietokantoja ilman raskasta kopiointia? Muokkaako suoraan syötetauluja? Virhetilanteet Poistaa syötetaulusta joko yksittäisiä rivejä tai koko taulun. String: filter, jos annettu poistetaan rivit ehdon mukaan, muuten poistetaan koko taulu. Ei päde Kyllä 3.3.7 Export Kuvaus Parametrit Syötteet Muokkaako suoraan syötetauluja Tulostaulujen avaimet ja indeksit Virhetilanteet Vie syötetalun tietovarastoon. Validoi haluttaessa syötteen taulurakenteen suhteessa kuvauskielessä määriteltyyn. String : outputname kohdetaulun nimi boolean : droptable, jos tosi dropataan olemassaolevataulu, muuten appendoidaan Yksi SQL-taulu ei Kopioidaan sellaisenaan Sivu 16 / 21

3.3.8 Join Kuvaus Parametrit Syötteet Muokkaako suoraan syötetauluja Tulostaulujen avaimet ja indeksit Virhetilanteet Yhdistää kaksi tai usemman taulun. String : outputname kohdetaulun nimi JoinCondition. Liitos-tapa 2..n kpl sql-tauluja ei Ei toteutettu Jos löytyy rivejä, joita ei voida liittää, laitetaan nämä virhetauluun 3.3.9 Filter Kuvaus Parametrit Syötteet Muokkaako suoraan syötetauluja Tulostaulujen avaimet ja indeksit Virhetilanteet Suodattaa taulusta rivejä annetun ehdon perusteella String : outputname kohdetaulun nimi String : condition: ehto sql-syntaksin mukaisena esitettynä Yksi SQL-taulu ei Kopioidaan sellaisenaan syötetaulusta 3.3.10 ImportCSV Kuvaus Parametrit Syötteet Muokkaako suoraan syötetauluja Tulostaulujen avaimet ja indeksit Importoi prosessiin CSV-muotoisen tekstitiedoston, josta luodaan tilapäinen SQLtaulu String : outputname -kohdetaulun nimi Database : targetdatabase kohdekanta URL sourceuri : CSV:tiedoston lähdeuri SqlTableFormat: tulostaulun formaatti, sisältää indeksit ja avaimet (kuvauskielessä destinationtableformat ja destinationtableindices) Char : separaattori CVS-tiedosto, voidaan lukea myös verkon yli ei Määritellään kuvauskielessä Sivu 17 / 21

Kuvaus Virhetilanteet Importoi prosessiin CSV-muotoisen tekstitiedoston, josta luodaan tilapäinen SQLtaulu Tiedostoa ei saada luettua keskeyttää suorituksen Formaatti on väärä keskeyttää suorituksen 3.3.11 ImportSQL Kuvaus Parametrit Syötteet Muokkaako suoraan syötetauluja Tulostaulujen avaimet ja indeksit Virhetilanteet Importoi prosessiin SQL-taulun, josta luodaan prosessin käyttämä tilapäinen SQL-taulu String : outputname -kohdetaulun nimi Database : targetdatabase kohdekanta (työskentelykanta) String: sourcename: -lähdetaulun nimi Database: sourcedatabase - lähdekanta ei Haetaaan lähdetaulusta Taulua ei löydy Yhteyttä kantaan ei saada 3.3.12 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]. 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. Sivu 18 / 21

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 Dokumentaatiogeneraattorin rajapinta on suunniteltu siten, että varsinaisen kohdemuodon toteuttava implementaatio voidaan vaihtaa, tarvittaessa vaikka dynaamisesti. Kaikki implementaatiot toteuttavat yhtenäisen rajapinnan, joka määrittelee metodit alustukselle ja graafin solmujen lisäämiseksi. Toteutetaan tässä vaiheessaa JFrame-pohjainen graafinen esitys, sekä tekstipohjainen XML-muoto. 3.4.4 Dokumentin tuottaminen Dokumentaation loppumuotoja voivat olla mm.: PDF 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 19 / 21

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"> <parameters/> <!-- Lauantaina --> Sivu 20 / 21