#查询语言 #查询 #语言 #解析器

sikula-macros

为 SiKuLa 提供宏支持

10 个版本

0.4.2 2023 年 10 月 25 日
0.4.1 2023 年 9 月 25 日
0.4.0-alpha.42023 年 8 月 7 日
0.4.0-alpha.32023 年 7 月 12 日
0.2.0 2023 年 6 月 5 日

104#查询语言

Download history 530/week @ 2024-03-13 173/week @ 2024-03-20 87/week @ 2024-03-27 388/week @ 2024-04-03 696/week @ 2024-04-10 969/week @ 2024-04-17 402/week @ 2024-04-24 233/week @ 2024-05-01 267/week @ 2024-05-08 414/week @ 2024-05-15 207/week @ 2024-05-22 387/week @ 2024-05-29 823/week @ 2024-06-05 379/week @ 2024-06-12 821/week @ 2024-06-19 738/week @ 2024-06-26

2,881 每月下载量
用于 sikula

Apache-2.0

16KB
255

SiKuLa

CI GitHub release (latest SemVer) crates.io docs.rs

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 MustermannEva Mustermann(很可能找不到结果)
发送者:"Max Mustermann","Eva Mustermann" … 发送者为 Max MustermannEva Mustermann
foobar … 主题中包含 "foo" 或 "bar"
foobar … 主题中包含 "foo" 和 "bar"
foobarbaz … 主题中包含 "foo" 或 ("bar" 和 "baz")
(foobar) baz … 主题中包含 ("foo" 或 "bar") 和 "baz"
foobar 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