Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 генерация where clause  [new]
bigsov
Member

Откуда:
Сообщений: 282
Помогите пожалуйста решить такую задачу.

Есть 2 иерархических(с точки зрения бизнеса, а не базы) структуры(подразделения компании) из 5 уровней каждая. Структуры описывают одно и то же - в каком пдразделении работает человек , но с немного разных точек зрения... Таблицы примерно такой структуры, типы данных полей LEVELS - varchar2
TABLE structure1

PERSON_ID
S1LEVEL1
S1LEVEL2
S1LEVEL3
S1LEVEL4
S1LEVEL5


TABLE structure2

PERSON_ID
S2LEVEL1
S2LEVEL2
S2LEVEL3
S2LEVEL4
S2LEVEL5



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

При этом есть требование делать такие настройки конфигурируемыми, а дать возможность пользователям устанавливать логику самостоятельно, генерируя предикаты.

Например, пользователь принадлежит группе А если у него

structure1.S1LEVEL2='A' AND structure2.S2LEVEL5 like 'BCD%'

пользователь принадлежит группе Б если у него

(structure1.S1LEVEL2='B' OR structure1.S1LEVEL2='BB' OR structure1.S1LEVEL3='ABC')  AND NOT structure1.S1LEVEL4='AAA'

Ну и все в таком духе. В запросе могут быть предикаты разделенные AND, OR, AND NOT и скобочки. Также возможно сравнение с использованием 'like'.

Был вариант на основании построенной пользователем логики динамически генерить вьюху(-и) которые уже будут содержать необходимые предикаты, и по которой можно будет определить принадлежность человека к определенной группе. Но тогда непонятно как пользователю показать тукущую логику. Получается, что надо хранить заданную конфигурацию в базе и по запросу показывать ее пользователю.

Подскажите пожалуйста, какие подходы можно использовать для этой задачи. Я думаю, что она сводится к динамической генерации where clause с рядом условий и запоминанием установок в базе.
9 июн 09, 00:01    [7278744]     Ответить | Цитировать Сообщить модератору
 Re: генерация where clause  [new]
bigsov
Member

Откуда:
Сообщений: 282
неужели никто не сталкивался с подобными задачами? Или я плохо объяснил суть?
9 июн 09, 11:15    [7279717]     Ответить | Цитировать Сообщить модератору
 Re: генерация where clause  [new]
KalinnikovSlavKa
Member

Откуда:
Сообщений: 213
bigsov
Я думаю, что она сводится к динамической генерации where clause с рядом условий и запоминанием установок в базе.


вообщем - да. Суть проблемы-то в чем у Вас? Не до конца понятно.
Таких решений - сплошь и рядом.
И на форуме они помоему обсуждались. В чем сложность-то?
9 июн 09, 12:32    [7280272]     Ответить | Цитировать Сообщить модератору
 Re: генерация where clause  [new]
bigsov
Member

Откуда:
Сообщений: 282
KalinnikovSlavKa

вообщем - да. Суть проблемы-то в чем у Вас? Не до конца понятно.
Таких решений - сплошь и рядом.
И на форуме они помоему обсуждались. В чем сложность-то?


а я вот не могу найти на форуме и в гугле. Если таких решений много, подкиньте плиз ссылочку на какое-нибудь...

проблема в том, что простое, на мой взгляд, решение - это генерация запроса в GUI, сохранение его в базе as is и выполнение его с помощью execute immediate. Но тогда возникает вопрос - а как показать данные, которые ранее использовались для генерации запроса в GUI? Парсить строку на клиенте, на мой взгляд, - не очень красивое решение. Поэтому возникла идея не хранить запрос в виде строки, а хранить данные для него в определенной структуре таблиц (или может быть xml?).
9 июн 09, 12:57    [7280441]     Ответить | Цитировать Сообщить модератору
 Re: генерация where clause  [new]
KalinnikovSlavKa
Member

Откуда:
Сообщений: 213
...проблема в том, что простое, на мой взгляд, решение - это генерация запроса в GUI....

сие утверждение противоречит Вашему же:
Ну и все в таком духе. В запросе могут быть предикаты разделенные AND, OR, AND NOT и скобочки врядли для этого случая Вам удасться сгенерировать некий "универсальный" запрос.

имеем такие варианты:
1. Если такой универсальный запрос возможен (в чем сомневаюсь), то достаточно использовать bind-переменные которые и будет заполнять пользователь в клиентской части. собственно здесь задача вырождается в тривиальную.

2. Не показывать пользователю текущую логику. (Это избавит отнеобходимости собственного парсера). Типа - хош по другому представить данные - пиши свои условия. Не плохо подходит для системы типа "генератор отчета"

3. Дать в руки пользователя интерфейсный инструментарий для наложения логических условий.
Но тут заморочки с парсингом, со всеми вытекающими... Да и пользователь может в итоге ТАКОЕ наложить (а-ля декартово произведение). Весьма хлопоно, но в результате можно дать пользователю - "на тебе фломастеры и иди сам рисуй"
9 июн 09, 13:41    [7280684]     Ответить | Цитировать Сообщить модератору
 Re: генерация where clause  [new]
KalinnikovSlavKa
Member

Откуда:
Сообщений: 213
похожая тема: (правда,флейм)
https://www.sql.ru/forum/actualthread.aspx?bid=3&tid=521032&hl=%e3%e5%ed%e5%f0%e0%f2%ee%f0+%e7%e0%ef%f0%ee%f1%ee%e2
9 июн 09, 13:52    [7280755]     Ответить | Цитировать Сообщить модератору
 Re: генерация where clause  [new]
bigsov
Member

Откуда:
Сообщений: 282
спасибо большое за помощь, подумал над предложенными вариантами. И спасибо за ссылку, посмотрел топик, и другие в разделе проектирование БД... но там в основном пытаются разработать какие-то универсальные интерфейсы к БД. Моя задача много проще и носит прикладной характер - нужно получить набор идентификаторов людей, принадлежащих определенной группе. Причем правила для их отнесения к той или иной группе должны задаваться и меняться, желательно с GUI.

вариант 1 с универсальным запросом - очень интересный, но все-таки не получится... по крайней мере придумать его пока не получается.

KalinnikovSlavKa
...проблема в том, что простое, на мой взгляд, решение - это генерация запроса в GUI....

сие утверждение противоречит Вашему же:
Ну и все в таком духе. В запросе могут быть предикаты разделенные AND, OR, AND NOT и скобочки врядли для этого случая Вам удасться сгенерировать некий "универсальный" запрос.


есть такой вариант - пользователь задает в ГУИ некие условия для группы А, например в текстовом поле он сам вбивает запрос вьюхи со всей логикой(либо пользуется навороченным GUI интерфейсом для той же цели, это не принципиально). После нажатия на кнопку commit вьюха пересоздается. Ее результат - набор идентификаторов пользователей, принадлежащих заданной группе( например А).

это подходит для смеси 2го и 3го вариантов
alinnikovSlavKa
2. Не показывать пользователю текущую логику. (Это избавит отнеобходимости собственного парсера). Типа - хош по другому представить данные - пиши свои условия. Не плохо подходит для системы типа "генератор отчета"


А логику, которую пользователь задал можно сохранить какими-то другими способами, не используя базу(например сам пользователь опишет ее в ворде/excel-е).


Выходит, мы плавно идем к отказу от хранения в базе построенного запроса в структуре таблиц и к банальному хранению кода в базе...
9 июн 09, 14:41    [7281157]     Ответить | Цитировать Сообщить модератору
 Re: генерация where clause  [new]
KalinnikovSlavKa
Member

Откуда:
Сообщений: 213
bigsov,

Если Вы дадите пользователю "например в текстовом поле он сам вбивает запрос" - то объем Ваших трудозатрат от "деяний" пользователя быстренько превысит затраты на написание собственного парсера с самым "разукрашенным" интерфейсом. :-)
9 июн 09, 14:55    [7281243]     Ответить | Цитировать Сообщить модератору
 Re: генерация where clause  [new]
bigsov
Member

Откуда:
Сообщений: 282
KalinnikovSlavKa
bigsov,

Если Вы дадите пользователю "например в текстовом поле он сам вбивает запрос" - то объем Ваших трудозатрат от "деяний" пользователя быстренько превысит затраты на написание собственного парсера с самым "разукрашенным" интерфейсом. :-)


гы, согласен :)

возникает подозрение, что разумным вариантом будет отказаться от модификации с ГУИ
9 июн 09, 15:28    [7281515]     Ответить | Цитировать Сообщить модератору
 Re: генерация where clause  [new]
KalinnikovSlavKa
Member

Откуда:
Сообщений: 213
bigsov,

А может все значительно проще и тривиальней. Посмотрите на количество "разных точек зрения" которые возможны в вашей реальной жизни. Т.е. на ту логику условий которые нельзя свернуть через бинды к "универсальному" запросу. Скорее всего таких архитипов будет не так уж и много для одноразовой их реализации. Ну а далее... а далее задачка шустренько упрощается за счет реальных граничных условий из логики бизнес-процесса
9 июн 09, 15:34    [7281571]     Ответить | Цитировать Сообщить модератору
 Re: генерация where clause  [new]
bigsov
Member

Откуда:
Сообщений: 282
KalinnikovSlavKa
bigsov,

А может все значительно проще и тривиальней. Посмотрите на количество "разных точек зрения" которые возможны в вашей реальной жизни. Т.е. на ту логику условий которые нельзя свернуть через бинды к "универсальному" запросу. Скорее всего таких архитипов будет не так уж и много для одноразовой их реализации. Ну а далее... а далее задачка шустренько упрощается за счет реальных граничных условий из логики бизнес-процесса


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

KalinnikovSlavKa, большое спасибо за помощь!
9 июн 09, 19:09    [7282926]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить