Wie man aufhört, dasselbe zu tun

Wiederholen Sie Routineoperationen gerne immer wieder? Also ich nicht. Aber jedes Mal, wenn ich mit dem Rostelecom-Speicher im SQL-Client arbeitete, musste ich alle Verknüpfungen zwischen den Tabellen manuell registrieren. Und das, obwohl in 90 % der Fälle die Felder und Bedingungen zum Zusammenführen von Tabellen von Abfrage zu Abfrage übereinstimmen! Es scheint, dass jeder SQL-Client über Funktionen zur automatischen Vervollständigung verfügt, aber bei Speichern funktioniert dies nicht immer: Sie enthalten selten eindeutige Einschränkungen und Fremdschlüssel, um die Leistung zu verbessern, und ohne diese weiß das Programm nicht, wie Entitäten miteinander verknüpft sind andere und was es für Sie tun kann.

Wie man aufhört, dasselbe zu tun

Nachdem ich Verleugnung, Wut, Verhandlungen, Depressionen und die Annäherung an Akzeptanz durchgemacht hatte, beschloss ich – warum nicht selbst versuchen, Autofill mit Blackjack zu implementieren und es richtig zu machen? Ich verwende den in Java geschriebenen dbeaver-Client, es gibt eine Open-Source-Community-Version. Ein einfacher Plan ist ausgereift:

  1. Suchen Sie im Quellcode nach Klassen, die für die automatische Vervollständigung verantwortlich sind
  2. Leiten Sie sie weiter, um mit externen Metadaten zu arbeiten und von dort Informationen zu Verknüpfungen abzurufen
  3. ??????
  4. PROFIT

Den ersten Punkt habe ich recht schnell herausgefunden – ich habe im Bugtracker eine Aufforderung gefunden, das automatische Ausfüllen anzupassen und im zugehörigen begehen entdeckte die SQLCompletionAnalyzer-Klasse. Ich habe mir den Code angesehen und es ist das, was ich brauche. Es bleibt nur noch, es umzuschreiben, damit alles funktioniert. Ich wartete einen freien Abend ab und begann, über die Umsetzung nachzudenken. Ich habe beschlossen, Tabellenverknüpfungsregeln (Metadaten) in JSON zu schreiben. Ich hatte keine praktische Erfahrung mit diesem Format und die aktuelle Aufgabe wurde als Gelegenheit gesehen, dieses Versäumnis zu korrigieren.

Um mit JSON zu arbeiten, habe ich mich für die Verwendung der Bibliothek entschieden json-einfach von Google. Hier begannen die Überraschungen. Wie sich herausstellte, wurde dbeaver als echte Anwendung auf der Eclipse-Plattform unter Verwendung des OSGi-Frameworks geschrieben. Für erfahrene Entwickler macht es dieses Ding bequem, Abhängigkeiten zu verwalten, aber für mich war es eher wie dunkle Magie, für die ich offensichtlich nicht bereit war: Wie üblich importiere ich die Klassen, die ich benötige, aus der json-simple-Bibliothek im Header von Geben Sie die bearbeitete Klasse in pom. xml an, woraufhin das Projekt die normale Assemblierung kategorisch verweigert und mit Fehlern abstürzt.

Am Ende gelang es mir, die Build-Fehler zu beheben: Ich habe die Bibliothek nicht in pom.xml, sondern im manifest.mf-Manifest registriert, wie von OSGI gefordert, und sie gleichzeitig als Importpaket angegeben. Nicht die schönste Lösung, aber sie funktioniert. Dann kam die nächste Überraschung. Wenn Sie in Intellij Idea entwickeln, können Sie nicht einfach mit dem Debuggen Ihres Projekts auf Basis der Eclipse-Plattform beginnen: Ein unerfahrener Entwickler sollte nicht weniger leiden als ein Analyst ohne Abschluss der Abfrage. Die Beaver-Entwickler selbst kamen zu Hilfe und zeigten im Wiki alle Tänze mit einem Tamburin an, die ausgeführt werden müssen. Das Ärgerlichste ist, dass das Projekt selbst nach all diesen Kniebeugen nicht im Debugmodus mit der über das Importpaket verbundenen JSON-Bibliothek gestartet werden wollte (trotz der Tatsache, dass es immer noch erfolgreich in das fertige Produkt integriert wurde).

Zu diesem Zeitpunkt war mir bereits klar, wie unpraktisch es ist, JSON für meine Aufgabe zu verwenden – schließlich sollten die Metadaten manuell bearbeitet werden, und das XML-Format ist dafür besser geeignet. Das zweite Argument für XML war das Vorhandensein aller notwendigen Klassen im JDK, was es ermöglichte, den Kampf mit einer externen Bibliothek zu beenden. Mit großer Freude habe ich alle Metadaten von JSON nach XML übertragen und mit der Bearbeitung der Autovervollständigungslogik begonnen.

Beispiel für Metadaten

<?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>

Infolgedessen habe ich Änderungen vorgenommen in die Klassen SQLUtils und SQLCompletionAnalyzer. Die Idee dahinter ist: Konnte das Programm mit der Grundlogik keine passenden Autovervollständigungsvorschläge finden, prüft es mithilfe einer externen XML-Datei, ob mögliche Verknüpfungen vorhanden sind. Die Datei selbst speichert Tabellenpaare, die die Felder angeben, durch die diese Tabellen verknüpft werden müssen. Einschränkungen hinsichtlich der technischen Gültigkeitsdaten der Datensätze eff_dttm und exp_dttm sowie des logischen Löschkennzeichens delete_ind sind standardmäßig gesetzt.

Bei Änderungen am Code stellte sich die Frage: Wer füllt die Datei mit Metadaten? Da sich im Repository viele Entitäten befinden, ist es teuer, alle Verbindungen selbst zu registrieren. Aus diesem Grund beschloss ich, diese Aufgabe meinen Analystenkollegen zu übertragen. Ich habe die Metadatendatei in svn gepostet, von wo aus mit dem Programm ein Checkout in das lokale Verzeichnis durchgeführt wird. Das Prinzip ist folgendes: Ist eine neue Entität im Repository aufgetaucht? Ein Analyst trägt mögliche Verknüpfungen in die Datei ein, schreibt Änderungen fest, der Rest überprüft sich selbst und genießt die funktionierende automatische Vervollständigung: Community, Wissensakkumulation und so weiter. Habe einen Workshop zur Nutzung des Programms für Kollegen durchgeführt und einen Artikel in Confluence geschrieben – jetzt verfügt das Unternehmen über ein weiteres praktisches Tool.

Durch die Arbeit an dieser Funktion habe ich verstanden, dass man keine Angst haben muss, an Open-Source-Projekten herumzubasteln – sie haben in der Regel eine klare Architektur und für Experimente reichen bereits Grundkenntnisse der Sprache aus. Und mit einer gewissen Beharrlichkeit gelingt es Ihnen sogar, verhasste Routineeingriffe hinter sich zu lassen und so Zeit für neue Experimente zu sparen.

Source: habr.com

Kommentar hinzufügen