Как реализовать (или хотя бы как называется) паттерн, позволяющий строить критерии запросов?
Из запроса приходят фильтры. И потребуется поддержка отрицания и группировки вроде условий "выдай мне записи в которых "а больше 5", "б меньше 3" ИЛИ "а меньше 4". отрицание тоже "А и Б ИЛИ НЕ Б и В"
Как сделать выполнение, когда у меня есть фильтры - я понимаю. Меня интересует преобразование массивов в фильтры и хранение их. Интерфейс такого паттерна посмотрел бы. Если не найдется, придется взять интерфейс ОРМки и переколхозить конечно.
Макс, я посмотрел Specification, и он написан с таким учетом что я строю AND-OR как бы изнутри - то есть у меня уже есть цепочка, которую я оборачиваю/декорирую
А если какой-нибудь пример инверсии такого подхода, чтобы писать так как мы привыкли, когда мы используем скобки и соединяем операнды?
Как бы сказать - там все спецификации написаны с учетом того, что спецификацию можно обернуть только в спецификацию. А как создать первую спецификацию, которую не наполнена - мне не ясно. Там интерфейсами на вход они оборачивают только друг друга.
Или они имеют в виду что сначала соединяется полная цепь AND/OR/NOT - а потом туда суется один единственный например колбэк или что угодно что возвращает буль и оно прокидывается по всей цепи... взрыв мозга какой-то я не вдупляю как они это понимали
Максим Федоров, дополню. По спецификации самой уже разобрался, я понял что это подготовка фильтра, в котором каждое условие замкнуто в отдельный класс, поскольку я думаю паттерн очень старый, еще для тех времен когда не было лямбда и колбэков. Замыкать сейчас в целый файл один единственный ЕСЛИ-ТО считаю слишком жирным.
Хотя безусловно можно наделать таких кирпичиков и на ходу соединять в безумно сложные конструкции... Однако сохраняя принципы единой ответственности боюсь не получится чтобы эти кирпичики читались, это слишком нечитабельно, чтобы это можно было кому угодно показать и он за пару минут понял в чем дело в отличие от построителя запросов в любой ОРМ который вмещается в 5-10 строк и говорит что здесь происходит.
В моем случае получается глупость что требуется что-то делать с пользовательскими данными. То есть у меня еще нет обьекта, который нужно фильтровать и вернуть "подходит-не_подходит". Я пока пытаюсь построить условие, которое для БД будет преобразовано в запрос с помощью ОРМ или SQL, а для апишек и других в свою очередь уже будет передано параметрами то, что можно передать, а что нельзя - будем фильтровать на месте.