Kako prestati raditi istu stvar

Da li volite da ponavljate rutinske operacije iznova i iznova? Tako da ne znam. Ali svaki put u SQL klijentu kada sam radio sa Rostelecom skladištem, morao sam ručno registrovati sve spojeve između tabela. I to uprkos činjenici da su se u 90% slučajeva polja i uslovi za spajanje tabela poklapali od zahteva do zahteva! Čini se da svaki SQL klijent ima funkcije automatskog dovršavanja, ali za skladišta to ne radi uvijek: oni rijetko uključuju jedinstveno ograničenje i strani ključ kako bi poboljšali performanse, a bez toga program neće znati kako su entiteti povezani sa svakim od njih. drugo i šta vam može ponuditi.

Kako prestati raditi istu stvar

Nakon što sam prošao kroz poricanje, ljutnju, cjenkanje, depresiju i približavanje prihvatanju, odlučio sam – zašto ne bih pokušao sam implementirati autofill s blackjackom i to na pravi način? Koristim dbeaver klijent, napisan na java-i, ima open source verziju zajednice. Sazreo je jednostavan plan:

  1. Pronađite klase u izvornom kodu koje su odgovorne za automatsko dovršavanje
  2. Preusmjerite ih da rade s vanjskim metapodacima i odatle izvlače informacije o spajanjima
  3. ??????
  4. PROFIT

Prilično sam brzo shvatio prvu stvar - pronašao sam zahtjev u alatu za praćenje grešaka za podešavanje automatskog popunjavanja iu povezanom počiniti otkrio klasu SQLCompletionAnalyzer. Pogledao sam kod i to je ono što mi treba. Ostaje samo da se prepiše tako da sve radi. Sačekao sam slobodno veče i počeo da razmišljam o implementaciji. Odlučio sam da napišem pravila povezivanja tabele (metapodatke) u json. Nisam imao praktičnog iskustva u radu sa ovim formatom i trenutni zadatak je viđen kao prilika za ispravljanje ovog propusta.

Za rad sa json-om odlučio sam koristiti biblioteku json-jednostavan od Googlea. Tu su počela iznenađenja. Kako se pokazalo, dbeaver je, kao prava aplikacija, napisan na platformi Eclipse koristeći OSGi framework. Za iskusne programere, ova stvar olakšava upravljanje zavisnostima, ali za mene je to više ličilo na mračnu magiju, za koju očigledno nisam bio spreman: kao i obično, uvozim klase koje su mi potrebne iz json-simple biblioteke u zaglavlju uređenu klasu, navedite je u pom xml-u, nakon čega se projekat kategorički odbija normalno sastaviti i ruši s greškama.

Na kraju sam uspeo da ispravim greške u izgradnji: registrovao sam biblioteku ne u pom.xml, već u manifest.mf manifestu, kako zahteva OSGI, navodeći je kao import-package. Nije najljepše rješenje, ali funkcionira. Tada se pojavilo sljedeće iznenađenje. Ako razvijate u Intellij Idea, ne možete jednostavno otići i započeti otklanjanje grešaka u svom projektu zasnovanom na eclipse platformi: neiskusni programer bi trebao patiti ništa manje od analitičara bez dovršavanja upita. U pomoć su priskočili sami programeri dabrova, koji su na wikiju naznačili sve plesove s tamburom koje je potrebno izvesti. Najneugodnije je to što ni nakon svih ovih skvotova, projekat nije želio da se pokrene u debug-u sa json bibliotekom povezanom preko import-paketa (uprkos činjenici da je još uvijek uspješno montiran u gotov proizvod).

Do tada sam već shvatio neugodnost korištenja json-a za svoj zadatak - na kraju krajeva, metapodaci su trebali biti uređivani ručno, a format xml je za to bolje prilagođen. Drugi argument u korist xml-a je prisustvo svih potrebnih klasa u JDK-u, što je omogućilo prestanak borbe sa eksternom bibliotekom. Sa velikim zadovoljstvom sam prebacio sve metapodatke iz json u xml i počeo uređivati ​​logiku autocomplete.

Primjer metapodataka

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<tableRelations>
    <tableRelation>
        <leftTable>dim_account</leftTable>
        <rightTable>dim_partner</rightTable>
        <joinColumnPair leftColumn="partner_key" rightColumn="partner_key"/>
        <joinColumnPair leftColumn="src_id" rightColumn="src_id"/>
    </tableRelation>
    <tableRelation>
        <leftTable>dim_account</leftTable>
        <rightTable>dim_branch</rightTable>
        <joinColumnPair leftColumn="src_id" rightColumn="src_id"/>
        <joinColumnPair leftColumn="branch_key" rightColumn="branch_key"/>
    </tableRelation>
</tableRelations>

Kao rezultat toga, I napravio izmjene u klase SQLUtils i SQLCompletionAnalyzer. Ideja je sljedeća: ako program nije mogao pronaći odgovarajuće prijedloge za autodovršavanje koristeći osnovnu logiku, tada provjerava prisustvo mogućih spajanja pomoću eksterne xml datoteke. Sama datoteka pohranjuje parove tabela koje označavaju polja pomoću kojih te tabele treba povezati. Ograničenja u pogledu datuma tehničke valjanosti zapisa eff_dttm i exp_dttm i zastavica logičkog brisanja deleted_ind su postavljena po defaultu.

Kada su napravljene promjene u kodu, postavilo se pitanje - ko će ispuniti datoteku metapodacima? Ima puno entiteta u spremištu, skupo je sami registrovati sve veze. Kao rezultat toga, odlučio sam da ovaj zadatak dodijelim svojim kolegama analitičarima. Postavio sam datoteku metapodataka u svn, odakle se vrši preuzimanje u lokalni direktorij sa programom. Princip je sljedeći: da li se novi entitet pojavio u spremištu? Jedan analitičar unosi moguće spojeve u fajl, urezuje izmene, ostali se sami proveravaju i uživaju u radnom automatskom dovršavanju: zajednica, akumulacija znanja i sve to. Proveo radionicu o korištenju programa za kolege, napisao članak u Confluenceu - sada kompanija ima još jedan praktičniji alat.

Rad na ovoj funkciji mi je dao razumijevanje da se ne treba bojati petljati s projektima otvorenog koda - oni po pravilu imaju jasnu arhitekturu, pa će čak i osnovno poznavanje jezika biti dovoljno za eksperimente. A uz određenu dozu upornosti, moći ćete se čak i riješiti omraženih rutinskih operacija, štedeći si vrijeme za nove eksperimente.

izvor: www.habr.com

Dodajte komentar