Sto armeggiando con un'astrazione di query su API di database WebSQL / Phonegap e mi trovo sia attirato, sia dubbioso, a definire un'API fluente che imita l'uso della grammatica naturale della lingua inglese.
Potrebbe essere più semplice spiegarlo tramite esempi. Quelle che seguono sono tutte query valide nella mia grammatica e i commenti spiegano la semantica prevista:
//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);
Modifica basata sul feedback di Quentin Pradet : Inoltre, sembra che l'API debba supportare sia forme di verbo plurali che singolari, quindi:
//a equals b
find("post").where("foo").equals(1);
//a and b (both) equal c
find("post").where("foo").and("bar").equal(2);
Per motivi di dubbio, supponiamo di non aver esaurito tutti i possibili costrutti qui. Supponiamo anche che io possa coprire la maggior parte frasi inglesi corrette - dopo tutto, la grammatica stessa è limitata ai verbi e alle congiunzioni definite da SQL.
Modifica relativa al raggruppamento : una "frase" è un gruppo e la precedenza è definita in SQL: da sinistra a destra. Gruppi multipli possono essere espressi con più istruzioni where
:
//the conjunctive "and()" between where statements is optional
find("post")
.where("foo").and("bar").equal(2).and()
.where("baz").isLessThan(5);
Come puoi vedere, la definizione di ogni metodo dipende dal contesto grammaticale in cui si trova. Ad esempio, l'argomento "metodi di congiunzione" or()
e and()
può essere escluso, o fai riferimento a un nome di campo o valore atteso.
Per me è molto intuitivo, ma mi piacerebbe che tu sentissi il tuo feedback: questa è una buona e utile API, o dovrei fare retromarcia per un'implementazione più rapida?
Per la cronaca: questa libreria fornirà anche un'API più convenzionale e non fluente basata sugli oggetti di configurazione.