Tôi đang nghiên cứu một bản tóm tắt truy vấn về API cơ sở dữ liệu WebQuery / Phonegap và tôi thấy mình vừa bị thu hút, vừa nghi ngờ về việc xác định một API lưu loát bắt chước việc sử dụng ngữ pháp tiếng Anh tự nhiên.
Có thể dễ dàng nhất để giải thích điều này thông qua các ví dụ. Sau đây là tất cả các truy vấn hợp lệ trong ngữ pháp của tôi và các bình luận giải thích ngữ nghĩa dự định:
//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);
Chỉnh sửa dựa trên phản hồi của Quentin Pradet : Ngoài ra, có vẻ như, API sẽ phải hỗ trợ cả dạng động từ số nhiều và số ít, vì vậy:
//a equals b
find("post").where("foo").equals(1);
//a and b (both) equal c
find("post").where("foo").and("bar").equal(2);
Vì lợi ích của câu hỏi, hãy giả sử rằng tôi đã không sử dụng hết tất cả các cấu trúc có thể có ở đây. Chúng ta cũng giả sử rằng tôi có thể bao quát hầu hết các câu tiếng Anh chính xác - xét cho cùng, chính ngữ pháp bị giới hạn trong các động từ và kết hợp được xác định bởi SQL.
Chỉnh sửa liên quan đến nhóm : Một "câu" là một nhóm và quyền ưu tiên được xác định trong SQL: từ trái sang phải. Nhiều nhóm có thể được thể hiện bằng nhiều where
câu lệnh:
//the conjunctive "and()" between where statements is optional
find("post")
.where("foo").and("bar").equal(2).and()
.where("baz").isLessThan(5);
Như bạn có thể thấy, định nghĩa của mỗi phương thức phụ thuộc vào ngữ cảnh ngữ pháp của nó. Ví dụ: đối số cho "phương thức kết hợp" or()
và and()
có thể bỏ qua hoặc tham chiếu đến tên trường hoặc giá trị mong đợi.
Đối với tôi điều này cảm thấy rất trực quan, nhưng tôi muốn bạn nghe phản hồi của bạn: đây có phải là một API tốt, hữu ích hay tôi nên ủng hộ việc triển khai mạnh mẽ hơn?
Đối với bản ghi: thư viện này cũng sẽ cung cấp API thông thường hơn, không lưu loát dựa trên các đối tượng cấu hình.
where("name").equals("foo").or("bar")
như (name=="foo")or bar
. Sau đó, không rõ ràng khi một chuỗi đại diện cho một nghĩa đen và khi nó thể hiện một tên cột, ...