Làm thế nào để ngừng làm điều tương tự

Bạn có muốn lặp đi lặp lại các hoạt động thường ngày không? Vì vậy, tôi không. Nhưng mỗi lần làm việc với bộ lưu trữ Rostelecom trong máy khách SQL, tôi phải đăng ký tất cả các kết nối giữa các bảng theo cách thủ công. Và điều này bất chấp thực tế là trong 90% trường hợp, các trường và điều kiện để nối các bảng trùng khớp giữa các truy vấn! Có vẻ như bất kỳ máy khách SQL nào cũng có chức năng tự động hoàn thành, nhưng đối với các kho lưu trữ, nó không phải lúc nào cũng hoạt động: chúng hiếm khi bao gồm ràng buộc duy nhất và khóa ngoại để cải thiện hiệu suất và nếu không có chức năng này, chương trình sẽ không biết các thực thể có liên quan với nhau như thế nào khác và những gì nó có thể làm cho bạn.

Làm thế nào để ngừng làm điều tương tự

Sau khi trải qua sự từ chối, tức giận, mặc cả, trầm cảm và sắp chấp nhận, tôi quyết định - tại sao không thử tự mình thực hiện tính năng tự động điền bằng blackjack và thực hiện đúng cách? Tôi sử dụng ứng dụng khách dbeaver, được viết bằng java, nó có phiên bản cộng đồng nguồn mở. Một kế hoạch đơn giản đã trưởng thành:

  1. Tìm các lớp trong mã nguồn chịu trách nhiệm tự động hoàn thành
  2. Chuyển hướng chúng để làm việc với siêu dữ liệu bên ngoài và lấy thông tin về các phép nối từ đó
  3. ??
  4. LỢI NHUẬN

Tôi đã tìm ra điểm đầu tiên khá nhanh - tôi tìm thấy yêu cầu trong trình theo dõi lỗi để điều chỉnh tính năng tự động điền và trong phần liên quan làm đã phát hiện ra lớp SQLCompletionAnalyzer. Tôi đã xem mã và đó là thứ tôi cần. Tất cả những gì còn lại là viết lại nó để mọi thứ hoạt động. Tôi đợi một buổi tối rảnh rỗi và bắt đầu suy nghĩ về việc thực hiện. Tôi quyết định viết quy tắc liên kết bảng (siêu dữ liệu) trong json. Tôi chưa có kinh nghiệm thực tế khi làm việc với định dạng này và nhiệm vụ hiện tại được coi là cơ hội để sửa chữa thiếu sót này.

Để làm việc với json tôi quyết định sử dụng thư viện json-đơn giản từ Google. Đây là nơi những điều bất ngờ bắt đầu. Hóa ra, dbeaver, với tư cách là một ứng dụng thực sự, đã được viết trên nền tảng Eclipse bằng khung OSGi. Đối với các nhà phát triển có kinh nghiệm, điều này giúp việc quản lý các phần phụ thuộc trở nên thuận tiện, nhưng đối với tôi, nó giống như ma thuật đen tối hơn, mà rõ ràng là tôi chưa sẵn sàng: như thường lệ, tôi nhập các lớp tôi cần từ thư viện json-simple vào tiêu đề của lớp đã chỉnh sửa, chỉ định nó trong pom.xml, sau đó dự án sẽ từ chối tập hợp bình thường và gặp lỗi.

Cuối cùng, tôi đã cố gắng sửa các lỗi xây dựng: Tôi đã đăng ký thư viện không phải trong pom.xml mà trong tệp kê khaiManifest.mf, theo yêu cầu của OSGI, đồng thời chỉ định nó là gói nhập. Không phải là giải pháp đẹp nhất, nhưng nó hoạt động. Thế rồi bất ngờ tiếp theo xuất hiện. Nếu bạn đang phát triển trong Intellij Idea, bạn không thể bắt đầu gỡ lỗi dự án của mình dựa trên nền tảng nhật thực: một nhà phát triển thiếu kinh nghiệm sẽ phải chịu đựng không kém một nhà phân tích nếu không hoàn thành truy vấn. Chính các nhà phát triển hải ly đã đến giải cứu, chỉ ra trong wiki tất cả các điệu nhảy với tambourine cần phải thực hiện. Điều khó chịu nhất là ngay cả sau tất cả những lần squat này, dự án vẫn không muốn được khởi chạy ở chế độ gỡ lỗi với thư viện json được kết nối qua import-package (mặc dù thực tế là nó vẫn được lắp ráp thành công thành sản phẩm hoàn chỉnh).

Vào thời điểm đó, tôi đã nhận ra sự bất tiện khi sử dụng json cho nhiệm vụ của mình - xét cho cùng, siêu dữ liệu lẽ ra phải được chỉnh sửa thủ công và định dạng xml phù hợp hơn cho việc này. Đối số thứ hai ủng hộ xml là sự hiện diện của tất cả các lớp cần thiết trong JDK, điều này giúp bạn có thể ngừng đấu tranh với thư viện bên ngoài. Tôi rất vui mừng khi chuyển tất cả siêu dữ liệu từ json sang xml và bắt đầu chỉnh sửa logic tự động hoàn thành.

Ví dụ về siêu dữ liệu

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

Kết quả là tôi thực hiện thay đổi vào các lớp SQLUtils và SQLCompletionAnalyzer. Ý tưởng là thế này: nếu chương trình không thể tìm thấy các đề xuất tự động hoàn thành phù hợp bằng cách sử dụng logic cơ bản thì nó sẽ kiểm tra sự hiện diện của các phép nối có thể có bằng cách sử dụng tệp xml bên ngoài. Bản thân tệp lưu trữ các cặp bảng cho biết các trường mà các bảng này cần được liên kết. Các hạn chế về ngày hiệu lực kỹ thuật của các bản ghi eff_dttm và exp_dttm cũng như cờ xóa logic đã xóa_ind được đặt theo mặc định.

Khi các thay đổi được thực hiện đối với mã, câu hỏi đặt ra - ai sẽ điền siêu dữ liệu vào tệp? Có rất nhiều thực thể trong kho lưu trữ, việc tự mình đăng ký tất cả các kết nối sẽ rất tốn kém. Do đó, tôi quyết định giao nhiệm vụ này cho các nhà phân tích đồng nghiệp của mình. Tôi đã đăng tệp siêu dữ liệu trong svn, từ đó việc kiểm tra được thực hiện vào thư mục cục bộ của chương trình. Nguyên tắc là thế này: thực thể mới có xuất hiện trong kho không? Một nhà phân tích nhập các kết nối có thể có vào tệp, cam kết các thay đổi, những người còn lại tự kiểm tra và tận hưởng quá trình tự động hoàn thành: cộng đồng, tích lũy kiến ​​​​thức và tất cả những thứ đó. Tiến hành hội thảo về cách sử dụng chương trình cho đồng nghiệp, viết một bài trên Confluence - giờ đây công ty đã có thêm một công cụ tiện lợi hơn.

Làm việc trên tính năng này giúp tôi hiểu rằng không cần phải ngại mày mò các dự án nguồn mở - theo quy luật, chúng có kiến ​​trúc rõ ràng và ngay cả kiến ​​​​thức cơ bản về ngôn ngữ cũng đủ để thử nghiệm. Và với một mức độ kiên trì nhất định, bạn thậm chí sẽ có thể thoát khỏi những hoạt động thường ngày đáng ghét, tiết kiệm thời gian cho những thử nghiệm mới.

Nguồn: www.habr.com

Thêm một lời nhận xét