उसी काम को करने से कैसे रोका जाए

क्या आप समय-समय पर नियमित संचालन को दोहराना पसंद करते हैं? यहां मैं हूं। लेकिन हर बार जब एसक्यूएल क्लाइंट में रोस्टेलकॉम रिपॉजिटरी के साथ काम करते हैं, तो मुझे टेबल हैंडल के बीच सभी जॉइन को रजिस्टर करना पड़ता था। और इस तथ्य के बावजूद कि 90% मामलों में, तालिकाओं से जुड़ने के लिए फ़ील्ड और स्थितियां क्वेरी से क्वेरी तक मेल खाती हैं! ऐसा लगता है कि किसी भी SQL क्लाइंट के पास स्वत: पूर्ण कार्य हैं, लेकिन यह हमेशा स्टोरेज के लिए काम नहीं करता है: प्रदर्शन को बेहतर बनाने के लिए उनके पास अद्वितीय बाधा और विदेशी कुंजी है, और इसके बिना, प्रोग्राम यह पता नहीं लगा सकता है कि संस्थाएं कैसे संबंधित हैं और यह आपके लिए क्या कर सकता है। सुझाव देना।



इनकार, क्रोध, सौदेबाजी, अवसाद, और स्वीकृति के करीब से गुजरने के बाद, मैंने फैसला किया - क्यों न खुद के साथ लाठी के साथ ऑटो-कम्प्लीट को लागू करने की कोशिश की जाए और जैसा कि यह होना चाहिए? मैं जावा में लिखे dbeaver क्लाइंट का उपयोग करता हूं, इसका एक ओपन सोर्स कम्युनिटी वर्जन है। एक सरल योजना पक गई है:

  1. स्रोत कोड में स्वतः पूर्ण वर्ग खोजें
  2. उन्हें बाहरी मेटाडेटा के साथ काम करने और वहां से जुड़ने के बारे में जानकारी निकालने के लिए पुन: प्रयास करें
  3. ??????
  4. लाभ

मैंने जल्दी से पहले आइटम का पता लगाया - मुझे बगट्रैकर में ऑटोफिल को समायोजित करने के लिए एक अनुरोध मिला और संबंधित प्रतिबद्ध में SQLCompletionAnalyzer वर्ग मिला। मैंने कोड को देखा - मुझे क्या चाहिए। यह इसे फिर से लिखना है ताकि सब कुछ काम करे। मैंने एक स्वतंत्र शाम की प्रतीक्षा की और कार्यान्वयन के माध्यम से सोचना शुरू किया। टेबल लिंकिंग रूल्स (मेटाडाटा) ने जसन में नेतृत्व करने का फैसला किया। मुझे इस प्रारूप के साथ कोई व्यावहारिक अनुभव नहीं था और वर्तमान कार्य को इस चूक को ठीक करने के अवसर के रूप में देखा गया।

Json के साथ काम करने के लिए, मैंने Google से json-simple लाइब्रेरी का उपयोग करने का निर्णय लिया। यहाँ आश्चर्य शुरू हुआ। जैसा कि यह निकला, dbeaver, tru-application के रूप में, OSGi ढांचे का उपयोग करके ग्रहण मंच पर लिखा गया है। अनुभवी डेवलपर्स के लिए, यह बात निर्भरता प्रबंधन की सुविधा देती है, लेकिन मेरे लिए यह काले जादू की तरह था, जिसे मैं स्पष्ट रूप से तैयार नहीं था: हमेशा की तरह, मैं संपादित वर्ग के शीर्ष लेख में जिनसन-सरल पुस्तकालय से आवश्यक कक्षाओं का आयात पंजीकृत करता हूं, मैं इसे पोम में निर्दिष्ट करता हूं। xml, जिसके बाद परियोजना स्पष्ट रूप से इकट्ठा होने से इनकार करती है और त्रुटियों के साथ विफल हो जाती है।

परिणामस्वरूप, हमने असेंबली त्रुटियों को ठीक करने में कामयाब रहे: मैंने लाइब्रेरी को pom.xml में पंजीकृत नहीं किया, लेकिन OSGI द्वारा आवश्यक आयात-पैकेज के रूप में निर्दिष्ट करते हुए, मेनिफ़ेस्ट। सबसे सुंदर समाधान नहीं है, लेकिन यह काम करता है। फिर अगला आश्चर्य प्रकट हुआ। यदि आप इंटेलीज विचार में विकसित कर रहे हैं, तो आप ग्रहण मंच के आधार पर अपनी परियोजना के डिबग को केवल प्राप्त और चला नहीं सकते हैं: एक अनुभवहीन डेवलपर को अनुरोधों के स्वत: पूर्णता के बिना किसी विश्लेषक से कम नहीं होना चाहिए। ऊदबिलाव डेवलपर्स खुद बचाव में आए, उन्होंने विकी ताम्बे के साथ सभी नृत्यों का संकेत दिया, जिसे करने की आवश्यकता है। सबसे अधिक कष्टप्रद बात यह है कि इन सभी स्क्वेट्स के बाद भी, परियोजना आयात-पैकेज के माध्यम से जुड़े हुए जोंस लाइब्रेरी के साथ डिबग में शुरू नहीं करना चाहती थी (इस तथ्य के बावजूद कि यह अभी भी सफलतापूर्वक तैयार उत्पाद में इकट्ठी थी)।

उस समय तक, मैं अपने कार्य के लिए json का उपयोग करने में असुविधा महसूस करने में कामयाब रहा - आखिरकार, मेटाडेटा को मैन्युअल रूप से संपादित किया जाना चाहिए था, और इसके लिए xml प्रारूप बेहतर अनुकूल है। Xml के पक्ष में दूसरा तर्क सभी आवश्यक वर्गों की जेडीके में उपस्थिति थी, जिससे बाहरी पुस्तकालय के साथ लड़ाई को रोकना संभव हो गया। बहुत खुशी के साथ मैंने सभी मेटाडेटा को json से xml में स्थानांतरित कर दिया और स्वत: पूर्ण तर्क संपादित करने के लिए आगे बढ़ा।

मेटाडेटा उदाहरण
<?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> 


परिणामस्वरूप, मैंने SQLUtils और SQLCompletionAnalyzer कक्षाओं में परिवर्तन किए । विचार यह है: यदि प्रोग्राम मूल तर्क के अनुसार उपयुक्त ऑटो-पूर्ण वाक्य खोजने में विफल रहा है, तो यह बाहरी एक्सएमएल फ़ाइल का उपयोग करके संभव जॉइन के लिए जांच करता है। फ़ाइल में ही फ़ील्ड्स को दर्शाने वाली तालिकाओं के जोड़े होते हैं जिनके द्वारा इन तालिकाओं को जोड़ने की आवश्यकता होती है। Eff_dttm और exp_dttm प्रविष्टियों की तकनीकी वैधता तिथियों पर प्रतिबंध और हटाए गए_ लॉजिकल लॉजिक फ्लैग को डिफ़ॉल्ट रूप से सेट किया गया है।

जब कोड में परिवर्तन किए गए, तो यह सवाल उठा - मेटाडेटा फ़ाइल कौन भरेगा? रिपॉजिटरी में बहुत सारी संस्थाएँ हैं, सभी कनेक्शनों को स्वयं पंजीकृत करना लाभहीन है। अंत में, मैंने अपने साथी विश्लेषकों पर इस कार्य को लटकाने का निर्णय लिया। मेटाडेटा फ़ाइल svn पर अपलोड की गई थी, जहां से प्रोग्राम के साथ स्थानीय निर्देशिका में चेकआउट किए जाते हैं। सिद्धांत यह है: रिपॉजिटरी में एक नई इकाई दिखाई दी है? एक विश्लेषक एक फाइल में शामिल होने के लिए संभव बनाता है, परिवर्तन करता है, बाकी अपने आप को चेकआउट करते हैं और काम करने में स्वत: पूर्णता का आनंद लेते हैं: समुदाय, ज्ञान संचय और वह सब। कार्यक्रम के उपयोग पर सहयोगियों के लिए एक कार्यशाला आयोजित की, संगम में एक लेख लिखा - अब कंपनी के पास एक से अधिक सुविधाजनक उपकरण हैं।

इस विशेषता पर काम ने मुझे यह समझ दी कि किसी को भी ओपन सोर्स प्रोजेक्ट्स लेने से नहीं डरना चाहिए - एक नियम के रूप में, उनके पास एक स्पष्ट वास्तुकला है, और यहां तक ​​कि भाषा का बुनियादी ज्ञान भी प्रयोगों के लिए पर्याप्त होगा। और दृढ़ता की एक निश्चित डिग्री के साथ, आप नफरत के नियमित संचालन से भी छुटकारा पा सकते हैं, नए प्रयोगों के लिए खुद को समय बचा सकते हैं।

Source: https://habr.com/ru/post/hi462021/


All Articles