[?i]
[?int]
[s:name]
[str:name]
В ассоциативных массивах порядок элементов не гарантированА такое будет или нафиг-нафиг?
Вспоминал, о чём таком я говорил...вообще-то, для твоего варианта с комплексными выражениями, надо забывать, что в этом случае скобки - это не модификатор уже, а
полноправный плейсхолдер
Объяснение простое: я сейчас, без подсказки, не могу объяснить происхождение "n", надо лезть читать его действия.То есть, я реально не понимаю, зачем два раздельных плейсхолдера для идентификаторов.
обоснование, пожалуйста, или уточнение что ты имеешь ввиду;В ассоциативных массивах порядок элементов не гарантирован
echo ['a'=>1,'b'=>2] == ['b'=>2,'a'=>1] ? 1:0;
echo ['a'=>1,'b'=>2] === ['b'=>2,'a'=>1] ? 1:0;
echo ['a'=>1,'b'=>2] === ['a'=>1,'b'=>2] ? 1:0;
в php гарантирован, там кроме хеша еще связанный список внутряхВ ассоциативных массивах порядок элементов не гарантирован
Бгыгыгы, я тут практически допилил свой велосипед, с query builder'ом на основе парсера. В нём есть практически всё вышеперечисленное, только вместо своего недоязыка я для указания типов использую стандартные typecast'ы.я предлагаю сделать:
1. простой лексер, который выделяет плейсхолдеры из текста по знаку ? или :, можно даже на конечном автомате
2. набор классов с логикой для каждого базового типа данных - модели,
3. компилятор, который для каждого плейсхолдера создает объект с данными нужного типа,
4. контроллер, который читает конфиг, конфигурирует компилятор соответствий плейсхолдеров классам типов, запускает лексер передает модели в отображение
5. набор отображений, которые рендерят запрос для mysql, postgres, для нативных плейсхолдеров, в plain sql и в brainfuck
потом предлагать флаг в задницу и пилить свой синтаксис, алиасы, типы данных и преобразования под свои вкусы
p.s. подумал, что не все прочтут мои мысли, так что:
1. автомат медленный, но структуру после парсинга кешировать очень легко,
2. чтоб добавить свои типы данных можно просто дописать класс с валидацией и приведением к строке - все эти ваши массивы вида ?[n=s]
4. естественно, через конфиг можно подменить лексер или задать свои алиасы,
да, выглядит громоздко, но если не выделять слои, кода меньше не станет , и писать быстрее, чем мы все это обсуждаем
p.p.s а еще все это обернуть для psr-4, ставить из composer, нарисовать логотип, снять рекламу с няшными девочками, и пропиарить на конфах как новое слово в работе с базой данных и nosql-killer
$connection = new Connection('...');
$factory = new StatementFactory($connection);
// покажем-ка пять последних новостей
/* @var $query Select */
$query = $factory->createFromString(<<<QUERY
select n.* from news as n order by news_added desc limit 5
QUERY
);
// ой, нам надо показать ещё и картинки к новости
$query->list[] = 'p.*';
$query->from[0]->join('pictures as p', 'left')->on = 'n.picture_id = p.picture_id';
// и выбрать только новости из нужных разделов
$query->from[] = 'objects_rubrics as ro';
$query->where->and_('ro.rubric_id = any(:rubric::integer[]) and ro.obj_id = n.news_id');
// и не очень старые, к тому же
$query->where->and_('age(news_added) < :age::interval');
// в $generated лежит запрос и информация о маппинге именованные параметры -> позиционные и о типах параметров
// эту хрень можно легко кэшировать, не гоняя потом ни парсер, ни билдер
$generated = $factory->createFromAST($query);
$result = $generated->executeParams($connection, array(
'rubric' => array(19, 20, 21),
'age' => 120 * 24 * 3600
));
select n.*, p.*
from news as n left join pictures as p on n.picture_id = p.picture_id, objects_rubrics as ro
where ro.rubric_id = any($1::pg_catalog.int4[])
and ro.obj_id = n.news_id
and age(news_added) < $2::interval
order by news_added desc
limit 5
array(2) {
[0] =>
string(16) "{"19","20","21"}"
[1] =>
string(16) "10368000 seconds"
}
Фанат, подумай над идеей флоппик'а "?ii", "?ss" для обозначения массивов. Всё-таки она, лично мне, опять нравится (даже очень).От идеи автоматом определять массивы я отказался
Я думаю над вариантами
Код:SELECT id FROM t WHERE cat IN (?ai);
Ну и кстати да, хочу отметить, что без нормального лексера оно в любом случае решаться не будет. Причём своего на каждый диалект, как иначе обрабатывать те же строки в долларах из Postgres'а: $foo$Placeholders look like this: ?ai or this [i:bar]$foo$я предлагаю сделать:
1. простой лексер, который выделяет плейсхолдеры из текста по знаку ? или :, можно даже на конечном автомате
Я все хочу собраться и написать максимально простой рег, который будет пропускать плейсхолдеры внутри кавычек и бэктиков. В принципе, добавить к ним еще пару квадратных скобок, может решить проблему...Даже у меня получается проблема из-за плейсхолдеров вида :foo, ибо в штатном Postgres'е конструкция foo[bar:baz] будет обработана как "часть массива foo от bar до baz", а у меня будет parse error, потому что :baz разберётся как имя плейсхолдера. Т.е. обязательно фигачить пробелы вокруг ':'.
Чё-то решение так себе, почему я не могу, например, выбирать нужный мне элемент массива, используя подстановки: select foo[:bar] from arraysource?Я все хочу собраться и написать максимально простой рег, который будет пропускать плейсхолдеры внутри кавычек и бэктиков. В принципе, добавить к ним еще пару квадратных скобок, может решить проблему...
Так я и хочу оставить плейсхолдеры, как есть.Фанат, а почему не сделать наоборот, плейсхолдеры оставить как есть, а для спецсимволов добавить экранирование.
SELECT `:name` FROM t WHERE f = 'foo?sar'
Ну, ты прав, конечно.Чё-то решение так себе, почему я не могу, например, выбирать нужный мне элемент массива, используя подстановки: select foo[:bar] from arraysource?
А что предполагается экранировать? Символ ':'? По-моему пробелы проще и очевидней.Ну, ты прав, конечно.
А что ты думаешь насчет экранирования? или текущий вариант с пробелами тебя устраивает?
Ну это да, моя вышепроцитированная хрень тоже работать может исключительно с диалектом Postgres'а, полагаясь на кучу специфических его фич.Вообще, все эти ужасы синтаксиса различных СУБД все больше укрепляют меня в идее писать только под мускуль. Задача, по крайней мере, видится мне подъёмной
не вижу проблемы: пишем лексер под mysql, если кто-нибудь напишет под другие базы - хорошо,Вообще, все эти ужасы синтаксиса различных СУБД все больше укрепляют меня в идее писать только под мускуль. Задача, по крайней мере, видится мне подъёмной
не верю , точнее, верю, но с ограничениями, полноценно без автоматов тут не справитьсянаписать максимально простой рег, который будет пропускать плейсхолдеры внутри кавычек и бэктиков.