#query-language #object #array #xpath #tree #generic #properties

nightly kg-tree

具有 Opath 查询语言,类似于 XPath 的泛型对象树。

10 个版本

0.2.1 2020 年 8 月 15 日
0.2.0 2019 年 9 月 5 日
0.1.7 2019 年 8 月 26 日
0.1.4 2019 年 7 月 23 日
0.1.1 2018 年 10 月 11 日

#1285 in 数据结构

Download history 7/week @ 2024-03-09 2/week @ 2024-03-16 45/week @ 2024-03-30 10/week @ 2024-04-06

52 每月下载量
3 crates 中使用

Apache-2.0 OR MIT

495KB
14K SLoC

kg-tree

Latest Version Documentation Build Status codecov

具有 Opath 查询语言,类似于 XPath 的泛型对象树。

为 Rust 频道构建状态

稳定 beta nightly
Build1 Build2 Build3

Opath

用于对象树查找和转换的简单语言,类似于 XPath 的功能。

数据类型

支持通过 jsonyamltoml 格式传输的所有数据类型。

  • null - 空值
  • number - 内部存储为 64 位整数或 64 位浮点数
  • boolean - truefalse
  • string - 字符串以 UTF-8 编码的数据存储。
  • binary - 二进制数据。
  • object - 对象或映射,可以包含字符串键属性
  • array - 数组或元素序列
  • date - 待实现!!

文字

  • 123-2 - 64 位整数值
  • 1.13.e10-1E-2.3 - 64 位浮点值
  • 'id'"id" - 字符串值
  • truefalse - 布尔值
  • null - null 值

类型转换

与 ECMAScript 相同,混合操作数时整数提升为浮点数(待完善)

数学运算符

支持典型数学运算符和括号。

  • 2 + 3@.count + 1 - 数值加法
  • 2 - 3@.count - 1 - 数值减法
  • 2 * 3@.count * 2 - 数值乘法
  • 2 / 3@.count / 2 - 数值除法
  • 2 + 6 / 2 - 返回值 5,符合预期
  • (2 + 6) / 2 - 返回值 4

内部,尽可能避免类型转换,即两个整数相加将返回整数和。

字符串连接

如果加法运算符中的任何一个具有字符串值,则加法将成为字符串连接

  • 2 + "3""2" + 3 - 两个表达式都返回字符串值 "23"
  • "John" + " " + 'Doe' - 返回 "John Doe"

比较运算符

  • 2 > 3
  • 2 >= 3
  • 2 < 3
  • 2 <= 3
  • 2 == 3
  • 2 != 3
  • 'aaabbb' ^= 'aa' - 如果左字符串操作符以右字符串操作符开头,则返回 true
  • 'aaabbb' *= 'aa' - 如果左字符串操作符包含右字符串操作符,则返回 true
  • 'aaabbb' $= 'bb' - 如果左字符串操作符以右字符串操作符结尾,则返回 true

逻辑运算符

  • not true!true
  • true and truetrue && true
  • truetruetrue || true

数字范围

  • :10 - 范围从 0(包含)到 10(包含)
  • 1:10 - 范围从 1(包含)到 10(包含)
  • 0:2:10 - 范围从 0(包含)到 10(包含)以 2 为增量
  • 5:-0.1:-1.4 - 支持范围中的浮点数
  • 1..10 - 范围从 1(包含)到 10(包含)
  • ..10 - 范围从 0(包含)到 10(包含)

上下文

每个 Opath 表达式都在 (表示为 $)和 当前(表示为 @)元素的上下文中执行。要访问对象树中的任何元素,需要定义它与 当前@)或 $)元素的关系,就像文件系统的路径相对于当前目录或文件系统根一样。对于基于 当前 元素的表达式,通常可以省略对 @ 的显式表示。

  • @.name - 从 当前 元素返回“name”属性的值
  • name - 与上面相同
  • $.name - 从 元素返回“name”属性的值

数组索引

可以使用 [] 符号访问数组元素。数组从 0 开始索引。

  • @[0] - 返回 当前 数组的第一个元素
  • @[0, 1..3, 5] - 数组可以由多个以逗号分隔的索引以及索引范围进行索引
  • @[-1,-2] - 负索引从数组的末尾开始计算,-1 表示数组的最后一个元素
  • @[3..] - 在数组索引表达式中使用范围时(在 [] 内),可以省略范围的结束值,它将等于数组的长度(数组元素的数量)

使用越界索引值访问数组会得到空结果。在非数组和非对象类型上访问数组元素也会得到空结果。

对象的属性访问

对象中的属性可以使用典型的 .[] 语法进行访问。

  • "name" - 返回当前元素的 "name" 属性的值
  • @[name] - 与上面相同,使用 [] 语法
  • [name] - 这是非法的!
  • @."name"@["name"] - 属性名可以加引号,如果是这样,则可以包含空格和特殊字符
  • "name" - 这是一个字符串字面量,不是属性访问!
  • @.(first_name, last_name, age) - 可以使用单个表达式选择几个属性,使用括号

访问不存在的属性会得到空结果。在非对象类型上访问属性也会得到空结果。

对象的属性索引

每个对象也可以作为数组进行索引,其中索引值将对应于对象中属性的顺序。例如,如果 当前 对象将是

{
   "first_name": "John",
   "last_name": "Doe"
}

表达式 @[1] 将产生字符串值 "Doe"(第二个属性的值)。对象具有严格定义且稳定的属性插入顺序。

属性/元素过滤

对象中的属性或数组中的元素也可以在 [] 语法内的逻辑表达式中进行过滤。

  • @[@.@key $= "name"] - 返回以 "name" 结尾的 当前 元素属性值。
  • @[@.@index >= 3] - 返回索引大于或等于 3当前 元素属性或元素。

注意,在 [] 表达式内部,当前 元素(@)成为外部元素的子元素。

属性/元素访问通配符操作符 *

  • @.*@[*] - 返回 当前 对象的所有属性或 当前 数组的所有元素,或者根据 当前 类型返回空结果。
  • @.(@.star) - 如果 当前 有一个值为 "*""star" 属性,这将与上面相同工作(FIXME 可能需要更改行为)

属性/元素访问递归下降操作符 **

  • @.**@[**] - 返回 当前 对象的所有属性,并递归地以深度优先降序返回它们的属性。
  • @."**"@['**'] - 这也将与上面相同工作。
  • @.(@.starstar) - 如果 当前 有一个值为 "**""starstar" 属性,这将与上面相同工作(FIXME 可能需要更改行为)
  • @.**{1,4}@.**{,4}@.**{2}@.**{0,2} - 可选深度级别范围可以指定。深度级别相对于被访问的元素(在这些例子中的是 当前 元素)指定。如果省略最小深度级别值,则假定 1。如果省略最大深度级别,则降级操作将从顶部解绑,即将继续对所有后代执行。如果最小深度级别值为 0,则结果还将包括被访问的元素本身。

父级访问操作符 ^

  • @^ - 这会返回 当前 元素的父级元素。
  • @.name^ - 如果 当前 元素是对象并且包含 "name" 属性,则此表达式将返回 当前 元素。

祖先访问递归操作符 ^**

  • @^** - 按降序深度顺序返回 当前 元素的全部祖先。最后一个元素将是
  • @^**{1,4}@^**{,4}@^**{2} - 可选递归距离范围可以指定,类似于 **。距离相对于被访问的元素指定。
  • @^(@.starstar) - 如果 当前 有一个值为 "starstar" 的属性,且该值为 "**",则此行为将与上述相同(FIXME 可能需要更改该行为)

元数据(属性)

所有元素都包含可读元数据(属性)。这些属性可以像常规属性一样访问,但需要在名称前加上@字符。

  • @.@index - 当前元素在其父元素中的索引(如果父元素是对象,这将是指定属性的索引位置)
  • @.@key - 当前元素在其父元素中的属性名(对于数组,这将是指索引的字符串值)
  • @.@level - 当前元素与根元素的距离
  • @.@kind - 当前元素类型的字符串值,可以是以下之一:"null""boolean""number""string""object""array" FIXME (日期、二进制)
  • @.@file - 描述文件或文件结构的字符串,当前元素从中读取(如果有),例如"file<yaml>:./data.yml"
  • @.@file_type- 包含文件类型(如果有)的字符串,可以是以下之一:"file""dir"
  • @.@file_format- 包含文件格式(如果有)的字符串,支持以下值:"json""yaml""toml""text""binary"
  • @.@file_path- 包含文件路径(如果有)的字符串,例如"./data.yml"
  • @.@file_name- 包含文件名(如果有)的字符串,例如"data.yml"
  • @.@file_stem- 包含文件名主干的字符串(如果有),例如"data"。对于以"."开头的文件名,例如".data.yml",主干将是".data"
  • @.@file_ext - 带有文件扩展名(如果有)的字符串,例如 "yml"
  • @.@path - 从 根目录当前 元素的路径,例如 "$.nested.array[3]"

许可

许可协议为以下之一

您可选择其中之一。

贡献

除非您明确声明,否则您有意提交的任何贡献,按照 Apache-2.0 许可证的界定,应如上双重许可,不附加任何额外条款或条件。

版权所有 (c) 2018 Kodegenix Sp. z o.o. http://www.kodegenix.pl

依赖项

~13MB
~245K SLoC