А так же логические операторы
+....AND
|....OR
(....левая скобка
)....правая скобка
-....NOT
>....LIKE
Не суть важно, символы операторов объявлены константами.
key - это некий ключ для правила, который описывает связи и условия в данном запросе.
Т.е. это не просто table.field (иначе было бы просто :) )
Т.е. всегда есть одна главная таблица, назовем ее
и когда встречается 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)
Идеи есть? :)
_____________
[продано копирайтерам]