Aimez-vous rĂ©pĂ©ter les opĂ©rations de routine de temps en temps? Me voici. Mais Ă chaque fois dans le client SQL lorsque je travaillais avec le rĂ©fĂ©rentiel Rostelecom, je devais enregistrer toutes les jointures entre les poignĂ©es des tables. Et cela malgrĂ© le fait que dans 90% des cas les champs et conditions de jonction des tables coĂŻncidaient de requĂȘte en requĂȘte! Il semblerait que tout client SQL possĂšde des fonctions de saisie semi-automatique, mais cela ne fonctionne pas toujours pour les stockages: ils ont rarement une contrainte unique et une clĂ© Ă©trangĂšre afin d'amĂ©liorer les performances, et sans cela, le programme ne peut pas savoir comment les entitĂ©s sont liĂ©es et ce qu'il peut faire pour vous. suggĂ©rer.

Ayant traversĂ© le dĂ©ni, la colĂšre, les nĂ©gociations, la dĂ©pression et l'approche de l'acceptation, j'ai dĂ©cidĂ© - pourquoi ne pas essayer de mettre en Ćuvre l'auto-complĂ©tion avec le blackjack moi-mĂȘme et comme il se doit? J'utilise le client dbeaver Ă©crit en java, il a une version communautaire open source. Un plan simple a mĂ»ri:
- Rechercher des classes de saisie semi-automatique dans le code source
- RĂ©orientez-les pour travailler avec des mĂ©tadonnĂ©es externes et extraire des informations sur les jointures Ă partir de lĂ
- ??????
- PROFIT
J'ai rapidement trouvĂ© le premier Ă©lĂ©ment - j'ai trouvĂ© une demande d'ajustement de la saisie automatique dans le bugtracker et j'ai trouvĂ© la classe SQLCompletionAnalyzer dans le commit associĂ©. J'ai regardĂ© le code - ce dont j'ai besoin. Il reste Ă le réécrire pour que tout fonctionne. J'ai attendu une soirĂ©e libre et j'ai commencĂ© Ă rĂ©flĂ©chir Ă la mise en Ćuvre. Les rĂšgles de liaison de table (mĂ©tadonnĂ©es) ont dĂ©cidĂ© de conduire dans json. Je n'avais aucune expĂ©rience pratique de ce format et la tĂąche en cours Ă©tait considĂ©rĂ©e comme une opportunitĂ© de corriger cette omission.
Pour travailler avec json, j'ai décidé d'utiliser la bibliothÚque
json-simple de Google. Ici les surprises ont commencĂ©. Il s'est avĂ©rĂ© que dbeaver, en tant qu'application tru, est Ă©crit sur la plateforme eclipse en utilisant le framework OSGi. Pour les dĂ©veloppeurs expĂ©rimentĂ©s, cette chose donne la commoditĂ© de la gestion des dĂ©pendances, mais pour moi, cela ressemblait plus Ă de la magie noire, pour laquelle je n'Ă©tais clairement pas prĂȘt: comme d'habitude, j'enregistre l'importation des classes dont j'ai besoin depuis la bibliothĂšque json-simple dans l'en-tĂȘte de la classe Ă©ditĂ©e, je le spĂ©cifie dans pom. xml, aprĂšs quoi le projet refuse catĂ©goriquement de se rĂ©unir correctement et Ă©choue avec des erreurs.
En consĂ©quence, nous avons rĂ©ussi Ă corriger les erreurs d'assembly: j'ai enregistrĂ© la bibliothĂšque non pas dans pom.xml, mais dans le manifeste manifest.mf, comme requis par OSGI, tout en la spĂ©cifiant en tant que package d'importation. Pas la plus belle solution, mais ça marche. Puis la prochaine surprise est apparue. Si vous dĂ©veloppez dans intellij idea, vous ne pouvez pas simplement obtenir et exĂ©cuter le dĂ©bogage de votre projet basĂ© sur la plate-forme Eclipse: un dĂ©veloppeur inexpĂ©rimentĂ© ne devrait pas souffrir au moins un analyste sans autocomplĂ©tion des demandes. Les dĂ©veloppeurs de castors eux-mĂȘmes sont venus Ă la rescousse, indiquant dans le wiki toutes les danses avec un tambourin Ă faire. Le plus ennuyeux est que, mĂȘme aprĂšs tous ces squats, le projet ne voulait pas dĂ©marrer en dĂ©bogage avec la bibliothĂšque json connectĂ©e via import-package (malgrĂ© le fait qu'il soit toujours assemblĂ© avec succĂšs dans le produit fini).
Ă ce moment-lĂ , j'ai rĂ©ussi Ă ressentir l'inconvĂ©nient d'utiliser json pour ma tĂąche - aprĂšs tout, les mĂ©tadonnĂ©es Ă©taient censĂ©es ĂȘtre modifiĂ©es manuellement, et pour cela, le format xml est mieux adaptĂ©. Le deuxiĂšme argument en faveur de xml Ă©tait la prĂ©sence dans le JDK de toutes les classes nĂ©cessaires, ce qui a permis d'arrĂȘter de se battre avec une bibliothĂšque externe. Avec grand plaisir, j'ai transfĂ©rĂ© toutes les mĂ©tadonnĂ©es de json vers xml et j'ai procĂ©dĂ© Ă l'Ă©dition de la logique de saisie semi-automatique.
Exemple de métadonnées<?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>
Par conséquent, j'ai
apportĂ© des modifications aux classes SQLUtils et SQLCompletionAnalyzer. L'idĂ©e est la suivante: si le programme n'a pas rĂ©ussi Ă trouver des phrases d'auto-complĂ©tion appropriĂ©es selon la logique de base, il vĂ©rifie les jointures possibles Ă l'aide d'un fichier xml externe. Le fichier lui-mĂȘme contient des paires de tables indiquant les champs par lesquels ces tables doivent ĂȘtre liĂ©es. Les restrictions sur les dates de validitĂ© technique des entrĂ©es eff_dttm et exp_dttm et l'indicateur de suppression logique supprimĂ©_ind sont dĂ©finis par dĂ©faut.
Lorsque des modifications ont Ă©tĂ© apportĂ©es au code, la question s'est posĂ©e - qui remplira le fichier de mĂ©tadonnĂ©es? Il y a beaucoup d'entitĂ©s dans le rĂ©fĂ©rentiel; il n'est pas rentable d'enregistrer toutes les connexions vous-mĂȘme. Finalement, j'ai dĂ©cidĂ© de suspendre cette tĂąche Ă mes collĂšgues analystes. Le fichier de mĂ©tadonnĂ©es a Ă©tĂ© tĂ©lĂ©chargĂ© sur svn, d'oĂč les extractions sont effectuĂ©es dans un rĂ©pertoire local avec le programme. Le principe est le suivant: une nouvelle entitĂ© est apparue dans le rĂ©fĂ©rentiel? Un analyste rend possible les jointures Ă un fichier, valide les modifications, les autres effectuent des vĂ©rifications pour eux-mĂȘmes et aiment travailler la saisie semi-automatique: communautĂ©, accumulation de connaissances et tout cela. Tenu un atelier pour les collĂšgues sur l'utilisation du programme, a Ă©crit un article en confluence - maintenant, la sociĂ©tĂ© a plus d'un outil pratique.
Le travail sur cette fonctionnalitĂ© m'a permis de comprendre qu'il ne fallait pas avoir peur de choisir des projets open source - en rĂšgle gĂ©nĂ©rale, ils ont une architecture claire, et mĂȘme une connaissance de base du langage suffira pour les expĂ©riences. Et avec un certain degrĂ© de persĂ©vĂ©rance, vous pouvez mĂȘme vous dĂ©barrasser des opĂ©rations de routine dĂ©testĂ©es, vous Ă©pargnant du temps pour de nouvelles expĂ©riences.