Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[dataquery] Add instrument flags to instruments query engine #9529

Merged
merged 3 commits into from
Jan 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 64 additions & 8 deletions modules/instruments/php/instrumentqueryengine.class.inc
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
<?php declare(strict_types=1);

namespace LORIS\instruments;
use \LORIS\Data\Scope;
use \LORIS\Data\Cardinality;

use \LORIS\Data\Types\Enumeration;

/**
* InstrumentQueryEngine implements a LORIS QueryEngine for querying
Expand Down Expand Up @@ -41,19 +45,57 @@ class InstrumentQueryEngine implements \LORIS\Data\Query\QueryEngine
$rows = $DB->pselectCol("SELECT Test_name FROM test_names", []);

$dict = [];

// Use the same option enums for all instruments
$adminoptions = new Enumeration('None', 'Partial', 'All');
$dataentryoptions = new Enumeration('In Progress', 'Complete');
$validityoptions = new Enumeration('Questionable', 'Invalid', 'Valid');

$cardinality = new Cardinality(Cardinality::SINGLE);
$scope = new Scope(Scope::SESSION);

foreach ($rows as $testname) {
try {
$inst = \NDB_BVL_Instrument::factory(
$inst = \NDB_BVL_Instrument::factory(
$this->loris,
$testname,
"",
"",
);
$cat = new \LORIS\Data\Dictionary\Category(
$cat = new \LORIS\Data\Dictionary\Category(
$testname,
$inst->getFullName()
);
$fields = $inst->getDataDictionary();

$fields = [
new DictionaryItem(
$inst->testName.'_Administration',
'Administration flag for ' . $inst->getFullName(),
$scope,
$adminoptions,
$cardinality,
'Administration',
),
new DictionaryItem(
$inst->testName.'_Data_entry',
'Data entry status for ' . $inst->getFullName(),
$scope,
$dataentryoptions,
$cardinality,
'Data_entry',
),
];
if ($inst->ValidityEnabled) {
$fields[] = new DictionaryItem(
$inst->testName.'_Validity',
'Test validity for ' . $inst->getFullName(),
$scope,
$validityoptions,
$cardinality,
'Validity',
);
}
$fields = array_merge($fields, $inst->getDataDictionary());
$dict[] = $cat->withItems($fields);
} catch (\LorisException $e) {
error_log($e);
Expand Down Expand Up @@ -329,11 +371,25 @@ class InstrumentQueryEngine implements \LORIS\Data\Query\QueryEngine
$candData[$dict->getName()] = [];
}
$sid = $loadedInstrument->getSessionID();
$candData[$dict->getName()][$sid->__toString()] = [
'VisitLabel' => $loadedInstrument->getVisitLabel(),
'SessionID' => $sid->__toString(),
'value' => $loadedInstrument->getDictionaryValue($dict),
];
switch ($dict->fieldname) {
case 'Administration':
case 'Data_entry':
case 'Validity':
$flags = $loadedInstrument->getFlags()->toArray();
$candData[$dict->getName()][$sid->__toString()] = [
'VisitLabel' => $loadedInstrument->getVisitLabel(),
'SessionID' => $sid->__toString(),
'value' => $flags[$dict->fieldname],
];
break;
default:
$candData[$dict->getName()][$sid->__toString()] = [
'VisitLabel' => $loadedInstrument->getVisitLabel(),
'SessionID' => $sid->__toString(),
'value' => $loadedInstrument
->getDictionaryValue($dict),
];
}
}
}
yield "$iCandID" => $candData;
Expand Down
100 changes: 79 additions & 21 deletions php/libraries/NDB_BVL_Instrument.class.inc
Original file line number Diff line number Diff line change
Expand Up @@ -2267,26 +2267,52 @@ abstract class NDB_BVL_Instrument extends NDB_Page
(SELECT CommentID FROM load_comment_ids)";
}
if ($condition !== null) {
$conditions[] = 'JSON_VALUE(Data, "$.'
. substr(
$fname = substr(
$condition->dictionary->getName(),
strlen($this->testName)+1
)
. '") '
. \LORIS\Data\Query\SQLQueryEngine::sqlOperator($condition->criteria)
. ' '
. \LORIS\Data\Query\SQLQueryEngine::sqlValue(
$condition->dictionary,
$condition->criteria,
$params
)
. ' ';
);
if ($fname == 'Administration'
|| $fname == 'Validity'
|| $fname == 'Data_entry'
) {
$conditions[] = "flag.$fname"
. \LORIS\Data\Query\SQLQueryEngine::sqlOperator(
$condition->criteria
)
. \LORIS\Data\Query\SQLQueryEngine::sqlValue(
$condition->dictionary,
$condition->criteria,
$params
)
. ' ';
} else {

$conditions[] = 'JSON_VALUE(Data, "$.'
. substr(
$condition->dictionary->getName(),
strlen($this->testName)+1
)
. '")'
. \LORIS\Data\Query\SQLQueryEngine::sqlOperator(
$condition->criteria
)
. \LORIS\Data\Query\SQLQueryEngine::sqlValue(
$condition->dictionary,
$condition->criteria,
$params
)
. ' ';
}
$conditions[] ="t.CommentID NOT LIKE 'DDE_%'";
}
$where = 'WHERE ' . join(' AND ', $conditions);
$query = "SELECT CandID,
SessionID,
CommentID,
session.Visit_Label as VisitLabel,
flag.Administration,
flag.Data_entry as DataEntry,
flag.Validity,
Data
FROM flag
JOIN session ON (session.ID=flag.SessionID)
Expand All @@ -2298,12 +2324,18 @@ abstract class NDB_BVL_Instrument extends NDB_Page
foreach ($jsondata as $row) {
$newinst = clone $this;

$newinst->candID = new CandID(strval($row['CandID']));
$newinst->commentID = $row['CommentID'];
$newinst->visitLabel = $row['VisitLabel'];
$newinst->sessionID = new SessionID(
strval($row['SessionID'])
$newinst->candID = new CandID(strval($row['CandID']));
$newinst->commentID = $row['CommentID'];
$newinst->visitLabel = $row['VisitLabel'];
$newinst->sessionID = new SessionID(
strval($row['SessionID'])
);
$newinst->flags = new \InstrumentFlags(
$row['Data_entry'],
$row['Administration'],
$row['Validity']
);
unset($row['Data_entry'], $row['Administration'], $row['Validity']);
$newinst->instanceData = json_decode(
$row['Data'] ?? '{}',
true,
Expand All @@ -2319,11 +2351,21 @@ abstract class NDB_BVL_Instrument extends NDB_Page
(SELECT CommentID FROM load_comment_ids)";
}
if ($condition !== null) {
$conditions[] = 't.'
. substr(
$fname = substr(
$condition->dictionary->getName(),
strlen($this->testName)+1
)
);
if ($fname == 'Administration'
|| $fname == 'Validity'
|| $fname == 'Data_entry'
) {
$tname = 'f.';
} else {
$tname = 't.';
}

$conditions[] = $tname
. $fname
. ' '
. \LORIS\Data\Query\SQLQueryEngine::sqlOperator(
$condition->criteria
Expand All @@ -2335,12 +2377,16 @@ abstract class NDB_BVL_Instrument extends NDB_Page
$params
)
. ' ';
$conditions[] ="t.CommentID NOT LIKE 'DDE_%'";
}
$where = 'WHERE ' . join(' AND ', $conditions);
$query = "SELECT
session.CandID as CandID,
t.CommentID as CommentID,
session.Visit_Label as VisitLabel,
f.Administration,
f.Data_entry,
f.Validity,
session.ID as SessionID, t.*
FROM $this->table t
JOIN flag f ON (t.CommentID=f.CommentID)
Expand All @@ -2357,6 +2403,13 @@ abstract class NDB_BVL_Instrument extends NDB_Page
$newinst->sessionID = new SessionID(strval($row['SessionID']));
unset($row['CommentID'], $row['VisitLabel'], $row['SessionID']);

$newinst->flags = new \InstrumentFlags(
$row['Data_entry'],
$row['Administration'],
$row['Validity']
);
unset($row['Data_entry'], $row['Administration'], $row['Validity']);

$newinst->instanceData = $row;

yield $newinst;
Expand Down Expand Up @@ -3063,13 +3116,17 @@ abstract class NDB_BVL_Instrument extends NDB_Page
return $this->determineDataEntryAllowed();
}

private ?\InstrumentFlags $flags = null;
/**
* Gets the flags of that instrument
*
* @return \InstrumentFlags
*/
public function getFlags(): \InstrumentFlags
{
if ($this->flags !== null) {
return $this->flags;
}
$row = \NDB_Factory::singleton()->database()->pselectRow(
'SELECT
Data_entry as dataentry,
Expand All @@ -3085,11 +3142,12 @@ abstract class NDB_BVL_Instrument extends NDB_Page
$administration = $row['administration'] ?? null;
$validity = $row['validity'] ?? null;

return new \InstrumentFlags(
$this->flags = new \InstrumentFlags(
$dataentry,
$administration,
$validity
);
return $this->flags;
}

/**
Expand Down
Loading