Skip to content

Commit

Permalink
Jerahmeel: add task to move problem to problem set (#674)
Browse files Browse the repository at this point in the history
  • Loading branch information
fushar authored Dec 29, 2024
1 parent e12006b commit c968eac
Show file tree
Hide file tree
Showing 4 changed files with 127 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,7 @@ private void runJerahmeel(JudgelsServerApplicationConfiguration config, Environm

env.admin().addTask(component.deleteProblemTask());
env.admin().addTask(component.moveProblemToChapterTask());
env.admin().addTask(component.moveProblemToProblemSetTask());
env.admin().addTask(component.problemSetStatsTask());
env.admin().addTask(component.contestStatsTask());
env.admin().addTask(component.submissionsDuplexToAwsTask());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import judgels.jerahmeel.hibernate.JerahmeelHibernateDaoModule;
import judgels.jerahmeel.problem.DeleteProblemTask;
import judgels.jerahmeel.problem.MoveProblemToChapterTask;
import judgels.jerahmeel.problem.MoveProblemToProblemSetTask;
import judgels.jerahmeel.problem.ProblemModule;
import judgels.jerahmeel.problem.ProblemResource;
import judgels.jerahmeel.problem.ProblemTagResource;
Expand Down Expand Up @@ -89,6 +90,7 @@ public interface JerahmeelComponent {

DeleteProblemTask deleteProblemTask();
MoveProblemToChapterTask moveProblemToChapterTask();
MoveProblemToProblemSetTask moveProblemToProblemSetTask();
ProblemSetStatsTask problemSetStatsTask();
ContestStatsTask contestStatsTask();
SubmissionsDuplexToAwsTask submissionsDuplexToAwsTask();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package judgels.jerahmeel.problem;

import io.dropwizard.hibernate.UnitOfWork;
import io.dropwizard.servlets.tasks.Task;
import java.io.PrintWriter;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import judgels.jerahmeel.persistence.ChapterProblemDao;
import judgels.jerahmeel.persistence.ChapterProblemModel;
import judgels.jerahmeel.persistence.ProblemSetDao;
import judgels.jerahmeel.persistence.ProblemSetModel;
import judgels.jerahmeel.persistence.ProblemSetProblemDao;
import judgels.jerahmeel.persistence.ProblemSetProblemModel;
import judgels.jerahmeel.persistence.ProgrammingSubmissionDao;
import judgels.sandalphon.api.problem.ProblemType;
import judgels.sandalphon.persistence.ProblemDao;
import judgels.sandalphon.persistence.ProblemModel;

public class MoveProblemToProblemSetTask extends Task {
private final ProblemDao problemDao;
private final ProblemSetDao problemSetDao;
private final ChapterProblemDao chapterProblemDao;
private final ProblemSetProblemDao problemSetProblemDao;
private final ProgrammingSubmissionDao programmingSubmissionDao;

public MoveProblemToProblemSetTask(
ProblemDao problemDao,
ProblemSetDao problemSetDao,
ChapterProblemDao chapterProblemDao,
ProblemSetProblemDao problemSetProblemDao,
ProgrammingSubmissionDao programmingSubmissionDao) {

super("jerahmeel-move-problem-to-problem-set");

this.problemDao = problemDao;
this.problemSetDao = problemSetDao;
this.chapterProblemDao = chapterProblemDao;
this.problemSetProblemDao = problemSetProblemDao;
this.programmingSubmissionDao = programmingSubmissionDao;
}

@Override
@UnitOfWork
public void execute(Map<String, List<String>> parameters, PrintWriter out) {
List<String> problemSlugs = parameters.get("problemSlug");
if (problemSlugs == null || problemSlugs.isEmpty()) {
return;
}
String problemSlug = problemSlugs.get(0);

List<String> toProblemSetJids = parameters.get("toProblemSetJid");
if (toProblemSetJids == null || toProblemSetJids.isEmpty()) {
return;
}
String toProblemSetJid = toProblemSetJids.get(0);

List<String> aliases = parameters.get("alias");
if (aliases == null || aliases.isEmpty()) {
return;
}
String alias = aliases.get(0);

Optional<ProblemModel> maybeProblemModel = problemDao.selectBySlug(problemSlug);
if (maybeProblemModel.isEmpty()) {
return;
}
String problemJid = maybeProblemModel.get().jid;

Optional<ProblemSetModel> maybeProblemSetModel = problemSetDao.selectByJid(toProblemSetJid);
if (maybeProblemSetModel.isEmpty()) {
return;
}

List<ProblemSetProblemModel> problemSetProblemModels = problemSetProblemDao.selectAllByProblemJid(problemJid);
if (!problemSetProblemModels.isEmpty()) {
for (ProblemSetProblemModel model : problemSetProblemModels) {
model.problemSetJid = toProblemSetJid;
model.alias = alias;
problemSetProblemDao.update(model);
}
} else {
ProblemSetProblemModel model = new ProblemSetProblemModel();
model.problemSetJid = toProblemSetJid;
model.alias = alias;
model.problemJid = problemJid;
model.type = ProblemType.PROGRAMMING.name();
problemSetProblemDao.insert(model);
}

Optional<ChapterProblemModel> maybeChapterProblemModel = chapterProblemDao.selectByProblemJid(problemJid);
maybeChapterProblemModel.ifPresent(chapterProblemDao::delete);

programmingSubmissionDao.updateContainerJid(problemJid, toProblemSetJid);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import judgels.jerahmeel.persistence.BundleItemSubmissionDao;
import judgels.jerahmeel.persistence.ChapterDao;
import judgels.jerahmeel.persistence.ChapterProblemDao;
import judgels.jerahmeel.persistence.ProblemSetDao;
import judgels.jerahmeel.persistence.ProblemSetProblemDao;
import judgels.jerahmeel.persistence.ProgrammingGradingDao;
import judgels.jerahmeel.persistence.ProgrammingSubmissionDao;
Expand Down Expand Up @@ -51,7 +52,7 @@ static DeleteProblemTask deleteProblemTask(

@Provides
@Singleton
static MoveProblemToChapterTask problemMoveToChapterTask(
static MoveProblemToChapterTask moveProblemToChapterTask(
UnitOfWorkAwareProxyFactory unitOfWorkAwareProxyFactory,
ProblemDao problemDao,
ChapterDao chapterDao,
Expand All @@ -74,4 +75,30 @@ static MoveProblemToChapterTask problemMoveToChapterTask(
problemSetProblemDao,
programmingSubmissionDao});
}

@Provides
@Singleton
static MoveProblemToProblemSetTask moveProblemToProblemSetTask(
UnitOfWorkAwareProxyFactory unitOfWorkAwareProxyFactory,
ProblemDao problemDao,
ProblemSetDao problemSetDao,
ChapterProblemDao chapterProblemDao,
ProblemSetProblemDao problemSetProblemDao,
ProgrammingSubmissionDao programmingSubmissionDao) {

return unitOfWorkAwareProxyFactory.create(
MoveProblemToProblemSetTask.class,
new Class<?>[] {
ProblemDao.class,
ProblemSetDao.class,
ChapterProblemDao.class,
ProblemSetProblemDao.class,
ProgrammingSubmissionDao.class},
new Object[] {
problemDao,
problemSetDao,
chapterProblemDao,
problemSetProblemDao,
programmingSubmissionDao});
}
}

0 comments on commit c968eac

Please sign in to comment.