Bagaimana untuk berhenti melakukan perkara yang sama

Adakah anda suka mengulang operasi rutin berulang kali? Jadi saya tidak. Tetapi setiap kali dalam klien SQL apabila bekerja dengan storan Rostelecom, saya perlu mendaftarkan semua sambungan antara jadual secara manual. Dan ini walaupun fakta bahawa dalam 90% kes medan dan syarat untuk menyertai jadual bertepatan dari permintaan untuk meminta! Nampaknya mana-mana klien SQL mempunyai fungsi auto-lengkap, tetapi untuk storan ia tidak selalu berfungsi: mereka jarang memasukkan kekangan unik dan kunci asing untuk meningkatkan prestasi, dan tanpa ini program tidak akan mengetahui bagaimana entiti berkaitan dengan setiap lain dan perkara yang ia boleh lakukan untuk anda tawarkan.

Bagaimana untuk berhenti melakukan perkara yang sama

Setelah melalui penafian, kemarahan, tawar-menawar, kemurungan dan menghampiri penerimaan, saya memutuskan - mengapa tidak cuba untuk melaksanakan autoisi dengan blackjack sendiri dan melakukannya dengan cara yang betul? Saya menggunakan klien dbeaver, yang ditulis dalam java, ia mempunyai versi komuniti sumber terbuka. Pelan mudah telah matang:

  1. Cari kelas dalam kod sumber yang bertanggungjawab untuk autolengkap
  2. Ubah hala mereka untuk bekerja dengan metadata luaran dan tarik maklumat tentang gabungan dari sana
  3. ??
  4. KEUNTUNGAN

Saya mengetahui perkara pertama dengan cepat - saya menemui permintaan dalam penjejak pepijat untuk melaraskan autolengkap dan dalam yang berkaitan komited menemui kelas SQLCompletionAnalyzer. Saya melihat kod itu dan itulah yang saya perlukan. Yang tinggal hanyalah menulis semula supaya semuanya berfungsi. Saya menunggu malam percuma dan mula memikirkan pelaksanaannya. Saya memutuskan untuk menulis peraturan pautan jadual (metadata) dalam json. Saya tidak mempunyai pengalaman praktikal bekerja dengan format ini dan tugas semasa dilihat sebagai peluang untuk membetulkan peninggalan ini.

Untuk bekerja dengan json saya memutuskan untuk menggunakan perpustakaan json-simple daripada Google. Di sinilah kejutan bermula. Ternyata, dbeaver, sebagai aplikasi sebenar, telah ditulis pada platform Eclipse menggunakan rangka kerja OSGi. Bagi pembangun yang berpengalaman, perkara ini memudahkan untuk menguruskan kebergantungan, tetapi bagi saya ia lebih seperti sihir gelap, yang jelas saya tidak bersedia: seperti biasa, saya mengimport kelas yang saya perlukan dari perpustakaan json-simple dalam pengepala kelas yang disunting, nyatakan dalam pom. xml, selepas itu projek secara kategori enggan dipasang seperti biasa dan ranap dengan ralat.

Akhirnya, saya berjaya membetulkan ralat binaan: Saya mendaftarkan perpustakaan bukan dalam pom.xml, tetapi dalam manifes manifest.mf, seperti yang dikehendaki oleh OSGI, sambil menyatakannya sebagai pakej import. Bukan penyelesaian yang paling indah, tetapi ia berfungsi. Kemudian kejutan seterusnya muncul. Jika anda sedang membangun dalam Intellij Idea, anda tidak boleh pergi dan mula menyahpepijat projek anda berdasarkan platform eclipse: pembangun yang tidak berpengalaman harus menderita tidak kurang daripada seorang penganalisis tanpa menyelesaikan pertanyaan. Pembangun memerang sendiri datang untuk menyelamatkan, menunjukkan dalam wiki semua tarian dengan tamborin yang perlu dilakukan. Perkara yang paling menjengkelkan ialah walaupun selepas semua squats ini, projek itu tidak mahu dilancarkan dalam nyahpepijat dengan perpustakaan json yang disambungkan melalui pakej import (walaupun hakikatnya ia masih berjaya dipasang ke dalam produk siap).

Pada masa itu, saya sudah menyedari kesulitan menggunakan json untuk tugas saya - lagipun, metadata sepatutnya diedit secara manual, dan format xml lebih sesuai untuk ini. Hujah kedua yang memihak kepada xml ialah kehadiran semua kelas yang diperlukan dalam JDK, yang memungkinkan untuk berhenti berjuang dengan perpustakaan luaran. Dengan sukacitanya, saya memindahkan semua metadata dari json ke xml dan mula mengedit logik autolengkap.

Contoh metadata

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

Akibatnya saya melakukan perubahan ke dalam kelas SQLUtils dan SQLCompletionAnalyzer. Ideanya ialah ini: jika program tidak dapat mencari cadangan autolengkap yang sesuai menggunakan logik asas, maka ia menyemak kehadiran kemungkinan gabungan menggunakan fail xml luaran. Fail itu sendiri menyimpan pasangan jadual yang menunjukkan medan yang mana jadual ini perlu dipautkan. Sekatan pada tarikh kesahan teknikal rekod eff_dttm dan exp_dttm dan bendera pemadaman logik deleted_ind ditetapkan secara lalai.

Apabila perubahan dibuat pada kod, persoalan timbul - siapa yang akan mengisi fail dengan metadata? Terdapat banyak entiti dalam repositori, mahal untuk mendaftarkan semua sambungan sendiri. Akibatnya, saya memutuskan untuk menyerahkan tugas ini kepada rakan penganalisis saya. Saya menyiarkan fail metadata dalam svn, dari mana pembayaran dibuat ke direktori tempatan dengan program. Prinsipnya ialah: adakah entiti baharu telah muncul dalam repositori? Seorang penganalisis memasukkan kemungkinan gabungan ke dalam fail, melakukan perubahan, selebihnya menyemak sendiri dan menikmati pelengkapan automatik yang berfungsi: komuniti, pengumpulan pengetahuan dan semua itu. Menjalankan bengkel menggunakan program untuk rakan sekerja, menulis artikel di Confluence - kini syarikat itu mempunyai satu alat yang lebih mudah.

Mengusahakan ciri ini memberi saya pemahaman bahawa tidak perlu takut untuk bermain-main dengan projek sumber terbuka - sebagai peraturan, mereka mempunyai seni bina yang jelas, malah pengetahuan asas bahasa akan mencukupi untuk eksperimen. Dan dengan jumlah kegigihan tertentu, anda juga akan dapat menyingkirkan operasi rutin yang dibenci, menjimatkan masa anda untuk eksperimen baharu.

Sumber: www.habr.com

Tambah komen