[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Преобразование псевдозапроса в SQL
Страницы: 1, 2
AllesKlar
В псевдозапросе присутсвуют пары вида key:val
А так же логические операторы
+....AND
|....OR
(....левая скобка
)....правая скобка
-....NOT
>....LIKE
Не суть важно, символы операторов объявлены константами.

key - это некий ключ для правила, который описывает связи и условия в данном запросе.
Т.е. это не просто table.field (иначе было бы просто :) )

Т.е. всегда есть одна главная таблица, назовем ее customer main_table назовем ее ТАБЛИЦА (пусть 1С-ники порадуются :) )
и когда встречается key:val, то это может быть и
ТАБЛИЦА LEFT JOIN key_table ON (key_table.ТАБЛИЦА_id = ТАБЛИЦА.id) 
WHERE key_table.key_feld = val

но может и быть
ТАБЛИЦА LEFT JOIN another_table ON (another_table.ТАБЛИЦА_id = ТАБЛИЦА.id) 
LEFT JOIN key_table ON (key_table.another_table_id = another_table.id)
WHERE another_table.another_field = another_val AND key_table.key_feld = val


Это я к тому, что в лоб пройтись заменой по строке не вариант.

С джоинами я разобрался, все ОК.
C NOT IN LIKE тоже
А вот с AND, OR и скобками в WHERE пока туплю.

Примерный псевдозапрос:
q=key1:val1+(key2:val2|key2:val3)+key4:-val4+key5:>val6


пример правил:
key2 :
-- table2.field2 = tableX.fieldX
-- tableX.fieldY оператор {value}

остальные сделаем линейными
key1 :
-- table1.field1 оператор {value}

key3 :
-- table3.field3 оператор {value}

key4 :
-- table4.field4 оператор {value}

key5 :
-- table5.field5 оператор {value}



В итоге, после разбора должно получиться следующее WHERE выражение:
table1.field1 = val1 
AND (table2.field2 = tableX.fieldX AND tableX.fieldY = val2 OR table2.field2 = tableX.fieldX AND tableX.fieldY = val3)
AND table4.field4 != val4 AND table5.field5 IN (val6)


Идеи есть? :)

_____________
[продано копирайтерам]
depp
просто интересно. зачем из одного синтаксиса делать другой?
AllesKlar
Цитата (depp @ 25.04.2016 - 21:32)
просто интересно. зачем из одного синтаксиса делать другой?

Это запрос для api, правила которого настраиваются через xml индивидуально для каждого клиента.

В xml маппинг ключей в запросе к таблицам / полям базы.

Нельзя же в открытую структуру базы в доке к api выложить и сказать: пишите, как хотите, мы протранслируем прямиком в базу :)
Да и клиенту особо парится с запросами тоже не с руки.
Клиент, грубо говоря, хочет вводить
q=(язык:русский|язык:английский)+длительность:800+качество:>720,360,240


А моя задача все это связать в корректный sql запрос, согласно правилам описанным в xml для ключей
- язык
- длительность
- качество

_____________
[продано копирайтерам]
S.Chushkin
Цитата
...Идеи есть?

Текста много, а я так и не понял в чём проблема. sad.gif

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
AllesKlar
Цитата (S.Chushkin @ 25.04.2016 - 22:33)
Текста много, а я так и не понял в чём проблема.


xml c маппингом к базе
<?xml version="1.0" encoding="UTF-8"?>
<root>
<key
name="reqkey" table="video">
<join
table="producttable" field="video_id" />
<join
table="keytable" field="product_id" parent_table="producttable" parent_table_field="product_id" />
<where
table="keytable" field="keyvalue" />
</key>

<key
name="language" table="video">
<join
table="productsdetail" field="video_id" />
<where
table="productsdetail" field="lang"/>
</key>

<key
name="youtube" table="video">
<join
table="productsdetail" field="video_id" />
<where
table="productsdetail" field="propertykey" field_value="youtube-url"/>
<where
table="productsdetail" field="propertyvalue" />
</key>

<key
name="all" role="getall">
<where
table="video" field="lang"/>
</key>
</root>


псевдозапрос:
reqkey:12345678|reqkey:87654321+(language:de|language:fr)+youtube:https://youtu.be/C0DPdy98e4c


Должно получиться:
select *.video from video
left join producttable on (video.id = producttable.video_id)
left join keytable on (producttable.product_id = keytable.product_id)
left join productsdetail on (video.id = productsdetail.video_id)
where keytable.keyvalue = {'12345678'} or keytable.keyvalue = {'87654321'}
and (productsdetail.lang = {'de'} or productsdetail.lang = {'fr'})
and productsdetail.propertykey = 'youtube-url'
and productsdetail.propertyvalue = {'http://youtu.be/cEmuzN2dYzI'}


Затык на WHERE

_____________
[продано копирайтерам]
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.