Aynı şeyi yapmayı nasıl bırakabilirim?

Rutin işlemleri defalarca tekrarlamayı sever misiniz? Yani istemiyorum. Ancak SQL istemcisinde Rostelecom depolama alanıyla her çalışırken, tablolar arasındaki tüm birleştirmeleri manuel olarak kaydetmem gerekiyordu. Ve bu, vakaların %90'ında tabloları birleştirmeye yönelik alan ve koşulların sorgudan sorguya çakışmasına rağmen! Görünüşe göre herhangi bir SQL istemcisinde otomatik tamamlama işlevleri vardır, ancak depolar için bu her zaman işe yaramaz: performansı artırmak için nadiren benzersiz kısıtlama ve yabancı anahtar içerirler ve bu olmadan program, varlıkların her biriyle nasıl ilişkili olduğunu bilemez. diğer ve sizin için neler yapabileceğini sunuyoruz.

Aynı şeyi yapmayı nasıl bırakabilirim?

İnkar, öfke, pazarlık, depresyon ve yaklaşan kabullenme sürecinden geçtikten sonra karar verdim - neden blackjack ile otomatik doldurmayı kendim uygulamaya çalışmıyorum ve bunu doğru şekilde yapmıyorum? Java ile yazılmış dbeaver istemcisini kullanıyorum, açık kaynaklı bir topluluk sürümüne sahip. Basit bir plan olgunlaştı:

  1. Kaynak kodunda otomatik tamamlamadan sorumlu sınıfları bulun
  2. Onları harici meta verilerle çalışmaya yönlendirin ve oradan birleştirmelerle ilgili bilgileri çekin
  3. ???
  4. KAR

İlk noktayı oldukça hızlı bir şekilde çözdüm - hata izleyicide otomatik doldurmayı ayarlamaya yönelik bir istek buldum ve ilgili işlemek SQLCompletionAnalyzer sınıfını keşfetti. Koda baktım ve ihtiyacım olan şey bu. Geriye kalan tek şey, her şeyin işe yaraması için onu yeniden yazmaktır. Boş bir akşamı bekledim ve uygulama üzerinde düşünmeye başladım. Tablo bağlantı kurallarını (meta verileri) json'da yazmaya karar verdim. Bu formatla çalışma konusunda hiçbir pratik deneyimim yoktu ve mevcut görev, bu ihmali düzeltmek için bir fırsat olarak görüldü.

Json ile çalışmak için kütüphaneyi kullanmaya karar verdim json-basit Google'dan. İşte sürprizler de burada başladı. Gerçek bir uygulama olarak dbeaver'ın OSGi çerçevesi kullanılarak Eclipse platformunda yazıldığı ortaya çıktı. Deneyimli geliştiriciler için bu şey bağımlılıkları yönetmeyi kolaylaştırıyor, ancak benim için bu daha çok kara büyü gibiydi ve buna açıkça hazır değildim: her zamanki gibi, ihtiyacım olan sınıfları başlığındaki json-simple kütüphanesinden içe aktarıyorum. Düzenlenen sınıfı pom.xml'de belirtin, ardından proje kategorik olarak normal şekilde toplanmayı reddeder ve hatalarla çöker.

Sonunda derleme hatalarını düzeltmeyi başardım: Kitaplığı pom.xml dosyasına değil, manifest.mf manifest dosyasına, OSGI'nin gerektirdiği şekilde, içe aktarma paketi olarak belirterek kaydettim. En güzel çözüm değil ama işe yarıyor. Sonra bir sonraki sürpriz ortaya çıktı. Intellij Idea'da geliştirme yapıyorsanız, Eclipse platformuna dayalı olarak projenizde hata ayıklamaya başlayamazsınız: deneyimsiz bir geliştirici, sorgu tamamlamayan bir analistten daha az sıkıntı çekmeyecektir. Kunduz geliştiricileri, wiki'de yapılması gereken tüm dansları tef ile belirterek kurtarmaya geldiler. En can sıkıcı şey, tüm bu işgallerden sonra bile projenin, içe aktarma paketi aracılığıyla bağlanan json kütüphanesiyle hata ayıklamada başlatılmak istememesidir (yine de bitmiş ürüne başarıyla monte edilmiş olmasına rağmen).

O zamana kadar, görevim için json kullanmanın zorluğunu zaten fark etmiştim - sonuçta meta verilerin manuel olarak düzenlenmesi gerekiyordu ve xml formatı bunun için daha uygun. Xml lehine ikinci argüman, JDK'da gerekli tüm sınıfların bulunmasıydı ve bu, harici bir kütüphaneyle mücadeleyi durdurmayı mümkün kıldı. Büyük bir keyifle json'dan xml'e tüm metadata'yı aktardım ve otomatik tamamlama mantığını düzenlemeye başladım.

Meta veri örneği

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

Sonuç olarak ben değişiklikler yapıldı SQLUtils ve SQLCompletionAnalyzer sınıflarına. Buradaki fikir şudur: Eğer program temel mantığı kullanarak uygun otomatik tamamlama önerilerini bulamazsa, harici bir xml dosyası kullanarak olası birleştirmelerin varlığını kontrol eder. Dosyanın kendisi, bu tabloların bağlanması gereken alanları gösteren tablo çiftlerini saklar. eff_dttm ve exp_dttm kayıtlarının teknik geçerlilik tarihlerine ve silinen_ind mantıksal silme işaretine ilişkin kısıtlamalar varsayılan olarak ayarlanır.

Kodda değişiklikler yapıldığında şu soru ortaya çıktı: dosyayı meta verilerle kim dolduracak? Depoda çok sayıda varlık var, tüm bağlantıları kendiniz kaydetmek pahalıdır. Sonuç olarak bu görevi analist arkadaşlarıma devretmeye karar verdim. Meta veri dosyasını svn'ye gönderdim, buradan programla yerel dizine bir ödeme yapıldı. Prensip şudur: Depoda yeni bir varlık mı ortaya çıktı? Bir analist dosyaya olası birleştirmeleri girer, değişiklikleri taahhüt eder, geri kalanı kendi kendilerine kontrol eder ve çalışan otomatik tamamlamanın tadını çıkarır: topluluk, bilgi birikimi ve tüm bunlar. Programın meslektaşları için kullanımına ilişkin bir atölye çalışması düzenledi, Confluence'da bir makale yazdı - artık şirketin bir kullanışlı aracı daha var.

Bu özellik üzerinde çalışmak bana açık kaynaklı projelerle uğraşmaktan korkmaya gerek olmadığı anlayışını kazandırdı - kural olarak net bir mimariye sahipler ve hatta temel dil bilgisi bile deneyler için yeterli olacak. Ve belli bir miktar ısrarla, nefret ettiğiniz rutin işlemlerden bile kurtulabilecek ve yeni deneyler için kendinize zaman kazandırabileceksiniz.

Kaynak: habr.com

Yorum ekle