私は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で定義された動詞と結合語に限定されています。
グループ化に関する編集:1つの「文」は1つのグループであり、優先順位は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なAPIも提供します。
where("name").equals("foo").or("bar")
として解析し(name=="foo")or bar
ます。その後、文字列がリテラルを表すとき、および列名を表すときは明確ではありません