Bagaimana cara berhenti melakukan hal yang sama

Apakah Anda suka mengulangi operasi rutin berulang kali? Jadi saya tidak melakukannya. Tetapi setiap kali di klien SQL saat bekerja dengan penyimpanan Rostelecom, saya harus mendaftarkan semua gabungan antar tabel secara manual. Dan ini terlepas dari kenyataan bahwa dalam 90% kasus, bidang dan ketentuan untuk menggabungkan tabel bertepatan dari satu permintaan ke permintaan lainnya! Tampaknya setiap klien SQL memiliki fungsi pelengkapan otomatis, tetapi untuk penyimpanan itu tidak selalu berfungsi: mereka jarang menyertakan batasan unik dan kunci asing untuk meningkatkan kinerja, dan tanpa ini program tidak akan mengetahui bagaimana entitas terkait satu sama lain. lainnya dan apa manfaatnya bagi Anda.

Bagaimana cara berhenti melakukan hal yang sama

Setelah melalui penolakan, kemarahan, tawar-menawar, depresi, dan semakin dekat dengan penerimaan, saya memutuskan - mengapa tidak mencoba menerapkan pengisian otomatis dengan blackjack sendiri dan melakukannya dengan cara yang benar? Saya menggunakan klien dbeaver, ditulis dalam java, memiliki versi komunitas open source. Sebuah rencana sederhana telah matang:

  1. Temukan kelas dalam kode sumber yang bertanggung jawab untuk pelengkapan otomatis
  2. Arahkan mereka untuk bekerja dengan metadata eksternal dan ambil informasi tentang gabungan dari sana
  3. ??????
  4. LABA

Saya menemukan poin pertama dengan cukup cepat - saya menemukan permintaan di pelacak bug untuk menyesuaikan pengisian otomatis dan yang terkait melakukan menemukan kelas SQLCompletionAnalyzer. Saya melihat kodenya dan itulah yang saya butuhkan. Yang tersisa hanyalah menulis ulang agar semuanya berfungsi. Saya menunggu malam gratis dan mulai memikirkan implementasinya. Saya memutuskan untuk menulis aturan tautan tabel (metadata) di json. Saya tidak memiliki pengalaman praktis bekerja dengan format ini dan tugas saat ini dipandang sebagai peluang untuk memperbaiki kelalaian ini.

Untuk bekerja dengan json saya memutuskan untuk menggunakan perpustakaan json-sederhana dari Google. Di sinilah kejutan dimulai. Ternyata, dbeaver, sebagai aplikasi sebenarnya, ditulis pada platform Eclipse menggunakan kerangka OSGi. Untuk pengembang berpengalaman, hal ini memudahkan untuk mengelola dependensi, tetapi bagi saya ini lebih seperti ilmu hitam, yang jelas-jelas saya belum siap: seperti biasa, saya mengimpor kelas yang saya perlukan dari perpustakaan json-simple di header dari kelas yang diedit, tentukan di pom.xml, setelah itu proyek dengan tegas menolak untuk berkumpul secara normal dan macet karena kesalahan.

Pada akhirnya, saya berhasil memperbaiki kesalahan build: Saya mendaftarkan perpustakaan bukan di pom.xml, tetapi di manifes manifest.mf, seperti yang disyaratkan oleh OSGI, sambil menetapkannya sebagai paket impor. Bukan solusi yang paling indah, tapi berhasil. Lalu kejutan berikutnya pun muncul. Jika Anda mengembangkan di Intellij Idea, Anda tidak bisa langsung mulai men-debug proyek Anda berdasarkan platform gerhana: pengembang yang tidak berpengalaman akan menderita seperti seorang analis yang tidak menyelesaikan kueri. Pengembang berang-berang sendiri datang untuk menyelamatkan, menunjukkan di wiki semua tarian dengan rebana yang perlu dilakukan. Hal yang paling menjengkelkan adalah bahkan setelah semua squat ini, proyek tidak ingin diluncurkan dalam debug dengan perpustakaan json yang terhubung melalui paket impor (terlepas dari kenyataan bahwa proyek tersebut masih berhasil dirakit menjadi produk jadi).

Pada saat itu, saya sudah menyadari ketidaknyamanan menggunakan json untuk tugas saya - lagipula, metadata seharusnya diedit secara manual, dan format xml lebih cocok untuk ini. Argumen kedua yang mendukung xml adalah kehadiran semua kelas yang diperlukan di JDK, yang memungkinkan untuk berhenti berkelahi dengan perpustakaan eksternal. Dengan senang hati, saya mentransfer semua metadata dari json ke xml dan mulai mengedit logika pelengkapan otomatis.

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. Idenya adalah ini: jika program tidak dapat menemukan saran pelengkapan otomatis yang sesuai menggunakan logika dasar, maka program akan memeriksa kemungkinan penggabungan menggunakan file xml eksternal. File itu sendiri menyimpan pasangan tabel yang menunjukkan bidang yang perlu dihubungkan dengan tabel-tabel ini. Pembatasan tanggal validitas teknis catatan eff_dttm dan exp_dttm serta tanda penghapusan logis delete_ind ditetapkan secara default.

Ketika perubahan dilakukan pada kode, muncul pertanyaan - siapa yang akan mengisi file dengan metadata? Ada banyak entitas di repositori, mahal untuk mendaftarkan semua koneksi sendiri. Oleh karena itu, saya memutuskan untuk menugaskan tugas ini kepada rekan analis saya. Saya memposting file metadata di svn, dari mana checkout dilakukan ke direktori lokal dengan program tersebut. Prinsipnya begini: apakah ada entitas baru yang muncul di repositori? Seorang analis memasukkan kemungkinan gabungan ke dalam file, melakukan perubahan, sisanya memeriksa sendiri dan menikmati penyelesaian otomatis yang berfungsi: komunitas, akumulasi pengetahuan, dan sebagainya. Mengadakan lokakarya tentang penggunaan program untuk rekan kerja, menulis artikel di Confluence - sekarang perusahaan memiliki alat lain yang nyaman.

Mengerjakan fitur ini memberi saya pemahaman bahwa tidak perlu takut untuk mengutak-atik proyek sumber terbuka - sebagai aturan, mereka memiliki arsitektur yang jelas, dan bahkan pengetahuan dasar bahasa saja sudah cukup untuk bereksperimen. Dan dengan ketekunan tertentu, Anda bahkan akan mampu menyingkirkan operasi rutin yang dibenci, sehingga menghemat waktu untuk eksperimen baru.

Sumber: www.habr.com

Tambah komentar