Saya mengutak-atik abstraksi kueri tentang WebSQL / Phonegap Database API, dan saya merasa tertarik, dan ragu-ragu, mendefinisikan API yang lancar yang meniru penggunaan tata bahasa Inggris alami.
Mungkin paling mudah untuk menjelaskan ini melalui contoh. Berikut ini adalah semua kueri yang valid dalam tata bahasa saya, dan komentar menjelaskan semantik yang dimaksud:
//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);
Sunting berdasarkan umpan balik Quentin Pradet : Selain itu, API harus mendukung bentuk kata kerja jamak dan tunggal, jadi:
//a equals b
find("post").where("foo").equals(1);
//a and b (both) equal c
find("post").where("foo").and("bar").equal(2);
Demi pertanyaan, mari kita anggap bahwa saya belum kehabisan semua kemungkinan konstruksi di sini. Mari kita juga berasumsi bahwa saya dapat mencakup sebagian besar kalimat bahasa Inggris yang benar - setelah semua, tata bahasa itu sendiri terbatas pada kata kerja dan kata kerja yang didefinisikan oleh SQL.
Edit mengenai pengelompokan : Satu "kalimat" adalah satu kelompok, dan prioritasnya adalah seperti yang didefinisikan dalam SQL: kiri ke kanan. Pengelompokan berganda dapat diungkapkan dengan banyak where
pernyataan:
//the conjunctive "and()" between where statements is optional
find("post")
.where("foo").and("bar").equal(2).and()
.where("baz").isLessThan(5);
Seperti yang Anda lihat, definisi masing-masing metode bergantung pada konteks tata bahasa tempatnya. Misalnya argumen untuk "metode konjungsi" or()
dan and()
dapat ditinggalkan, atau merujuk ke nama bidang atau nilai yang diharapkan.
Bagi saya ini terasa sangat intuitif, tetapi saya ingin Anda mendengar tanggapan Anda: apakah ini API yang baik dan bermanfaat, atau haruskah saya mundur ke implementasi yang lebih lurus?
Sebagai catatan: pustaka ini juga akan menyediakan API non-fasih yang lebih konvensional berdasarkan objek konfigurasi.
... where foo = 1 or (bar = 2 and qux = 3)
?
where("name").equals("foo").or("bar")
sebagai (name=="foo")or bar
. Maka tidak jelas kapan string mewakili literal, dan ketika string menyajikan nama kolom, ...