Wie man aufhört, dasselbe zu tun

Wiederholen Sie von Zeit zu Zeit Routineoperationen? Hier bin ich. Aber jedes Mal, wenn ich im SQL-Client mit dem Rostelecom-Repository arbeitete, musste ich alle Verknüpfungen zwischen den Tabellenhandles registrieren. Und das trotz der Tatsache, dass in 90% der Fälle die Felder und Bedingungen für das Verknüpfen von Tabellen von Abfrage zu Abfrage übereinstimmten! Es scheint, dass jeder SQL-Client über Funktionen zur automatischen Vervollständigung verfügt, dies funktioniert jedoch nicht immer für Speicher: Sie verfügen selten über eindeutige Einschränkungen und Fremdschlüssel, um die Leistung zu verbessern. Ohne diese Funktion kann das Programm nicht herausfinden, wie Entitäten zusammenhängen und was es für Sie tun kann vorschlagen.



Nachdem ich Verleugnung, Wut, Verhandlungen, Depressionen und die Annäherung an Akzeptanz durchgemacht hatte, entschied ich mich - warum nicht versuchen, die automatische Vervollständigung mit Blackjack selbst zu implementieren und wie es sollte? Ich benutze den in Java geschriebenen dbeaver-Client, er hat eine Open-Source-Community-Version. Ein einfacher Plan ist gereift:

  1. Suchen Sie nach Klassen für die automatische Vervollständigung im Quellcode
  2. Richten Sie sie neu aus, um mit externen Metadaten zu arbeiten und von dort Informationen zu Joins abzurufen
  3. ??????
  4. GEWINN

Ich fand schnell das erste Element heraus - ich fand eine Anforderung zum Anpassen der automatischen Füllung im Bugtracker und fand die SQLCompletionAnalyzer-Klasse im zugehörigen Commit. Ich habe mir den Code angesehen - was ich brauche. Es bleibt zu schreiben, damit alles funktioniert. Ich wartete auf einen freien Abend und begann über die Umsetzung nachzudenken. Tabellenverknüpfungsregeln (Metadaten) haben beschlossen, in json zu führen. Ich hatte keine praktischen Erfahrungen mit diesem Format und die aktuelle Aufgabe wurde als Gelegenheit gesehen, diese Lücke zu schließen.

Um mit json zu arbeiten, habe ich mich für die json-simple- Bibliothek von Google entschieden. Hier begannen Überraschungen. Wie sich herausstellte, wird dbeaver als Tru-Anwendung mit dem OSGi-Framework auf der Eclipse-Plattform geschrieben. Für erfahrene Entwickler bietet dieses Ding den Komfort des Abhängigkeitsmanagements, aber für mich war es eher wie dunkle Magie, für die ich eindeutig nicht bereit war: Wie üblich registriere ich den Import der benötigten Klassen aus der json-simple-Bibliothek im Header der bearbeiteten Klasse, ich spezifiziere ihn in pom. xml, wonach sich das Projekt kategorisch weigert, richtig zusammenzusetzen, und mit Fehlern fehlschlägt.

Infolgedessen konnten die Assemblyfehler behoben werden: Ich habe die Bibliothek nicht in pom.xml, sondern im manifest.mf-Manifest registriert, wie von OSGI gefordert, und sie als Importpaket angegeben. Nicht die schönste Lösung, aber es funktioniert. Dann erschien die nächste Überraschung. Wenn Sie in Intellij Idea entwickeln, können Sie Ihr Projekt nicht einfach auf der Basis der Eclipse-Plattform starten und debuggen: Ein unerfahrener Entwickler sollte nicht weniger als ein Analyst leiden, ohne Anforderungen automatisch zu vervollständigen. Die Biberentwickler selbst kamen zur Rettung und zeigten im Wiki alle Tänze mit einem Tamburin an, die gemacht werden müssen. Das nervigste ist, dass das Projekt auch nach all diesen Kniebeugen nicht in einem Debugging mit der über das Importpaket verbundenen JSON-Bibliothek beginnen wollte (obwohl es immer noch erfolgreich zum fertigen Produkt zusammengesetzt wurde).

Zu diesem Zeitpunkt hatte ich das Gefühl, dass es unangenehm ist, json für meine Aufgabe zu verwenden - schließlich sollten die Metadaten manuell bearbeitet werden, und dafür ist das XML-Format besser geeignet. Das zweite Argument für XML war das Vorhandensein aller erforderlichen Klassen im JDK, wodurch es möglich wurde, den Kampf mit einer externen Bibliothek einzustellen. Mit großer Freude habe ich alle Metadaten von json nach xml übertragen und die Autocomplete-Logik bearbeitet.

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 an den Klassen SQLUtils und SQLCompletionAnalyzer vorgenommen. Die Idee ist folgende: Wenn das Programm keine geeigneten Sätze für die automatische Vervollständigung gemäß der Grundlogik gefunden hat, prüft es mithilfe einer externen XML-Datei, ob Verknüpfungen möglich sind. Die Datei selbst enthält Tabellenpaare, die die Felder angeben, mit denen diese Tabellen verknüpft werden müssen. Standardmäßig sind Einschränkungen der technischen Gültigkeitsdaten der Einträge eff_dttm und exp_dttm sowie des logischen Löschflags deleted_ind festgelegt.

Als Änderungen am Code vorgenommen wurden, stellte sich die Frage: Wer füllt die Metadatendatei? Es gibt viele Entitäten im Repository, es ist unrentabel, alle Verbindungen selbst zu registrieren. Am Ende habe ich beschlossen, diese Aufgabe meinen Analystenkollegen aufzuhängen. Die Metadatendatei wurde auf svn hochgeladen, von wo aus mit dem Programm in einem lokalen Verzeichnis ausgecheckt wird. Das Prinzip lautet: Eine neue Entität ist im Repository erschienen? Ein Analyst ermöglicht das Verknüpfen einer Datei, schreibt Änderungen fest, der Rest führt Check-outs für sich selbst durch und arbeitet gerne automatisch: Community, Wissensakkumulation und all das. Hielt einen Workshop für Kollegen über die Verwendung des Programms ab, schrieb einen Artikel in Konfluenz - jetzt hat das Unternehmen mehr als ein praktisches Werkzeug.

Die Arbeit an dieser Funktion gab mir das Verständnis, dass man keine Angst haben sollte, Open-Source-Projekte auszuwählen - in der Regel haben sie eine klare Architektur, und selbst Grundkenntnisse der Sprache werden für Experimente ausreichen. Und mit einem gewissen Maß an Ausdauer können Sie sogar die verhassten Routineoperationen loswerden und sich Zeit für neue Experimente sparen.

Source: https://habr.com/ru/post/de462021/


All Articles