मैं WebSQL / Phonegap डेटाबेस API पर एक क्वेरी एब्स्ट्रैक्शन के साथ छेड़छाड़ कर रहा हूं, और मैं अपने आप को दोनों को आकर्षित करता हूं, और संदेहजनक हूं, एक धाराप्रवाह एपीआई को परिभाषित करता हूं जो प्राकृतिक अंग्रेजी भाषा के व्याकरण के उपयोग की नकल करता है।
उदाहरणों के माध्यम से इसे समझाना सबसे आसान हो सकता है। मेरे व्याकरण में सभी मान्य प्रश्न निम्नलिखित हैं, और टिप्पणियाँ इच्छित शब्दार्थ को स्पष्ट करती हैं:
//find user where name equals "foo" or email starts with "foo@"
find("user").where("name").equals("foo").and("email").startsWith("foo@")
//find user where name equals "foo" or "bar"
find("user").where("name").equals("foo").or("bar");
//find user where name equals "foo" or ends with "bar"
find("user").where("name").equals("foo").or().endsWith("bar");
//find user where name equals or ends with "foo"
find("user").where("name").equals().or().endsWith("foo");
//find user where name equals "foo" and email is not like "%contoso.com"
find("user").where("name").equals("foo").and("email").is().not().like("%contoso.com");
//where name is not null
find("user").where("name").is().not().null();
//find post where author is "foo" and id is in (1,2,3)
find("post").where("author").is("foo").and("id").is().in(1, 2, 3);
//find post where id is between 1 and 100
find("post").where("id").is().between(1).and(100);
Quentin Pradet की प्रतिक्रिया के आधार पर संपादित करें : इसके अलावा ऐसा लगता है, API को बहुवचन और एकवचन दोनों रूपों का समर्थन करना होगा, इसलिए:
//a equals b
find("post").where("foo").equals(1);
//a and b (both) equal c
find("post").where("foo").and("bar").equal(2);
प्रश्न के लिए, आइए मान लें कि मैंने यहां सभी संभावित निर्माणों को समाप्त नहीं किया है। चलो यह भी मान लेते हैं कि मैं सबसे सही अंग्रेजी वाक्य कवर कर सकता हूं - आखिरकार, व्याकरण स्वयं SQL के साथ परिभाषित क्रियाओं और संयोजन तक सीमित है।
समूहीकरण के बारे में संपादित करें : एक "वाक्य" एक समूह है, और पूर्वता SQL में परिभाषित है: दाएं से बाएं। कई where
बयानों के साथ कई समूह व्यक्त किए जा सकते हैं :
//the conjunctive "and()" between where statements is optional
find("post")
.where("foo").and("bar").equal(2).and()
.where("baz").isLessThan(5);
जैसा कि आप देख सकते हैं, प्रत्येक विधि की परिभाषा उस व्याकरणिक संदर्भ पर निर्भर है जिसमें वह है। उदाहरण के लिए "संयोजन विधियों" का तर्क or()
और and()
या तो छोड़ दिया जा सकता है, या फ़ील्ड नाम या अपेक्षित मान का संदर्भ दे सकता है ।
मेरे लिए यह बहुत सहज महसूस करता है, लेकिन मैं चाहूंगा कि आप अपनी प्रतिक्रिया सुनें: क्या यह एक अच्छा, उपयोगी एपीआई है, या क्या मुझे और अधिक स्पष्ट कार्यान्वयन के लिए समर्थन करना चाहिए?
रिकॉर्ड के लिए: यह लाइब्रेरी कॉन्फ़िगरेशन ऑब्जेक्ट्स के आधार पर एक अधिक पारंपरिक, गैर-धाराप्रवाह एपीआई भी प्रदान करेगी।
where("name").equals("foo").or("bar")
रूप में पार्स करेंगे (name=="foo")or bar
। तब यह स्पष्ट नहीं होता है जब एक स्ट्रिंग एक शाब्दिक का प्रतिनिधित्व करता है, और जब यह एक स्तंभ नाम प्रस्तुत करता है, ...