Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Требуется написать транслятор запроса (число прочтений - 3859 )
eurobax
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 62
Зарегистрирован: 13. Января 2010
Требуется написать транслятор запроса
06. Февраля 2012 :: 17:40
Печать  
У нас есть проект, в котором используется модель СУБД 1С8. Т.е. такие объекты как Справочники, Документы, РегистрыСведений и т.п.
В свое время для построения запросов в СУБД был реализован простейший транслятор запроса, описанного на объектах в родное выражение запроса для SQL.
Пример:
запрос
Код
Выбрать все
SELECT
this AS order,
date,
code,
PRESENTATION(ware) AS ware
FROM documents.orders
WHERE date > ‘2008-01-01’ and ware.caption LIKE (%КОЛБАСА%)
 


     преобразуется к:
Код
Выбрать все
SELECT
t0.id AS order,
t0.date,
t0.code,
CONCAT(j0.caption, ‘ (‘, j0.code, ‘)’) AS ware,

FROM document10 AS t0
LEFT JOIN catalog9 AS j0 ON j0.id = t0.ware
WHERE t0.date > ‘2008-01-01’ and j0.caption LIKE (%КОЛБАСА%)
 


Суть, я думаю, ясна.

Сейчас, с развитием проекта требуется создать полноценный транслятор произвольных запросов (с вложенными SELECT, собственными JOIN, выражениями в полях и т.п.).
Я полагаю, именно здесь я смогу найти компетентного человека, кто  поможет с этим. Отпишите мне на eurobax [гав] mail.ru, обсудим ваше участие.

Сам проект написан на PHP, но это не будет препятствием, главное работающая модель данного транслятора. Закодить это дело времени.
« Последняя редакция: 07. Февраля 2012 :: 08:28 - eurobax »  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Требуется написать транслятор запроса
Ответ #1 - 06. Февраля 2012 :: 17:46
Печать  
В общем виде посталенную вами в (0) задачу вряд ли решите.
В каких то частных случаях вполне возможно только не очень понятно зачем?
  
Наверх
 
IP записан
 
eurobax
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 62
Зарегистрирован: 13. Января 2010
Re: Требуется написать транслятор запроса
Ответ #2 - 06. Февраля 2012 :: 18:17
Печать  
Z1 писал(а) 06. Февраля 2012 :: 17:46:
В общем виде посталенную вами в (0) задачу вряд ли решите.

Да почему нет? Это задача конечного автомата, полностью решаема. Требуется участник в проект, кто ей займется.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Требуется написать транслятор запроса
Ответ #3 - 07. Февраля 2012 :: 02:21
Печать  
А какой смысл в этой задаче? Запросы не особо отличаются, разве что подменяются имена таблиц и функций.
Мне не понятно, почему нельзя сразу писать правильный запрос?
  
Наверх
 
IP записан
 
eurobax
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 62
Зарегистрирован: 13. Января 2010
Re: Требуется написать транслятор запроса
Ответ #4 - 07. Февраля 2012 :: 07:20
Печать  
Dmitry The Wing писал(а) 07. Февраля 2012 :: 02:21:
Запросы не особо отличаются, разве что подменяются имена таблиц и функций.
Мне не понятно, почему нельзя сразу писать правильный запрос?

Да ну... Дмитрий, на то она и объектная СУБД, что мы пишем запросы на уровне объектов (как Хибернейт), не заботясь о связях. Допустим, таблицы еще можно выучить, что catalog9 это у нас товары, но LEFT JOIN не заметили?
В сложных случаях можно вместо полей писать:
Код
Выбрать все
order.ware.manufacturer.country AS country 


Что преобразуется к серии JOIN'ов
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Требуется написать транслятор запроса
Ответ #5 - 07. Февраля 2012 :: 07:32
Печать  
eurobax писал(а) 07. Февраля 2012 :: 07:20:
Dmitry The Wing писал(а) 07. Февраля 2012 :: 02:21:
Запросы не особо отличаются, разве что подменяются имена таблиц и функций.
Мне не понятно, почему нельзя сразу писать правильный запрос?

Да ну... Дмитрий, на то она и объектная СУБД, что мы пишем запросы на уровне объектов (как Хибернейт), не заботясь о связях. Допустим, таблицы еще можно выучить, что catalog9 это у нас товары, но LEFT JOIN не заметили?
В сложных случаях можно вместо полей писать:
Код
Выбрать все
order.ware.manufacturer.country AS country 


Что преобразуется к серии JOIN'ов

но при таком подходе плюсы то что вы  вроде упрощаете программирование
но  не может быть и речи ни о какой оптимизации запросов(при ручном написании запросов квалифицированный специалист это обязательно сделает)
  
Наверх
 
IP записан
 
eurobax
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 62
Зарегистрирован: 13. Января 2010
Re: Требуется написать транслятор запроса
Ответ #6 - 07. Февраля 2012 :: 07:42
Печать  
Z1 писал(а) 07. Февраля 2012 :: 07:32:
но при таком подходе плюсы то что вы  вроде упрощаете программирование
но  не может быть и речи ни о какой оптимизации запросов(при ручном написании запросов квалифицированный специалист это обязательно сделает)

Все верно, запросы писать сможет даже неквалифицированный человек. Плюсом является еще и компактность и легкочитаемость запросов (например, джойны скрыты).
Насчет оптимизации - ничто не мешает составить низкоуровневый запрос, в котором транслятору придется только заменить виртуальные имена на реальные.
P.S. Обнаружил что пример я дал устаревший, я его исправил (вместо orders там конечно documents.orders)
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Требуется написать транслятор запроса
Ответ #7 - 07. Февраля 2012 :: 08:11
Печать  
eurobax писал(а) 07. Февраля 2012 :: 07:20:
Dmitry The Wing писал(а) 07. Февраля 2012 :: 02:21:
Запросы не особо отличаются, разве что подменяются имена таблиц и функций.
Мне не понятно, почему нельзя сразу писать правильный запрос?

Да ну... Дмитрий, на то она и объектная СУБД, что мы пишем запросы на уровне объектов (как Хибернейт), не заботясь о связях. Допустим, таблицы еще можно выучить, что catalog9 это у нас товары, но LEFT JOIN не заметили?
В сложных случаях можно вместо полей писать:
Код
Выбрать все
order.ware.manufacturer.country AS country 


Что преобразуется к серии JOIN'ов
Про преобразования ничего не понял, но по-моему, это все кастыли, вызванные неграмотным проектированием.
Зачем было называть так извратно таблицы? Чтобы потом было сложнее запомнить назначение?
  
Наверх
 
IP записан
 
eurobax
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 62
Зарегистрирован: 13. Января 2010
Re: Требуется написать транслятор запроса
Ответ #8 - 07. Февраля 2012 :: 08:21
Печать  
Dmitry The Wing писал(а) 07. Февраля 2012 :: 08:11:
Про преобразования ничего не понял, но по-моему, это все кастыли, вызванные неграмотным проектированием.
Зачем было называть так извратно таблицы? Чтобы потом было сложнее запомнить назначение?

С этого и надо было начать, значит, архитектура 1С вам непонятна. Я про это обозначил в самом начале.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Требуется написать транслятор запроса
Ответ #9 - 07. Февраля 2012 :: 08:29
Печать  
eurobax писал(а) 07. Февраля 2012 :: 08:21:
Dmitry The Wing писал(а) 07. Февраля 2012 :: 08:11:
Про преобразования ничего не понял, но по-моему, это все кастыли, вызванные неграмотным проектированием.
Зачем было называть так извратно таблицы? Чтобы потом было сложнее запомнить назначение?
С этого и надо было начать, значит, архитектура 1С вам непонятна. Я про это обозначил в самом начале.
Странный наезд ... у 1С нет таких таблиц!
  
Наверх
 
IP записан
 
eurobax
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 62
Зарегистрирован: 13. Января 2010
Re: Требуется написать транслятор запроса
Ответ #10 - 07. Февраля 2012 :: 08:58
Печать  
Dmitry The Wing писал(а) 07. Февраля 2012 :: 08:29:
Странный наезд ... у 1С нет таких таблиц!

Посмотрите как таблицы и поля именует 1С, а потом уже "предъявляйте" Улыбка
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Требуется написать транслятор запроса
Ответ #11 - 07. Февраля 2012 :: 09:24
Печать  
eurobax писал(а) 07. Февраля 2012 :: 08:58:
Dmitry The Wing писал(а) 07. Февраля 2012 :: 08:29:
Странный наезд ... у 1С нет таких таблиц!
Посмотрите как таблицы и поля именует 1С, а потом уже "предъявляйте" Улыбка
1С их так именует потому как таблицы создаются не при проектировании, а намного позже, что по вашему примеру не видно, ибо в нем есть ограничение на 1 цифру.
  
Наверх
 
IP записан
 
eurobax
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 62
Зарегистрирован: 13. Января 2010
Re: Требуется написать транслятор запроса
Ответ #12 - 07. Февраля 2012 :: 09:32
Печать  
В нашей системе БД так же генерируется по структуре метаданных. Реализован принцип hibernate с xpath, осталось предусмотреть объектные SQL-подобные запросы для оптимизации выборок.
С этими "надо / не надо" думаю закончим, зачем впустую тратить свое и мое время.
Требуется знающий человек в проект, кто этим займется, условия обговорим, eurobax [гав] mail.ru
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Требуется написать транслятор запроса
Ответ #13 - 08. Февраля 2012 :: 02:51
Печать  
По-моему, это неоправданное усложнение.
Чем плох подход 1С и 1С++?
Там имена заменяются метапарсером в соответствии со словарем, НО! только имена, а остальное отдается на откуп юзеру. Метапарсер, насколько я знаю, сам разворачивает только несколько вариантов подзапросов (та же периодика) + умеет подставлять ссылки по именам метаданных (перечисления, виды и т.д.), а также позволяет управлять типизацией результатов. Сам же запрос формирует и оптимизирует пользователь.
  
Наверх
 
IP записан
 
eurobax
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 62
Зарегистрирован: 13. Января 2010
Re: Требуется написать транслятор запроса
Ответ #14 - 08. Февраля 2012 :: 07:58
Печать  
Dmitry The Wing писал(а) 08. Февраля 2012 :: 02:51:
По-моему, это неоправданное усложнение.
Чем плох подход 1С и 1С++?
Там имена заменяются метапарсером в соответствии со словарем, НО! только имена, а остальное отдается на откуп юзеру. Метапарсер, насколько я знаю, сам разворачивает только несколько вариантов подзапросов (та же периодика) + умеет подставлять ссылки по именам метаданных (перечисления, виды и т.д.), а также позволяет управлять типизацией результатов. Сам же запрос формирует и оптимизирует пользователь.

Метапарсера будет недостаточно, т.к. он не позволит сгенерировать  те же джойны (для xpath). А их, в зависимости от сложности запроса, придется делать как к основной таблице, так и в подзапросах. Как минимум, нужен разбор синтаксиса запроса.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать