WebSQL / Phonegap Veritabanı API üzerinde bir sorgu soyutlama ile uğraşıyorum ve kendimi hem doğal hem de dilbilgisi kullanımını taklit eden akıcı bir API tanımlamak için çizilmiş ve şüpheli buluyorum.
Bunu örneklerle açıklamak en kolay yol olabilir. Aşağıdakiler dilbilgimdeki geçerli tüm sorgulardır ve yorumlar amaçlanan semantiği açıklar:
//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'in geri bildirimlerine dayanarak düzenleme : Ek olarak, API'nin hem çoğul hem de tekil fiil formlarını desteklemesi gerekecek gibi görünüyor:
//a equals b
find("post").where("foo").equals(1);
//a and b (both) equal c
find("post").where("foo").and("bar").equal(2);
Soru uğruna, burada olası tüm yapıları tüketmediğimi varsayalım. Ayrıca, en doğru İngilizce cümleleri de kapsayabileceğimi varsayalım - sonuçta, dilbilgisinin kendisi SQL tarafından tanımlanan fiiller ve konjonktürlerle sınırlıdır.
Gruplamaya ilişkin düzenleme : Bir "cümle" bir gruptur ve öncelik SQL'de tanımlandığı gibidir: soldan sağa. Birden çok gruplama, birden çok where
ifadeyle ifade edilebilir :
//the conjunctive "and()" between where statements is optional
find("post")
.where("foo").and("bar").equal(2).and()
.where("baz").isLessThan(5);
Görüldüğü gibi, her bir yöntemin tanımı bağımsız değişken "birlikte yöntemleri" örneğin., İçinde bulunduğu gramer bağlamda bağlıdır or()
ve and()
her iki dışında kalan, olabilir veya bir alan adı bakınız veya beklenen değer.
Bana göre bu çok sezgisel hissettiriyor, ancak geri bildiriminizi duymanızı istiyorum: Bu iyi, kullanışlı bir API mı, yoksa daha doğrudan uygulamaya geri dönmeli miyim?
Kayıt için: Bu kütüphane ayrıca yapılandırma nesnelerine dayalı daha geleneksel, akıcı olmayan bir API sağlayacaktır.
where("name").equals("foo").or("bar")
Olarak ayrıştırırdım (name=="foo")or bar
. Bir dize değişmezi temsil ettiğinde ve bir sütun adı gösterdiğinde, o zaman net değildir ...