Большой Воронежский Форум
» Программирование>байт код из дерева sql запроса Delphi
[Ариец] 22:06 05.05.2009
Доброе время суток.
Получил вот такую задачу я:
есть sql запрсо вида
"select <список полей> from <список таблиц> where <условия>"
Необходимо по нему построить дерево, а затем построить из этого дерева байткод. Кто-нибудь сталкивался с такой задачей?

Что делает байткод: байткод - последовательность цифр и параметров, передаваемые функциям, которые соответствуют цифрам.
Например:
Как можно разложить в байткода формулу: a+b
1,20,1,15,2
1: взять число (20 - значение числа). Первый раз берётся a, второй раз - b.
2: сумма взятых чисел.

Вот собственно что-то в таком духе надо сотворить для sql запроса.

Прошу помощи. Если кто-либо занимался такой вещью, отзовитесь пожалуйста. Ежели кто-то может помочь, тоже буду рад помощи. А то я уже вешаюсь. Кодер из меня не очень, а задание поставили.... [Ответ]
Yandex 22:52 05.05.2009
Кто понял, расскажите что имел в виду автор топика. Тока по человечьи пожалуйста. [Ответ]
[Ариец] 23:24 05.05.2009
Yandex, выразился как мог Понимаю что нифига не понятно, но сам слабо понимаю чего от меня хотят.
Попытаюсь ещё раз описАть:
нам надо сделать транслятор к запросу вышеописанного вида такой, чтобы на выходе получалась строка из:
номера команды, параметр к команде (если необходим),номер команды, параметр к команде (если необходим)........ и так далее.

Вобщем я так понимаю итоговый результат - должен получиться небольшой БД сервер. Но это только мои предположения.
[Ответ]
Yandex 08:27 06.05.2009
[Ариец], правильно сформулированная задача - это уже половина решения. А то что я вижу тут:

Сообщение от :
Народ, мне ляниво разбираться! Я ниче не знаю и знать не желаю, так что вы давайте поднапрягитесь, разберитесь и напишите для меня.

P.S. Задачи ведь от фонаря не раздаются кому попало, так ведь? [Ответ]
dn2k4 09:06 06.05.2009
Yandex, я так понимаю - разбор формул он хочет =)
- получить из базы набор записей
- построить по набору дерево (которое якобы получилось из синтаксического разбора формулы)
- перевести дерево в обратная польскую запись - это которая операции на стеке, типа "push + push + add" [Ответ]
dr-sm 11:14 06.05.2009
http://www.sqlite.org/arch.html [Ответ]
[Ариец] 16:21 06.05.2009

Сообщение от Yandex:
[Ариец], правильно сформулированная задача - это уже половина решения. А то что я вижу тут:

Я прекрасно это понимаю. Но я передал точны еслова заказчика.


Сообщение от dn2k4:
Yandex, я так понимаю - разбор формул он хочет =)
- получить из базы набор записей
- построить по набору дерево (которое якобы получилось из синтаксического разбора формулы)
- перевести дерево в обратная польскую запись - это которая операции на стеке, типа "push + push + add"

первое мне не надо.
У меня есть запрос, по нему строится дерево. Что такое "обратная польская запись" не представляю Но смысл наверное такой же.

Вобщем в итоге должна получиться "инструкция" к выполнению запроса. Возьми то, сравни с этим, запиши туда и так далее.
[Ответ]
dn2k4 17:07 06.05.2009

Сообщение от [Ариец]:
первое мне не надо. У меня есть запрос, по нему строится дерево

Ну значит надо взять текст запроса, сообразить что является оператором, а что операндом и построить по нему дерево разбора формулы.

на числовом примере

3*(1+2)

дерево разбора будет наподобие
[PHP]
*
| |
+ 3
| |
1 2
[/PHP]
Обратная польская запись из дерева получится обходом снизу вверх:
1 2 + 3 *

UPD: а можно и без дерева по алгоритмы Дейкстры http://ru.wikipedia.org/wiki/%D0%9E%...B8%D1%81%D1%8C [Ответ]
[Ариец] 20:42 06.05.2009
dn2k4, точно. Оно
Только это надо сделать не для частного случая, а для общего.

Вобщем кто и за сколько согласится сие сотворить?

Дерево запроса не на языке программирования я построить могу. А вот перенести это в код - нет.
[Ответ]
Yandex 21:20 06.05.2009
[Ариец], дерево запроса это что ли вот так?

Сообщение от :
select a, b, c
from t inner join t2 on t.a = t2.c
where t.a > 1 and t2.c = 3
group by t.b
having avg (t2.c) > 3
order by t.a

Читать снизу вверх
order by t.a
having avg (t2.c) > 3
group by t.b
where t.a > 1 and t2.c = 3
join on t.a = t2.c
select a, b from t | select c from t2

Нафига такое гавно кому то надо? Или я что то не так понял? Постройка для этого запроса дерево. [Ответ]
dn2k4 22:06 06.05.2009

Сообщение от Yandex:
Нафига такое гавно кому то надо? Или я что то не так понял?

Не позорь взятый ник =)

Твой пример в первом приближении, заменяя операции на функции и учитывая только приоритеты:
[PHP]
order by (t.a)
|
select (a,b,c)
|
group by(t.b)
|
where (t.a>1 and t2.c=3)
|
inner join(on t.a = t2.c)
| |
t t2
[/PHP]


UPD: операнды - множества(строк и колонок). В результате применения функции или операции получаем также множество(строк и колонок). И осталось не забыть про неявную операцию "[select from] t1, t2", дающую декартово произведение множеств.

UPD2: having забыл =/ будет после select(...) и перед group by (...) [Ответ]
Yandex 22:26 06.05.2009
dn2k4, ник абсолютно от фонаря брался сто лет назад.
Я примерно это и имел в виду. В виду отсутсвия опыта построения деревьев накосячил. Мне кажется и у тебя не все так гладко

Кстати, ANSI SQL (кому он нужен?) можно так разобрать, а вот фичи того же MySQL или Oracle (напр. аналитические функции) околеть проще.
[Ответ]
[Ариец] 22:30 06.05.2009
Ну вот надо оно...

Запрос вида: select t1.f1, t2.f2, ... from t1, t2, t3,.... where (t1.f1=t2.f2)and(t2.f1=t1.f2)and(...)....
[Ответ]
dn2k4 22:51 06.05.2009
<offtop>

Сообщение от Yandex:
абсолютно от фонаря

Ты мне просто иcторию напомнил...
У тебя там раньше над аватаром "Rambler" было написано, да =) Так вот, года три-четыре назад был случай - Наш Лось Яндекс решил поздравить Рамблер с днем рождения. И повесил себе на морду поздравление Рамблера с логотипом Рамблера. Логитип Рамблера был сделан ссылкой на картинку, лежащую непосредственно на серверах поздравляемого. Поздравлений хватило минут на 20, после чего поздравляемый тихо скончался =) Это значит про "от фонаря", да... =)

</offtop>

Сообщение от Yandex:
Мне кажется и у тебя не все так гладко

вполне может быть =) Тут главное - идея построения: операнды -> операции или функции -> декомпозиция функций = рекурсия с учетом приоритетов...

[Ариец], определяйся, что есть операция (функция) а что есть "нечто", над чем операция выполняется. Выделяй сии сущности из текста, вставляй вместо функций поддеревья из операций... ну и получишь искомое.

Тут важно на каком уровне вычислений можно остановится: например - надо ли разбивать функцию отбора where() на более мелкие операции или и так сойдет. [Ответ]
dn2k4 22:54 06.05.2009

Сообщение от Yandex:
фичи того же MySQL или Oracle (напр. аналитические функции) околеть проще.

Пофиг, сведется к декомпозиции функции на дерево из операторов и параметров [Ответ]
[Ариец] 23:14 06.05.2009

Сообщение от dn2k4:
Пофиг, сведется к декомпозиции функции на дерево из операторов и параметров

Это как бы в задаче стоит.
Народ, вы не понимаете меня... Теоретически (не на делфях) я это понимаю как сделать. Но как это реализовать на практике - не пойму. Слаб я в делфях. Поэтому и прошу помощи. Естественно за пиво-вознаграждение. Или за что-нибудь другое. [Ответ]
dn2k4 23:25 06.05.2009

Сообщение от [Ариец]:
Теоретически

Это больное место, да. Теоретическую часть мы разъяснить можем, а на дельфях... этот язык еще и изучить надо.

Сообщение от [Ариец]:
Естественно за пиво

Не, я пас. Теорией помогу. А заставлять тебя пиво в Мск везти - это насилие =) [Ответ]
MadFish 09:24 07.05.2009
читал-читал ... нифига не понял... похоже тупею... Ему надо синтаксический разбор sql запроса и кодогенерацию в "байт код" или я туплю??? А целевая машина описана?(в смысле этот самый "байт код") [Ответ]
[Ариец] 18:19 07.05.2009
MadFish, да, это и надо.
Целевая машина не описана. Её тоже надо будет написать. Или хотя бы составить сопоставить список команд их номера. [Ответ]
MadFish 11:59 08.05.2009
зашибись. ходи туда не знаю куда принеси то не знаю что. это вам дорогой товарищь к сказочникам а не к программистам )) и раз ты

Сообщение от [Ариец]:
Теоретически (не на делфях) я это понимаю как сделать.

то описывай целевую машину и таблицы переходов состояний для лексического и синтаксического анализаторов, а уж написать конечный автомат с магазинной памятью на дельфях мы тебе поможем. А с подходом "сделатейте все за меня" готовь баксов 500 и тебе все сделают красиво.
[Ответ]
[Ариец] 13:04 08.05.2009
MadFish, возможно я неверно выразился.
мне нужна лишь трансляция запроса в байт-код.
Я так понял что целевая машина, это то что потом обрабатывает и выполняет этот байт код? Вот это не надо. она не оговорена и свободная. То есть порядковые номера определяем сами. Завтра буду дома - напишу то, что мне рассказали и посоветовали как делать.

Про баксов 500 ты загнул [Ответ]
MadFish 13:30 08.05.2009
[Ариец], похоже даже теоритических знаний у тебя нет. продолжать дискуссию не вижу смысла. про 500 баксов я не загнул. задачи такого плана -дерьмовенький диплом. приблизительно столько и стоит. [Ответ]
[Ариец] 18:05 08.05.2009
MadFish, ну хорошо что у вас есть теоретические знания. Умничайте дальше.

Вопрос всё-ещё актуален. [Ответ]
Yandex 20:58 08.05.2009
[Ариец], ну как бы MadFish все по делу написал. Разве что я бы ценник раза в два уменьшил, и то не факт - так как я не совсем в теме.

Сообщение от :
Завтра буду дома - напишу то, что мне рассказали и посоветовали как делать.

Мы так и не увидели. [Ответ]
Вверх