Estoy jugando con una abstracción de consultas a través de la API de base de datos WebSQL / Phonegap, y me siento atraído y dudoso de definir una API fluida que imite el uso de la gramática del idioma inglés natural.
Podría ser más fácil de explicar esto a través de ejemplos. Las siguientes son todas las consultas válidas en mi gramática y los comentarios explican la semántica 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);
Edición basada en los comentarios de Quentin Pradet : Además, parece que la API debería admitir formas verbales tanto en plural como en singular, por lo que:
//a equals b
find("post").where("foo").equals(1);
//a and b (both) equal c
find("post").where("foo").and("bar").equal(2);
Por el bien de la pregunta, supongamos que no he agotado todas las posibles construcciones aquí. Supongamos también que puedo cubrir la mayoría de las oraciones correctas en inglés; después de todo, la gramática en sí está limitada a los verbos y las conjunciones definidas por SQL.
Editar con respecto a la agrupación : una "oración" es un grupo, y la prioridad es la definida en SQL: de izquierda a derecha. Se pueden expresar múltiples agrupaciones con varias declaraciones where
:
//the conjunctive "and()" between where statements is optional
find("post")
.where("foo").and("bar").equal(2).and()
.where("baz").isLessThan(5);
Como puede ver, la definición de cada método depende del contexto gramatical en el que se encuentra. Por ejemplo, el argumento de "métodos de conjunción" or()
y and()
se puede omitir, o se refiere a un nombre de campo o valor esperado.
Para mí, esto es muy intuitivo, pero me gustaría que escuchara sus comentarios: ¿es esta una API buena y útil, o debería retroceder a una implementación más directa?
Para el registro: esta biblioteca también proporcionará una API más convencional y no fluida basada en objetos de configuración.