onPHP/onphp-framework — pull request #229 by AlexeyDsov (2014-12-22 06:25:41+00:00)
Title: CaseWhenExpression для PostgreSQL

На прошлой неделе делал генерацию отчетов и внезапно понадобилось использовать [Conditional Expression](http://www.postgresql.org/docs/8.4/static/functions-conditional.html#AEN15225) выражение из 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 по какой-то причине когда-то сделал я