Ălskar du att upprepa rutinoperationer gĂ„ng pĂ„ gĂ„ng? Det gör inte jag. Men varje gĂ„ng jag arbetade med Rosetelecoms datalager i SQL-klienten var jag tvungen att manuellt ange alla joins mellan tabeller. Och detta trots att i 90 % av fallen fĂ€lten och villkoren för att förena tabellerna stĂ€mde överens frĂ„n frĂ„ga till frĂ„ga! Det skulle kĂ€nnas som att vilken SQL-klient som helst har autocompletionsfunktioner, men för datalager fungerar det inte alltid: dĂ€r sĂ€llan skapas unique constraint och foreign key för att öka prestanda, och utan det kan programmet inte förstĂ„ hur entiteterna hĂ€nger ihop och vad det kan erbjuda dig.
Efter att ha gÄtt igenom förnekelse, ilska, förhandlande, depression och nÀrmande till acceptans, bestÀmde jag mig - varför inte försöka implementera autocompletion sjÀlv med lite blackjack som man ska? Jag anvÀnder klienten dbeaver, skriven i java, och den har en community-version med öppen kÀllkod. Jag kom pÄ en enkel plan:
- Hitta klasserna i kÀllkoden som ansvarar för autocompletion
- Omrikta dem för att arbeta med externa metadata och hÀmta information om joins dÀrifrÄn
- ??????
- PROFIT
Jag kom snabbt fram till den första punkten - jag hittade i bugtrackern en begÀran om att justera autocompletion och i relaterad upptÀckte jag klassen SQLCompletionAnalyzer. Jag tittade pÄ koden - precis vad jag behövde. Nu Äterstod det bara att skriva om den sÄ att allt fungera. Jag vÀntade pÄ en ledig kvÀll och började planera implementationen. Reglerna för tabellrelationer (metadata) bestÀmde jag mig för att spara i json. Jag hade ingen praktisk erfarenhet av att arbeta med detta format och den aktuella uppgiften verkade vara en möjlighet att ÄtgÀrda denna brist.
För att arbeta med json bestÀmde jag mig för att anvÀnda biblioteket frÄn Google. HÀr började överraskningarna. Som det visade sig Àr dbeaver, som ett Àkta program, skrivet pÄ eclipse-plattformen med hjÀlp av OSGi-ramverket. För erfarna utvecklare ger detta bekvÀmlighet för att hantera beroenden, för mig liknade det mer mörk magi, som jag uppenbarligen inte var beredd pÄ: vanligtvis skriver jag importen av de klasser jag behöver frÄn biblioteket json-simple i toppen av den redigerade klassen, anger det i pom.xml, efter vilket projektet kategoriskt vÀgrar att byggas ordentligt och kraschar med fel.
Att ÄtgÀrda byggfel resulterade i att jag skrev in biblioteket inte i pom.xml, utan i manifestet manifest.mf, som OSGI föreskriver, och angav det som import-package. Inte den vackraste lösningen, men den fungerar. HÀr dök nÀsta överraskning upp. Om du utvecklar i IntelliJ IDEA kan du inte bara starta debuggern för ditt projekt som Àr baserat pÄ Eclipse-plattformen: en oerfaren utvecklare mÄste lida lika mycket som en analytiker utan autocompletion av sina frÄgor. Till hjÀlp kom sjÀlva utvecklarna av Beaver, som angav i wikin alla de danser som mÄste utföras. Det mest frustrerande var att Àven efter alla dessa anstrÀngningar vÀgrade projektet att starta i debuggern med det importerade json-biblioteket (trots att det fortfarande byggdes framgÄngsrikt i det fÀrdiga produkten).
Vid den tiden hade jag upplevt obehaget med att anvĂ€nda json för min uppgift â metadata var tĂ€nkt att redigeras manuellt, och för det passar xml-formatet bĂ€ttre. Det andra argumentet för xml var att JDK hade alla nödvĂ€ndiga klasser, vilket gjorde att jag kunde sluta kĂ€mpa med det externa biblioteket. Jag flyttade med stor glĂ€dje all metadata frĂ„n json till xml och började arbeta med logiken för autocompletion.
Exempel pÄ metadata
dim_account
dim_partner
dim_account
dim_branchSom ett resultat av detta i klasserna SQLUtils och SQLCompletionAnalyzer. Idén Àr följande: om programmet inte lyckas föreslÄ lÀmpliga autocompletion-förslag enligt grundlogiken, kontrollerar det om det finns möjliga joins enligt filen xml. I sjÀlva filen lagras tabell-par med angivande av fÀlt som dessa tabeller ska kopplas samman med. BegrÀnsningar för tekniska datumen för poster eff_dttm och exp_dttm och flaggan för logisk borttagning deleted_ind anges som standard.
NĂ€r Ă€ndringarna i koden hade gjorts uppstod frĂ„gan â vem kommer att fylla i metadatafilen? Det finns mĂ„nga entiteter i lagret, att skriva alla kopplingar sjĂ€lv blir tungt. I slutĂ€ndan beslutade jag att ge denna uppgift till mina kollegor inom analys. Metadatafilen lade jag ut i svn, dĂ€rifrĂ„n görs en checkout i den lokala katalogen med programmet. Principen Ă€r följande: har en ny entitet lagts till i lagret? En analytiker lĂ€gger in möjliga joins i filen, committar Ă€ndringarna, de andra gör checkout till sig och njuter av det fungerande autofyllandet: community, kunskapsuppbyggnad och allt sĂ„nt. Jag höll en workshop för kollegorna om anvĂ€ndning av programmet, skrev en artikel i Confluence â nu har företaget ett bekvĂ€mare verktyg.
Arbetet med denna funktion gav mig insikten att man inte ska vara rĂ€dd för att peta i open source-projekt â som regel har de en tydlig arkitektur, och Ă€ven grundlĂ€ggande kunskaper i sprĂ„ket rĂ€cker för experiment. Med en viss grad av envishet kan man till och med bli av med de hatade rutinoperationerna och spara tid för nya experiment.
KĂ€lla: habr.com
