Skip to content

fix for add from pool bug (long loading time) mantis 47724#11821

Open
mglaubitz wants to merge 1 commit into
ILIAS-eLearning:release_10from
mglaubitz:release_10-47724
Open

fix for add from pool bug (long loading time) mantis 47724#11821
mglaubitz wants to merge 1 commit into
ILIAS-eLearning:release_10from
mglaubitz:release_10-47724

Conversation

@mglaubitz

Copy link
Copy Markdown

we let one of our local AI models (GLM 5.2) analyse the problem and create a bug fix. this reduces loading time on ourt exam-test server from 3.6 minutes to 6.2 seconds (!)

… index

The 'Add from pool' question browser (ilObjTestGUI -> ilTestQuestionBrowserTableGUI
-> ilAssQuestionList::load) built one large query with 7 correlated EXISTS
subqueries (feedback x4, hints, taxonomies) as SELECT fields. These were
evaluated for every candidate row BEFORE ORDER BY/LIMIT, so on large
instances (bug report: ~199k rows) the query ran 30-40 min and blocked
other queries.

Fix: when a Range is set and neither a HAVING filter nor an ORDER BY on a
computed column (feedback/hints/taxonomies) is active, load in two phases:
  Phase A: SELECT question_id + required JOINs/filters + GROUP BY +
           ORDER BY + LIMIT (no EXISTS subqueries) -> small paginated id set
  Phase B: full SELECT incl. feedback/hints/taxonomies EXISTS, restricted
           to the paginated ids via IN (...) -> flags computed only for the
           ~800 visible rows instead of the full candidate set.

Fallback to the original single-phase query for: no range, HAVING filter
(feedback/hints = true|false), ORDER BY feedback/hints/taxonomies.

buildOrderQueryExpression now qualifies columns for phase A (qpl_questions.*
not selected -> ambiguous title) and backticks qualified names per segment
(`qpl_questions`.`title`).

Adds composite index i6 (obj_fi, original_id, title) on qpl_questions
via ilTestQuestionPool10DBUpdateSteps::step_3() to support the phase A
filter (obj_fi IN ... AND original_id IS NULL) + default title ordering.

Adds ilAssQuestionListTwoPhaseTest (15 tests) covering the two-phase path,
all fallback conditions, column qualification and SQL shape.

Verified with EXPLAIN against the local docker DB: phase A has no
DEPENDENT SUBQUERY (3 simple JOINs only), phase B's subqueries are
evaluated over rows=2 (paginated set) instead of the full candidate set.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant