Нытье про QueryBuilder

Adelf

Administrator
Команда форума
Нытье про QueryBuilder

Написал небольшой QueryBuilder для нужд команды. Он на C#, но по барабану. Я хочу понять то ли я не прав, то ли одно из двух.

Для началу кусок из тестов:

Это тот тест, которые они хотят чтобы выполнялся.
PHP:
string actual = OracleQueryBuilder
                .Select(selFields)
                .From("test", "c")
                .Where("c.test = c.test2")
                .OrWhere("c.test = c.test2")
                .OrWhere("c.test = c.test3")
                .GetSql();

string expected = "SELECT c.test, c.test2 FROM test c WHERE c.test = c.test2 AND c.test = c.test2 OR c.test = c.test3";
Т.е. логика: Where(аналог AndWhere) или OrWhere определяют какой оператор будет ПОСЛЕ данного условия.

В кохановском билдере логика другая:
Каждый Condition определяет какой оператор ДО него будет стоять.(AND или OR)

Т.е. по этой логике тест должен был бы работать так:
PHP:
string actual = OracleQueryBuilder
                .Select(selFields)
                .From("test", "c")
                .Where("c.test = c.test2")
                .OrWhere("c.test = c.test2")
                .OrWhere("c.test = c.test3")
                .GetSql();

string expected = "SELECT c.test, c.test2 FROM test c WHERE c.test = c.test2 [B]OR[/B] c.test = c.test2 OR c.test = c.test3";
Возможно я просто не могу взглянуть на это с другой стороны(на самом деле эти два случая - одно и то же, просто с разных сторон). Я не смог найти убедительных аргументов в пользу моего(Кохановского) подхода. Я почему-то считал что он более "человечный".

Есть какие-нибудь мысли?
 

Fortop

Новичок
Я почему-то считал что он более "человечный".
На мой взгляд он крайне нелогичный.

Есть какие-нибудь мысли?
Легко.

Какое условие должно сформироваться в результате этого?
PHP:
.Where("c.test = c.test2") 
.OrWhere("c.test = c.test2")
Upd:
Упс :) я почему-то посчитал что поддерживается первый вариант :) Прошу прощения.
2й вариант - логичный.
 

MiksIr

miksir@home:~$
С точки зрения человека, а не программиста, второе более очевидно, ибо прям так и написано where(...).OrWhere(...).
Да и с точки зрения программиста - мы указываем отношение данного условия ко всем другим уже описанным... с какой это стати мы будем в конкретном операторе задавать отношение последующего условия к уже написанному... не логично.
 

Gas

может по одной?
Раз вопрос похож на опрос :)
то я за второй вариант, мне он кажется более логичным, условий после может не и быть, зачем задавать для них логику, или в "базовом методе" (условно) задаются основные условия, а потом к ним добавляются ещё условия в зависимости от логики, "базовый метод" не должен регламентировать по какой логике должен быть добавлен новый кондишн, не его это дело.
 

fixxxer

К.О.
Партнер клуба
Может просто в тесте ошибка? Спросить не пробовал? ;)
 

Adelf

Administrator
Команда форума
Спасибо за мнения. Но кажется все эти аргументы я уже пробовал.
Ну допустим переименуем методы: WhereAnd() и WhereOr() - и уже будут человечнее это все смотреться. Хотя самый реальный аргумент - текущий кондишен почему-то решает как именно присоединится к запросу следующий(это здесь уже два раза прозвучало). Попробую завтра дискуссию небольшую завязать :)

>> Может просто в тесте ошибка? Спросить не пробовал?
Не.. доооолго общались.
 

AmdY

Пью пиво
Команда форума
Т.е. логика: Where(аналог AndWhere) или OrWhere определяют какой оператор будет ПОСЛЕ данного условия.
вся прелесть и смысл билдера в том, что ты не знаешь что дальше будет или не будет.
если бы знали что дальше будет, то писали бы сразу два условия в обдом блоке
PHP:
.Where("c.test = c.test1 OR c.test = c.test2") ....
-~{}~ 13.04.10 16:04:

т.е. первый вариант недопустим ни в коем случае.
 

fixxxer

К.О.
Партнер клуба
Автор оригинала: Adelf
>> Может просто в тесте ошибка? Спросить не пробовал?
Не.. доооолго общались.
Тогда это к доктору. Нормальный человек не должен так мыслить. =)
 

Adelf

Administrator
Команда форума
еще раз всем спасибо :) Основной железный аргумент найден.
Осталось только заценить сколько займет изменение кое-какой логики. Может еще не поздно менять.
 
Сверху