На прошлой неделе делал генерацию отчетов и внезапно понадобилось использовать Conditional Expression выражение из PostgreSQL. Соотвественно написал вот такой вот CaseWhenExpression.
Есть нужно использовать только одно условия и else, то их можно передать в метод create через аргументы - первый аргумент это условие when, второй аргумент - значение/выражение возвращаемое в случае если условие выполняется и третий аргумент это else.
Если необходимо задать дополнительные условия то есть метод addCase с двумя аргемунтами: условие - первый аргумент и то что необходимо вернуть в случае успешного выполнения условия.
В SQL все условия генерируются в порядке их добавления, else всегда ставится последним. При генерации в SQL в случае если в addCase передавались строки, то первая строка по умолчанию считается полем, а вторая считается значением. Соотвественно в случае PostgreSQL они оборачиваются в разные кавычки и по разному эскейпятся.
Возможно в методу toDialectString необходимо добавить Assert на пустое количество условий т.к. в этом случае сгенерируется не валидный SQL. (Напишите что думаете по этому поводу)
Bonus:
Небольшой фикс в PrefixUnaryExpression::create - перевернул параметры при передаче их в конструктор, т.к. сейчас в create один порядок аргументов, а в конструкторе другой. Моя ошибка был не прав. Это кривой фикс для сохранения BC. С другой стороны PrefixUnaryExpression редко кто использует, думаю, и, пожалуй, можно и изменить порядок аргументов в самом методе create. (Напишите что думаете и по этому поводу)
P.S. судя по логу неправильный create по какой-то причине когда-то сделал я
На прошлой неделе делал генерацию отчетов и внезапно понадобилось использовать Conditional Expression выражение из PostgreSQL. Соотвественно написал вот такой вот CaseWhenExpression.
Есть нужно использовать только одно условия и else, то их можно передать в метод create через аргументы - первый аргумент это условие when, второй аргумент - значение/выражение возвращаемое в случае если условие выполняется и третий аргумент это else. Если необходимо задать дополнительные условия то есть метод addCase с двумя аргемунтами: условие - первый аргумент и то что необходимо вернуть в случае успешного выполнения условия.
В SQL все условия генерируются в порядке их добавления, else всегда ставится последним. При генерации в SQL в случае если в addCase передавались строки, то первая строка по умолчанию считается полем, а вторая считается значением. Соотвественно в случае PostgreSQL они оборачиваются в разные кавычки и по разному эскейпятся.
Возможно в методу toDialectString необходимо добавить Assert на пустое количество условий т.к. в этом случае сгенерируется не валидный SQL. (Напишите что думаете по этому поводу)
Bonus: Небольшой фикс в PrefixUnaryExpression::create - перевернул параметры при передаче их в конструктор, т.к. сейчас в create один порядок аргументов, а в конструкторе другой. Моя ошибка был не прав. Это кривой фикс для сохранения BC. С другой стороны PrefixUnaryExpression редко кто использует, думаю, и, пожалуй, можно и изменить порядок аргументов в самом методе create. (Напишите что думаете и по этому поводу) P.S. судя по логу неправильный create по какой-то причине когда-то сделал я