У меня есть полусложная хранимая процедура, которую мне нужно создать. Я не совсем администратор, но никто в моей компании не лучше меня. Основная идея в том, что у меня есть группа задач. Пользователь выполняет эти задачи и получает флаг за каждую выполненную задачу. Чтобы считаться «завершенным», пользователь должен завершить всю группу заданных задач. Пинк Линч состоит в том, что некоторые из этих задач могут быть обертками для других групп задач.
Например, у нас есть следующие возможные задачи:
Task 1
Task 2
Task 3
Task 4 -> (1, 2, 3)
Task 5 -> (1, 2)
Task 6
Task 7 -> (5, 6)
Как только пользователь завершил задачи 1 и 2, он неявно завершил задачу 5. Как только он завершит задачу 3, у него будет неявно выполненная задача 4.
Если другой пользователь завершит задания 1, 2 и 6, он будет неявно завершить задания 1, 2, 5, 6, 7.
В обратном порядке, если для назначения требуется только задание 7, оно, соответственно, потребует задания 6 и 5, для чего потребуются 1 и 2.
У меня есть пять основных таблиц: userCompletedTask, assignmentRequiredTask, componentTask, userTaskAssignment и task. Я опускаю таблицу пользователей и назначений, так как она излишняя.
userCompletedTask:
userID (Foreign Key on user)
taskID (Foreign Key on task)
usertTaskAssignment:
userID (Foreign key on user)
assignmentID (Foreign key on assignment)
assignmentRequiredTask:
assignmentID (Foreign key on assignment)
taskID (Foreign key on task)
task:
taskID (primary key)
compound (boolean flag. If 1, it is compound)
compoundTask:
parentID (foreign key on task)
childID (foreign key on task)
Пользователь получает присвоение userTaskAssignment, которое требует выполнения задачи 4. Я хочу построить хранимую процедуру, которая будет проверять userCompletedTasks против assignmentRequiredTasks, проверяя, есть ли соответствующие составные задачи.
Псевдокод будет выглядеть так:
collection tasksCompleted = user->getTasksCompleted
collection tasksRequired = new collection
foreach task in assignment->getRequiredTasks
if(task.isCompound)
tasksRequired->addAll(getCompountTasks(task))
else
tasksRequired->add(task)
if tasksCompleted->containsAll(tasksRequired)
return true
else
return false
Я просто недостаточно хорошо знаю внутренности MySQL / SQL, чтобы перевести это в хранимую процедуру. В крайнем случае, я вставляю код в приложение, но это действительно соответствует уровню данных. Любая помощь будет принята с благодарностью.
EDIT
Как было указано ниже, записи составной задачи сами по себе могут быть составными задачами. Таким образом, вам понадобится рекурсивное сверление, чтобы получить список всех несложных задач, которые необходимо выполнить. Я расширил приведенный выше пример, чтобы проиллюстрировать это.