Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (2) [1] 2  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Преобразование псевдозапроса в SQL
AllesKlar  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3487
Пользователь №: 38635
На форуме: 3 года, 3 месяца, 3 дня
Карма: 184




В псевдозапросе присутсвуют пары вида 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)


Идеи есть? :)


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
depp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 373
Пользователь №: 40589
На форуме: 2 года, 3 месяца, 25 дней
Карма: 22




просто интересно. зачем из одного синтаксиса делать другой?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3487
Пользователь №: 38635
На форуме: 3 года, 3 месяца, 3 дня
Карма: 184




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

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

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

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


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


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 808
Пользователь №: 36058
На форуме: 4 года, 3 месяца, 2 дня
Карма: 41




Цитата
...Идеи есть?

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


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3487
Пользователь №: 38635
На форуме: 3 года, 3 месяца, 3 дня
Карма: 184




Цитата (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


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
tceburashka.com  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 21
Пользователь №: 42890
На форуме: 11 месяцев, 4 дня
Карма: 2




Привет! Я что-то подобное делаю. У тя элегантно выходит... мне нравится. Давай разбиратся. Не совсем понятно, что ты хочеш!

Возможно твой код :
reqkey:12345678|reqkey:87654321+(language:de|language:fr)+youtube:https://youtu.be/C0DPdy98e4c
Нужно было так написать:

table.field=[tag1] | table.field=[tag2] + (table.language=[tag3] | table.language=[tag4]) + table.youtube=[tag5]

соответственно в tag1,tag2... подставляются значения тегов из XML


--------------------
Парсинг - автоматизация ручной работы. http://tceburashka.com
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3487
Пользователь №: 38635
На форуме: 3 года, 3 месяца, 3 дня
Карма: 184




tceburashka.com
Цитата (tceburashka.com @ 26.04.2016 - 00:23)
Возможно твой код :
reqkey:12345678|reqkey:87654321+(language:de|language:fr)+youtube:https://youtu.be/C0DPdy98e4c
Нужно было так написать:

table.field=[tag1] | table.field=[tag2] + (table.language=[tag3] | table.language=[tag4]) + table.youtube=[tag5]


запрос к апи выглядит так:
api.domain.com/api/?q=reqkey:12345678|reqkey:87654321+language:de|language:fr)+youtube:youtu.be/C0DPdy98e4c


Следовательно, никаких table.field=[tag1] и т.д. быть не может. Нельзя вот так вот просто раскрывать структуру базы.

Кроме того, есть составные параметры, например
youtube : youtu.be/C0DPdy98e4c
распаковывается как
left join keytable on (producttable.product_id = keytable.product_id)
left join productsdetail on (video.id = productsdetail.video_id)
where productsdetail.propertykey = 'youtube-url'
and productsdetail.propertyvalue = {'http://youtu.be/cEmuzN2dYzI'}

простой заменой тут не получится. Нужно разобрать строку, для каждого элемента собрать соответсвующий JOIN и WHERE, поудалять дубликаты, а потом собрать все JOIN-ы и WHERE в одну строку.
Если с JOIN всё просто, то с WHERE сложнее из-за логических операторов.

Свернутый текст
Блядь, на первом курсе же еще на Турбо-паскакале писал парсер решения уравнений.


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
redreem  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 4284
Пользователь №: 29002
На форуме: 5 лет, 7 месяцев, 29 дней
Карма: 147




а зачем тебе все where из джойнов собирать в общий where? оставь их прям там, в блоке ON
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 808
Пользователь №: 36058
На форуме: 4 года, 3 месяца, 2 дня
Карма: 41




Затык на WHERE

Всё равно не понял в чём проблема.
Ты не можешь разобрать т.н. "псевдозапрос" на составные части?
Или не можешь сопоставить их с реальными таблицами и полями?
Или не можешь транслировать одно правило в другое?
Или ещё что?


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
brevis  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 311
Пользователь №: 39616
На форуме: 2 года, 10 месяцев, 16 дней
Карма: 35




Раз уж AllesKlar пригласил меня в этот топик (из топика про юмор) -- то не прийти было бы не вежливо с моей стороны. Да и интеллектуального оргазма тоже захотелось.

Вообще действительно не понятно в чем у тебя проблема, AllesKlar. Задача вроде бы ясна. Ну бери распарсивай запрос, строй дерево, собирай sql... Другое дело если тебе просто поговорить надо smile.gif

В общем я запилил прототипчик. Не знаю только насколько я все правильно понял. Но мне хватит smile.gif
Потыкать можно тут: http://phpdemos42.appspot.com/queryparser


--------------------
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3487
Пользователь №: 38635
На форуме: 3 года, 3 месяца, 3 дня
Карма: 184




Цитата (brevis @ 27.04.2016 - 18:56)
Потыкать можно тут: http://phpdemos42.appspot.com/queryparser

Выглядит неплохо.
Показывай реализацию.


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
brevis  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 311
Пользователь №: 39616
На форуме: 2 года, 10 месяцев, 16 дней
Карма: 35






--------------------
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3487
Пользователь №: 38635
На форуме: 3 года, 3 месяца, 3 дня
Карма: 184




brevis
    const KEY_REQKEY = 'reqkey';
const KEY_LANGUAGE = 'language';
const KEY_YOUTUBE = 'youtube';


Заранее неизвестны ключи, они берутся из XML, и их имя может быть любым, как пропишет "оператор на том конце провода".
Но это не принципиально.
Красиво сделал.

Сама задача чуть сложнее, я тут не выкладывал все, т.к. и так трудно для восприятия, но твоя идея хороша.
У меня основной затык был со скобками. Ты красиво обошел, установив, что любой элемент изначально в скобках.



--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
tceburashka.com  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 21
Пользователь №: 42890
На форуме: 11 месяцев, 4 дня
Карма: 2




Гм... я единственное не пойму, почему Вас неустраивает обыкновенный GET\POST формат запроса?
http://server.ru/api?reqkey="12345678...DPdy98e4c"
Далее формируйте сам запрос


--------------------
Парсинг - автоматизация ручной работы. http://tceburashka.com
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
tceburashka.com  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 21
Пользователь №: 42890
На форуме: 11 месяцев, 4 дня
Карма: 2




Цитата

phpforum.su/html/counter/counter.php?link=http://server.ru/api?reqkey=%2212345678|87654321%22&language=%22en,fr%22&youtube=%22https://youtu.be/C0DPdy98e4c%22


--------------------
Парсинг - автоматизация ручной работы. http://tceburashka.com
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (2) [1] 2  Ответ в темуСоздание новой темыСоздание опроса