我正在修改基于WebSQL / Phonegap数据库API的查询抽象,我发现自己既对定义一种模仿自然英语语法使用的流畅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()
可以被排除在外,或指的是字段名称或预期值。
对我来说,这感觉非常直观,但是我希望您能听到您的反馈:这是一个很好的,有用的API,还是我应该退缩以更简单地实现?
作为记录:该库还将基于配置对象提供更常规的,非流利的API。
where("name").equals("foo").or("bar")
为(name=="foo")or bar
。然后不清楚何时字符串代表文字,何时呈现列名,...