У меня есть библиотека, с которой я должен взаимодействовать, которая действует в основном как источник данных. При извлечении данных я могу передать в эту библиотеку специальные «выражения фильтра», которые позже будут преобразованы в часть SQL WHERE. Эти выражения довольно ограничены. Они должны быть в конъюнктивной нормальной форме. Нравиться:
(A or B or C) and (D or E or F) and ...
Это, конечно, не очень удобно для программирования. Итак, я хочу сделать небольшую оболочку, которая может анализировать произвольные выражения и переводить их в эту нормальную форму. Нравиться:
(A and (B or C) and D) or E
будет переведено на что-то вроде:
(A or E) and (B or C or E) and (D or E)
Я могу преобразовать выражение в дерево с помощью библиотеки Irony. Теперь мне нужно его нормализовать, но я не знаю, как... Ах, вот еще поворот:
- Окончательное выражение не может содержать оператор NOT. Однако я могу обратить отдельные члены, заменив операторы обратными операторами. Итак, это нормально:
(not A or not B) AND (not C or not D)
но это не так:not (A or B) and not (C or D)
- Я хотел бы сделать выражение как можно более простым, потому что оно будет переведено в практически идентичный оператор SQL WHERE, поэтому сложный оператор, скорее всего, замедлит скорость выполнения.