मेरी पिछली नौकरियों में से एक में मैंने कुछ ऐसा ही किया:एक प्रश्न मिला (एक एसक्यूएल नहीं, बल्कि बहुत समान) और इसे antlr के साथ मोंगो क्वेरी में अनुवादित किया।
मेरे पास साझा करने के लिए कोई कोड नहीं है, हालांकि मैं अपने विचार साझा कर सकता हूं:
-
मोंगो एसक्यूएल अनुपालन नहीं है, इसलिए आप केवल एक एसक्यूएल व्याकरण नहीं ले सकते हैं। जॉइन और सभी संबंधपरक बीजगणित के बारे में क्या? उन एकत्रीकरणों के बारे में जो अपने एकत्रीकरण ढांचे के साथ मोंगो में बहुत मुश्किल हैं? विपरीत दिशा में, आप एसक्यूएल कैसे उत्पन्न करते हैं जो मोंगो में "मौजूद" खंड में अनुवादित हो जाता है। इस तरह की कई चीजें हैं, कुछ छोटी हैं, कुछ बड़ी हैं, लेकिन नीचे की रेखा आप एसक्यूएल के किसी प्रकार के सबसेट के बारे में बात कर रहे होंगे, कुछ डीएसएल जिन्हें एक क्वेरी भाषा के रूप में उपयोग करने की अनुमति है और एक एसक्यूएल की तरह दिखता है क्योंकि लोग SQL के अभ्यस्त हैं।
-
इसे ध्यान में रखते हुए, आपको अपना खुद का व्याकरण बनाना चाहिए और Antlr आपके लिए एक लेक्सर/पार्सर तैयार करेगा। आपको रनटाइम में क्वेरी का सिंटैक्स चेक भी दिया जाएगा। अगर यह सही प्रारूप में नहीं है तो Antlr क्वेरी को पार्स करने में सक्षम नहीं होगा, कुछ व्याकरण नियम विफल हो जाएंगे। एसक्यूएल को "जैसा है" न लेने का यह एक और कारण है।
-
अब तक बहुत अच्छा, आपने अपना श्रोता/आगंतुक बना लिया है। मेरे मामले में मैंने आंतरिक स्थिति और सब कुछ के साथ क्वेरी का ऑब्जेक्ट प्रतिनिधित्व बनाने का विकल्प चुना है। तो क्वेरी
Select id,name
from employee
where age > 30
and department = 'IT'
limit 200
प्रकार की वस्तुओं में अनुवादित किया गया था:
class Query {
private SelectClause select;
private FromClause from;
private WhereClause where;
private Limit limit;
}
class SelectClause {
private List<String> fields;
}
...
class WhereClause {
Condition root;
}
interface Condition {
...
}
class AndCondition implements Condition { // the same for Not, Or
}
इस विशेष क्वेरी के लिए यह कुछ इस तरह है:
Query q = new Query(new SelectClause(["id", "name"]), new FromClause("employee"), new WhereClause(new AndCondition(new SimpleLeafCondition("age", Operators.GT, 30), new SimpleLeafCondition("department", Operators.EQ, "IT" )), new Limit(30));
फिर क्वेरी में कुछ अनुकूलन करना संभव है (जैसे कि यदि आपको आवश्यकता हो तो क्लॉज को एम्बेड करना, या, उदाहरण के लिए, "फॉर" भाग में हेरफेर करना यदि आप मल्टी टेनेंट वातावरण में काम कर रहे हैं और अलग-अलग किरायेदारों के लिए अलग-अलग संग्रह हैं)।
आखिरकार आप डिज़ाइन पैटर्न "दुभाषिया" के साथ जा सकते हैं और क्वेरी ऑब्जेक्ट्स को दोबारा पार्स कर सकते हैं और उन्हें वैध मोंगो क्वेरी में "अनुवाद" कर सकते हैं। मुझे याद है कि इस कदम ने मुझे पूरा करने के लिए 1 दिन की तरह कुछ लिया था (यह 7 साल पहले मोंगो 2 के साथ था I अनुमान, लेकिन फिर भी), क्वेरी का प्रतिनिधित्व करने वाली वस्तुओं की सही संरचना को देखते हुए, इसलिए यह उतना जटिल नहीं होना चाहिए। मैं इसे ला रहा हूं, क्योंकि ऐसा लगता है कि यह प्रश्न में आपकी प्राथमिक चिंता है।