Построение рекурсивного сравнения с SQL - PullRequest
2 голосов
/ 23 марта 2012

Это безобразно.Хотелось бы мне не задавать этот вопрос, но проект уже построен таким образом, что мы обрабатываем большое количество проверок в базе данных.По сути, я пытаюсь создать функцию, которая будет принимать два стека данных, связывать их вместе с неизвестным пакетом операций или компараторов и создавать длинную строку.

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

Входные данные:

'logFormValidation("to_date(#) == to_date(^)"
                  , formname.control1name, formname.control2name)'

Теперь, как я уже говорил, существует несколько итераций:этой формы, и мне нужно создать циклическое построение полностью рекурсивного сравнения (примечание: это не всегда могут быть типичные логические сравнения, это также могут быть внутренние вызовы функций, поэтому .In или что-то подобное не будет работать.) В концеМне нужно перевести его в формат, подобный приведенному ниже, чтобы анализатор проверки мог его прочитать.

OR(to_date(formname.control1name.1) == to_date(formname.control2name.1)
   ,to_date(formname.control1name.2) == to_date(formname.control2name.1)
   ,to_date(formname.control1name.3) == to_date(formname.control2name.1)
   ,to_date(formname.control1name.1) == to_date(formname.control2name.2)
   :
   :
   ,to_date(formname.control1name.n) == to_date(formname.control2name.n))

Да, это уродливо ... но, учитывая, как работает наш анализатор проверки, у меня не так многона выбор.Любой вклад в то, как это может быть достигнуто?Я надеюсь на что-то более эффективное, чем двойной рекурсивный цикл, но у меня нет никаких идей, кроме этого

Хорошо, учитывая, что мой вопрос, по-видимому, ужасно неясен, я собираюсь добавить еще немного информации.Я не знаю, какое сравнение я буду выполнять по элементам, я просто пытаюсь переформатировать данные во что-нибудь пригодное для ЛЮБОЙ заданной функции.Если бы я делал это вне базы данных, это выглядело бы примерно так.Примечание: псевдокод.'#' - маркер места в функции для vals1, '^' - маркер места для vals2.

function dynamicRecursiveValidation(string functionStr, strArray vals1, strArray vals2){
  string finalFunction = "OR("
  foreach(i in vals1){
    foreach(j in vals2){
      finalFunction += functionStr.replace('#', i).replace('^', j) + ",";
    }
  }
  finalFunction.substring(0, finalFunction.length - 1); //to remove last comma
  finalFunction += ")";

  return finalFunction;
}

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

# > ^
to_date(#) == to_date(^)
someFunction(#, ^)
# * 2 - 3 <= ^ / 4

Все, что я пытаюсь сделать, - это создать строку, которую я позже выполню, и я пытаюсь это сделатьбез необходимости убивать сервер в рекурсивном цикле

Ответы [ 2 ]

1 голос
/ 23 марта 2012

У меня нет кода решения для этого, но вы можете алгоритмически сделать следующее

  1. Создайте временную таблицу (start_date, end_date, formid) и заполните ее каждой датой из любой существующей формы
  2. Получите начальную дату из формы и просто:

    SELECT end_date, form_id FROM temp_table WHERE end_date = <start date to check>

  3. для реверса

    SELECT start_date, form_id FROM temp_table WHERE start_date = <end date to check>

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

0 голосов
/ 17 мая 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...