brandembassy/query-language-parser

2.1 2023-07-25 11:11 UTC

This package is auto-updated.

Last update: 2024-08-29 13:37:26 UTC


README

感谢这个库,使用PHP解析自定义查询语言变得易如反掌。只需定义自己的字段、操作符和值,其他所有事情都会自动为你完成。那么,您是否想要这样的查询语言呢?

(brand = bmw AND color = black) OR brand IN (audi, skoda)

这个库在 ferno/loco 解析器之上运行。有关更多详细信息,请参阅 https://github.com/qntm/loco。感谢这个伟大的库!

工作原理

您将定义支持的字段和操作符,以及这两个可能的关联。然后,对于每个可能的关联,您将定义解析的输出。

感谢这个库,您可以将查询语言转换为表示数据库查询的对象集,或将转换为类似SQL的语法。输出完全取决于您。

语言部分

逻辑操作符

此库包含标准逻辑操作符。具体来说,我们谈论的是这些

  1. AND

    brand = bmw AND color = black
    
  2. OR

    color = black OR brand IN (audi, skoda)
    
  3. NOT

    NOT (brand = bmw AND color = black)
    

您也可以通过添加括号来调整操作符的优先级,如下所示

(brand = bmw AND color = black) OR (brand = audi AND color = white)

关系操作符

最常见的关联操作符已经包含在库中。您可以使用操作符 =!=~!~<<=>>=LIKENOT LIKEINNOT INIS NULLIS NOT NULL,无需任何特殊努力。

自定义操作符

要丰富查询语言并添加自己的关系操作符,您必须执行以下两个步骤

  1. 创建定义使用此操作符的字段合同的接口。例如,请参阅 QueryLanguageFieldSupportingEqualToOperator

    通常应定义以下两点

    • 操作符后应跟随的值的格式 - 您可以通过扩展某些接口来定义此内容。在操作符不带值的情况下(例如,IS NULL),请扩展任何特殊接口。在操作符带单个值的情况下(例如,=),扩展 QueryLanguageFieldSupportingSingleValueOperator 接口。如果操作符后应跟随多个值,请扩展 QueryLanguageFieldSupportingMultipleValuesOperator 接口。

    • 将接收解析字段名(以及最终解析值)的方法,并返回此特定字段和操作符组合的输出值的方法。

  2. 表示操作符的类。它必须实现接口 QueryLanguageOperator。例如,请参阅 EqualToQueryLanguageOperator

    它必须实现以下方法

    • getOperatorIdentifier - 返回操作符的字符串标识符
    • createOperatorParser - 返回操作符的解析器
    • isFieldSupported - 返回给定字段是否由操作符支持。通常,您将测试给定字段是否实现了在第一步中创建的接口。
    • createFieldExpressionParser - 为给定字段和操作符的组合创建解析器

字段

字段是您的查询语言的核心。它定义了查询语言工作的领域。

您想要在查询语言中支持的每个字段都通过实现接口 QueryLanguageField 的类来定义。此接口定义了3个基本方法

  • getFieldIdentifier - 返回字段的字符串标识符
  • getFieldNameParserIdentifier - 返回字段名解析器的字符串标识符
  • createFieldNameParser - 返回字段名解析器

每个字段还应实现它支持的关联操作符的所有接口(例如,对于支持等于操作符,请使用 QueryLanguageFieldSupportingEqualToOperator)。

查询语言解析器

要创建查询语言解析器,请使用QueryParserFactory。只需传递您字段列表、支持的关系运算符列表以及逻辑运算符的输出定义(为此实现LogicalOperatorOutputFactory接口)即可,您的查询语言解析器就可以使用啦!

示例

请参阅此存储库中的examples目录,以获取基于汽车的查询语言的示例。