From 564f63580eec9d39acfc99b040b0acf394361f1c Mon Sep 17 00:00:00 2001 From: Henri Rabalais Date: Fri, 3 Apr 2026 06:47:50 -0400 Subject: [PATCH 1/6] [DQT] Fix visit list filtering in candidate matching --- modules/dataquery/php/query.class.inc | 6 +----- src/Data/Query/SQLQueryEngine.php | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/modules/dataquery/php/query.class.inc b/modules/dataquery/php/query.class.inc index ac32b1984c..c4cb2fc82f 100644 --- a/modules/dataquery/php/query.class.inc +++ b/modules/dataquery/php/query.class.inc @@ -761,11 +761,7 @@ class Query implements \LORIS\StudyEntities\AccessibleResource, throw new \Exception("Unhandled operator: " . $crit['op']); } - // FIXME: Verify visits, test was done with candidate scope data - $visitlist = null; - if (isset($crit['visits'])) { - $visitlist = $crit['visits']; - } + $visitlist = $crit['visits'] ?? null; \Profiler::checkpoint("Calling engine get matches"); $matches = $engine->getCandidateMatches($term, $visitlist); diff --git a/src/Data/Query/SQLQueryEngine.php b/src/Data/Query/SQLQueryEngine.php index c2c32eb917..f9c91168e5 100644 --- a/src/Data/Query/SQLQueryEngine.php +++ b/src/Data/Query/SQLQueryEngine.php @@ -116,7 +116,7 @@ public function getCandidateMatches( $this->addWhereClause("c.Active='Y'"); $prepbindings = []; - $this->buildQueryFromCriteria($term, $prepbindings); + $this->buildQueryFromCriteria($term, $prepbindings, $visitList); $query = 'SELECT DISTINCT c.CandID FROM'; From 70c197bdc9b5916027c2207e00becbf86ba4294c Mon Sep 17 00:00:00 2001 From: Henri Rabalais Date: Fri, 3 Apr 2026 07:18:24 -0400 Subject: [PATCH 2/6] remove addition of session table to avoid non-unique table name --- src/Data/Query/SQLQueryEngine.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Data/Query/SQLQueryEngine.php b/src/Data/Query/SQLQueryEngine.php index f9c91168e5..e82cfd057b 100644 --- a/src/Data/Query/SQLQueryEngine.php +++ b/src/Data/Query/SQLQueryEngine.php @@ -582,7 +582,6 @@ protected function buildQueryFromCriteria( ); if ($visitlist != null) { - $this->addTable("LEFT JOIN session s ON (s.CandidateID=c.ID AND s.Active='Y')"); $inset = []; $i = count($prepbindings); foreach ($visitlist as $vl) { From 7894ad1cba4aa1552d04e7d970d76463f549b73a Mon Sep 17 00:00:00 2001 From: Henri Rabalais Date: Fri, 3 Apr 2026 07:28:21 -0400 Subject: [PATCH 3/6] passing tests --- src/Data/Query/SQLQueryEngine.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Data/Query/SQLQueryEngine.php b/src/Data/Query/SQLQueryEngine.php index e82cfd057b..2c34c3bbd6 100644 --- a/src/Data/Query/SQLQueryEngine.php +++ b/src/Data/Query/SQLQueryEngine.php @@ -116,7 +116,7 @@ public function getCandidateMatches( $this->addWhereClause("c.Active='Y'"); $prepbindings = []; - $this->buildQueryFromCriteria($term, $prepbindings, $visitList); + $this->buildQueryFromCriteria($term, $prepbindings, $visitlist); $query = 'SELECT DISTINCT c.CandID FROM'; From f090d51d393c47025206539ecb16150ac7569add Mon Sep 17 00:00:00 2001 From: Henri Rabalais Date: Mon, 20 Apr 2026 06:05:11 -0400 Subject: [PATCH 4/6] addressing review --- modules/imaging_browser/php/queryengine.class.inc | 6 +++--- src/Data/Query/SQLQueryEngine.php | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/imaging_browser/php/queryengine.class.inc b/modules/imaging_browser/php/queryengine.class.inc index 2b39b1cf2d..9aa85d7793 100644 --- a/modules/imaging_browser/php/queryengine.class.inc +++ b/modules/imaging_browser/php/queryengine.class.inc @@ -375,7 +375,7 @@ class QueryEngine extends \LORIS\Data\Query\SQLQueryEngine \LORIS\Data\Dictionary\DictionaryItem $item ): string { if ($item->getName() == 'ScanDone') { - $this->addTable('LEFT JOIN session s ON (s.CandidateID=c.ID)'); + $this->addTable("LEFT JOIN session s ON (s.CandidateID=c.ID AND s.Active='Y')"); return "CASE WHEN s.Scan_Done='Y' THEN true WHEN s.Scan_Done='N' THEN false ELSE NULL END"; @@ -392,7 +392,7 @@ class QueryEngine extends \LORIS\Data\Query\SQLQueryEngine // $field = whatever's after the first underscore $field = substr($item->getName(), strpos($item->getName(), '_') + 1); - $this->addTable('LEFT JOIN session s ON (s.CandidateID=c.ID)'); + $this->addTable("LEFT JOIN session s ON (s.CandidateID=c.ID AND s.Active='Y')"); $this->addTable("LEFT JOIN files ON (s.ID=files.SessionID)"); if ($item instanceof LocationDictionaryItem) { @@ -544,7 +544,7 @@ class QueryEngine extends \LORIS\Data\Query\SQLQueryEngine || $item instanceof MRICommentDictionaryItem || $item instanceof MRIPredefinedCommentDictionaryItem ) { - $this->addTable('LEFT JOIN session s ON (s.CandidateID=c.ID)'); + $this->addTable("LEFT JOIN session s ON (s.CandidateID=c.ID AND s.Active='Y')"); $this->addTable("LEFT JOIN files ON (s.ID=files.SessionID)"); return "SUBSTRING_INDEX(files.File, '/', -1)"; } diff --git a/src/Data/Query/SQLQueryEngine.php b/src/Data/Query/SQLQueryEngine.php index 2c34c3bbd6..7947237e32 100644 --- a/src/Data/Query/SQLQueryEngine.php +++ b/src/Data/Query/SQLQueryEngine.php @@ -582,6 +582,7 @@ protected function buildQueryFromCriteria( ); if ($visitlist != null) { + $this->addTable("LEFT JOIN session s ON (s.CandidateID=c.ID AND s.Active='Y')"); $inset = []; $i = count($prepbindings); foreach ($visitlist as $vl) { From 5195b6837a29e8e30659b3a67cb7472c723d627a Mon Sep 17 00:00:00 2001 From: Henri Rabalais Date: Mon, 20 Apr 2026 07:21:00 -0400 Subject: [PATCH 5/6] fixing lint --- modules/imaging_browser/php/queryengine.class.inc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/imaging_browser/php/queryengine.class.inc b/modules/imaging_browser/php/queryengine.class.inc index 9aa85d7793..d80e11005a 100644 --- a/modules/imaging_browser/php/queryengine.class.inc +++ b/modules/imaging_browser/php/queryengine.class.inc @@ -375,7 +375,8 @@ class QueryEngine extends \LORIS\Data\Query\SQLQueryEngine \LORIS\Data\Dictionary\DictionaryItem $item ): string { if ($item->getName() == 'ScanDone') { - $this->addTable("LEFT JOIN session s ON (s.CandidateID=c.ID AND s.Active='Y')"); + $this->addTable("LEFT JOIN session s " + . "ON (s.CandidateID=c.ID AND s.Active='Y')"); return "CASE WHEN s.Scan_Done='Y' THEN true WHEN s.Scan_Done='N' THEN false ELSE NULL END"; @@ -392,7 +393,8 @@ class QueryEngine extends \LORIS\Data\Query\SQLQueryEngine // $field = whatever's after the first underscore $field = substr($item->getName(), strpos($item->getName(), '_') + 1); - $this->addTable("LEFT JOIN session s ON (s.CandidateID=c.ID AND s.Active='Y')"); + $this->addTable("LEFT JOIN session s " + . "ON (s.CandidateID=c.ID AND s.Active='Y')"); $this->addTable("LEFT JOIN files ON (s.ID=files.SessionID)"); if ($item instanceof LocationDictionaryItem) { @@ -544,7 +546,8 @@ class QueryEngine extends \LORIS\Data\Query\SQLQueryEngine || $item instanceof MRICommentDictionaryItem || $item instanceof MRIPredefinedCommentDictionaryItem ) { - $this->addTable("LEFT JOIN session s ON (s.CandidateID=c.ID AND s.Active='Y')"); + $this->addTable("LEFT JOIN session s " + . "ON (s.CandidateID=c.ID AND s.Active='Y')"); $this->addTable("LEFT JOIN files ON (s.ID=files.SessionID)"); return "SUBSTRING_INDEX(files.File, '/', -1)"; } From cdc5c77726f008218f3d06f97ea7a6467d5a19de Mon Sep 17 00:00:00 2001 From: Henri Rabalais Date: Tue, 21 Apr 2026 05:10:11 -0400 Subject: [PATCH 6/6] tests --- .../imaging_browser/php/queryengine.class.inc | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/modules/imaging_browser/php/queryengine.class.inc b/modules/imaging_browser/php/queryengine.class.inc index d80e11005a..7ec70a7fb0 100644 --- a/modules/imaging_browser/php/queryengine.class.inc +++ b/modules/imaging_browser/php/queryengine.class.inc @@ -375,8 +375,10 @@ class QueryEngine extends \LORIS\Data\Query\SQLQueryEngine \LORIS\Data\Dictionary\DictionaryItem $item ): string { if ($item->getName() == 'ScanDone') { - $this->addTable("LEFT JOIN session s " - . "ON (s.CandidateID=c.ID AND s.Active='Y')"); + $this->addTable( + "LEFT JOIN session s " + . "ON (s.CandidateID=c.ID AND s.Active='Y')" + ); return "CASE WHEN s.Scan_Done='Y' THEN true WHEN s.Scan_Done='N' THEN false ELSE NULL END"; @@ -393,8 +395,10 @@ class QueryEngine extends \LORIS\Data\Query\SQLQueryEngine // $field = whatever's after the first underscore $field = substr($item->getName(), strpos($item->getName(), '_') + 1); - $this->addTable("LEFT JOIN session s " - . "ON (s.CandidateID=c.ID AND s.Active='Y')"); + $this->addTable( + "LEFT JOIN session s " + . "ON (s.CandidateID=c.ID AND s.Active='Y')" + ); $this->addTable("LEFT JOIN files ON (s.ID=files.SessionID)"); if ($item instanceof LocationDictionaryItem) { @@ -546,8 +550,10 @@ class QueryEngine extends \LORIS\Data\Query\SQLQueryEngine || $item instanceof MRICommentDictionaryItem || $item instanceof MRIPredefinedCommentDictionaryItem ) { - $this->addTable("LEFT JOIN session s " - . "ON (s.CandidateID=c.ID AND s.Active='Y')"); + $this->addTable( + "LEFT JOIN session s " + . "ON (s.CandidateID=c.ID AND s.Active='Y')" + ); $this->addTable("LEFT JOIN files ON (s.ID=files.SessionID)"); return "SUBSTRING_INDEX(files.File, '/', -1)"; }