मैं एक जावा सर्वलेट एप्लिकेशन पर काम कर रहा हूं जिसे एडहॉक रिपोर्टिंग उद्देश्यों के लिए बहुत गतिशील एसक्यूएल स्टेटमेंट बनाने की आवश्यकता है। एप्लिकेशन का मूल कार्य पूर्व-कोडित क्वेरी में नामित HTTP अनुरोध मापदंडों के एक समूह को खिलाने के लिए है, और आउटपुट का एक अच्छा स्वरूपित तालिका उत्पन्न करता है। मैंने अपने सभी SQL प्रश्नों को XML फ़ाइलों में संग्रहीत करने और उन्हें तालिका स्वरूपण सूचना के साथ रिपोर्टिंग एप्लिकेशन में लोड करने के लिए स्प्रिंग MVC और निर्भरता इंजेक्शन ढांचे का उपयोग किया। आखिरकार, रिपोर्टिंग पैरामीटर मौजूदा पैरामीटर मैपिंग फ्रेमवर्क की क्षमताओं से अधिक जटिल हो गए और मुझे अपना खुद का लिखना पड़ा। यह विकास में एक दिलचस्प अभ्यास था और जो कुछ भी मुझे मिल सकता था उससे कहीं अधिक मजबूत मैपिंग पैरामीटर के लिए एक रूपरेखा तैयार की।
नया पैरामीटर मैपिंग इस प्रकार है:
select app.name as "App",
${optional(" app.owner as "Owner", "):showOwner}
sv.name as "Server", sum(act.trans_ct) as "Trans"
from activity_records act, servers sv, applications app
where act.server_id = sv.id
and act.app_id = app.id
and sv.id = ${integer(0,50):serverId}
and app.id in ${integerList(50):appId}
group by app.name, ${optional(" app.owner, "):showOwner} sv.name
order by app.name, sv.name
परिणामी ढांचे की सुंदरता यह थी कि यह HTTP अनुरोध मापदंडों को सीधे क्वेरी में उचित प्रकार की जाँच और सीमा जाँच के साथ संसाधित कर सकता है। इनपुट सत्यापन के लिए कोई अतिरिक्त मैपिंग की आवश्यकता नहीं है। ऊपर दिए गए उदाहरण के प्रश्न में, serverId नाम के पैरामीटर
को यह सुनिश्चित करने के लिए जांचा जाएगा कि यह एक पूर्णांक तक जा सकता है और 0-50 की सीमा में था। पैरामीटर appId को पूर्णांक की एक सरणी के रूप में संसाधित किया जाएगा, जिसकी लंबाई सीमा 50 है। यदि फ़ील्ड शोऑनर हैमौजूद है और "सही" पर सेट है, उद्धरणों में SQL के बिट्स वैकल्पिक फ़ील्ड मैपिंग के लिए उत्पन्न क्वेरी में जोड़े जाएंगे। फ़ील्ड कई और पैरामीटर प्रकार के मैपिंग उपलब्ध हैं जिनमें SQL के वैकल्पिक खंडों के साथ आगे पैरामीटर मैपिंग शामिल हैं। यह क्वेरी मैपिंग के जटिल के रूप में अनुमति देता है क्योंकि डेवलपर के साथ आ सकता है। यहां तक कि रिपोर्ट कॉन्फ़िगरेशन में यह निर्धारित करने के लिए भी नियंत्रण है कि किसी दिए गए क्वेरी में एक तैयारी के माध्यम से अंतिम मैपिंग होगी या बस एक पूर्व-निर्मित क्वेरी के रूप में चलाई जाएगी।
नमूने के लिए Http अनुरोध मान:
showOwner: true
serverId: 20
appId: 1,2,3,5,7,11,13
यह निम्न SQL का उत्पादन करेगा:
select app.name as "App",
app.owner as "Owner",
sv.name as "Server", sum(act.trans_ct) as "Trans"
from activity_records act, servers sv, applications app
where act.server_id = sv.id
and act.app_id = app.id
and sv.id = 20
and app.id in (1,2,3,5,7,11,13)
group by app.name, app.owner, sv.name
order by app.name, sv.name
मुझे वास्तव में लगता है कि स्प्रिंग या हाइबरनेट या उन चौखटों में से एक को अधिक मजबूत मानचित्रण तंत्र की पेशकश करनी चाहिए जो कि प्रकारों की पुष्टि करता है, जटिल डेटा प्रकार जैसे सरणियों और ऐसी अन्य सुविधाओं के लिए अनुमति देता है। मैंने अपने इंजन को केवल अपने उद्देश्यों के लिए लिखा था, यह सामान्य रिलीज़ के लिए काफी पढ़ा नहीं गया है। यह इस समय केवल Oracle प्रश्नों के साथ काम करता है और सभी कोड एक बड़े निगम के हैं। किसी दिन मैं अपने विचारों को ले सकता हूं और एक नए ओपन सोर्स ढांचे का निर्माण कर सकता हूं, लेकिन मुझे उम्मीद है कि मौजूदा बड़े खिलाड़ियों में से एक चुनौती लेगा।