Пакеты для проверки выражений, правил в GoLang

Aug 27, 2019 10:45


В процессе разработки своего решения для подбора правил обработки - процессора правил, узнал о существовании алгоритмов сопоставления с образцом. Для Go есть реализация алгоритма Rete (1: https://github.com/GNaive/naive-rete-go, 2: https://github.com/phomola/rete).

Для поиска правил мы проверяем их условия совпадения. Как можно сохранить эти условия, если правила меняются динамически? Можно придумать свое решение или использовать библиотеки для проверки выражений, они преобразуют текстовую строку в исполняемые код и проверяют его, обычно это логическое выражение, возвращающее true/false.

Что такое Процессор правил (Rule Engine) смотри уhttps://martinfowler.com/bliki/RulesEngine.html

Итак рассмотрим некоторые пакеты.


Пакеты для проверки/вычисления выражений

Подготовленные вычисления - возможность, когда пакет может провести синтаксический анализ и использовать его результаты повторно при вычислении выражении с реальными данными, это экономит время на вычисления, т.к. анализ выражения не повторяется каждый раз.

  • https://github.com/antonmedv/expr - умеет компилировать выражения для последующих быстрых вычислений (подготовленные вычисления, см. Compile), статическая типизация (передаем структуру как есть), хранит выражения в своем байткоде, умеет сериализировать выражения в JSON и назад, поддерживает множество операторов, функции помощники и вызов функций в выражениях, обращение к полям вложенных структур, обработка массивов выражений(all), даже отладчик есть. Используется в сервисах AviaSales.ru.
    Пример выражения: len(article.Comments) > 100 and article.Category not in ["misc"]
    [!] Использует синтаксический анализатор Antlr, потому есть проблемы на i386.
    Это самый функциональный из пакетов.
  • https://github.com/nikunjy/rules - поддерживает операции сравнения строк, чисел, OR, AND, существования, отсутствия, входимость строк. Поддерживает обращение к полям вложенных структур в выражениях. Возможна загрузка правил из строки/файла/потока. Подготовленных вычислений нет. Основан на antlr/antlr4.
    Пример использования:
    parser.Evaluate("x eq 1", obj{"x": 1}).
    [!] Использует синтаксический анализатор Antlr (известны проблемы на i386) 
  • https://github.com/caibirdme/yql -SQL подобные выражения, поддерживает подготовленные вычисления (см. yql.Rule(rawYQL)). Сериализации выражений в JSON нет. Основан на antlr/antlr4. Подготовленных вычислений нет.
    Пример использования:
    rawYQL := `name='deen' and age>=23 and (hobby in ('soccer', 'swim') or score>90))`
    result, _ := yql.Match(rawYQL, map[string]interface{}{ "name":  "deen", "age":   int64(23), "hobby": "basketball", "score": int64(100), })
    [!] Использует синтаксический анализатор Antlr (известны проблемы на i386) 
  • https://github.com/hopkinsth/go-ruler - задает правила в формате JSON (как в https://github.com/RedVentures/ruler), поддерживает сравнение строк, чисел, регулярные выражения, проверку входимости строк, поддерживает программное конструирование правила и загрузку из JSON, динамическая типизация (данные передаем через map[string]interface{}). Подготовленных вычислений нет.
    Пример использования:
    rules := []byte(`[     {"comparator": "eq", "path": "library.name", "value": "go-ruler"},     {"comparator": "gt", "path": "library.age", "value": 0.5}   ]`)
    engine, _ := ruler.NewRulerWithJson(rules)
    result := engine.Test(map[string]interface{}{     "library": map[string]interface{}{       "name": "go-ruler",       "age":  1.24,     },   })
  • https://github.com/huttotw/grules - написан под влиянием go-ruler, поддерживает дополнительно операции OR, AND, свои функции сравнения. Работает только с типами string и float64. Динамическая типизация (подавать данные через map[string]interface{}). Подготовленных вычислений нет. Пример использования.
  •  https://github.com/newm4n/grool - движок для обработки бизнес правил, использует свой доменный язык (DSL) похож на используемый в JBOSS Drools, но упрощенный. Описывается не только условие срабатывания, но реакция в виде when/then. Есть приоритеты для правил.
    [!] Использует синтаксический анализатор Antlr (известны проблемы на i386) 
  • https://github.com/zhouzhuojie/conditions -  минимальный движок обработки правил, принимает правила в виде текста, преобразует в выражение и вычисляет вам результат. Поддерживает подготовленные вычисления, кеширует синтаксическое дерево выражения (AST) правила, которое после может использоваться для проверки совпадения многократно.
  • https://github.com/easierway/rule-engine - простой конструктор правил, правила можно задавать только программно, это скорее основа для построения своего движка обработки правил, есть функциональные опции (это удобно). Условия задаются в виде функций замыканий указанных для When и Then методов, можно вызывать методы правила цепочкой (удобно задавать правило в коде). When() - задает функцию проверки условий срабатывания правила, Then() - задает функцию действий при срабатывании правила.

ccm, golang, разработка ПО, алгоритмы, работа

Previous post Next post
Up