10 个版本
0.4.2 | 2023 年 10 月 25 日 |
---|---|
0.4.1 | 2023 年 9 月 25 日 |
0.4.0-alpha.4 | 2023 年 8 月 7 日 |
0.4.0-alpha.3 | 2023 年 7 月 12 日 |
0.2.0 | 2023 年 6 月 5 日 |
104 在 #查询语言
2,881 每月下载量
用于 sikula
16KB
255 行
SiKuLa
Simple Query Language - [ˈziːˈkuːˈlaː']
原理
另一个查询语言,你认真吗?
实际上它并不算新。但是将其命名为“类似于 GitHub 搜索语法的查询语言”(QLSTGHSS)并不是一个真正的选择。
更可以说它是一个熟悉语法的实现。
那么区别在哪里呢?
它们很微妙。但我不想破坏惊喜。或者也许我只是太懒于编写文档。🤷
示例
假设你定义了一个用于搜索电子邮件的枚举
use sikula::prelude::*;
#[derive(Search, Clone, Debug, PartialEq, Eq)]
enum DeriveResource<'a> {
/// Standard qualifier: `author:someone`
#[search(sort, scope)]
Author(&'a str),
/// Default primary: `warranty`
#[search(default)]
Subject(Primary<'a>),
/// Non-default primary: `warranty in:message`, to search in both: `warranty in:message in:subject`
#[search(scope)]
Message(Primary<'a>),
/// Predicate: `is:read`
Read,
/// Numeric qualifier example:
/// * `size:100` (equals)
/// * `size:>=100` (size greater than or equals 100)
/// * `size:100..200` (size between 100 inclusive and 200 exclusive)
/// * `size:*..200` (size up to 200 exclusive)
#[search(sort)]
Size(Ordered<usize>),
#[search(sort)]
Sent(Ordered<time::OffsetDateTime>),
Label(Qualified<'a, &'a str>),
}
Query
derive 提供了特质实现。`#[query(scope)]
` 属性将 Subject
变量标记为 Body
范围的主搜索词,如果没有选择则默认为 Subject
。
一般来说,有三种类型的术语:主术语、限定词、谓词。谓词是简单的“这个条件是否为真”风格的过滤器。如果一个枚举变量没有值,则它是一个谓词。
限定词是额外的匹配标准,这取决于值的类型。
使用 `#[query(sort)]
` 标志,一个字段可以用于排序结果。
现在,你可以执行以下查询
查询 | 检索所有条目… |
---|---|
foo |
… 包含 "foo" 在 "主题" 中 |
foo在:主题在:消息 |
… 包含 "foo" 在 "主题" 或 "正文" 中 |
foo在:主题在:消息是:已读 |
… 包含 "foo" 在 "主题" 或 "正文" 中且为 "已读" 的 |
foo bar |
… 包含 "foo" 和 "bar" 在主题中 |
大小:>10000 |
… 大于 10000 的 |
大小:100..200 |
… 大小在 100(包含)到 200(不包含)之间 |
-是:已读 |
… 表示“未读取” |
foo 排序:已发送 |
… 主题中包含 "foo",按“已发送”升序排序 |
foo-排序:已发送 |
… 主题中包含 "foo",按“已发送”降序排序 |
发送者:"Max Mustermann" |
… 发送者为 Max Mustermann |
发送者:"Max Mustermann"发送者:"Eva Mustermann" |
… 发送者为 Max Mustermann 和 Eva Mustermann (很可能找不到结果) |
发送者:"Max Mustermann","Eva Mustermann" |
… 发送者为 Max Mustermann 或 Eva Mustermann |
foo或bar |
… 主题中包含 "foo" 或 "bar" |
foo与bar |
… 主题中包含 "foo" 和 "bar" |
foo或bar与baz |
… 主题中包含 "foo" 或 ("bar" 和 "baz") |
(foo或bar) 与baz |
… 主题中包含 ("foo" 或 "bar") 和 "baz" |
foo或bar baz |
… 主题中包含 ("foo" 或 "bar") 和 "baz" |
要测试上述资源的更多示例,您可以运行 cli
示例
cargo run --example cli --features time -- -is:read AND foo
这将为您提供解析查询的结构化输出
Input: '-is:read AND foo'
Query {
terms: And(
[
Not(
Match(
Read,
),
),
Match(
Subject(
Partial(
"foo",
),
),
),
],
),
sorting: [],
}
依赖项
~1.2–1.7MB
~34K SLoC