WebSQL / Phonegap Database 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
. 그러면 문자열이 리터럴을 나타내는 경우와 열 이름을 제공 할 때 명확하지 않습니다.