- automatic typecast to bool added
- searching by group's unique name added
This commit is contained in:
parent
5b2cc0b8f4
commit
0c44163bdf
@ -20,6 +20,8 @@ class ExpressionBuilder
|
|||||||
} else { // is it a float?
|
} else { // is it a float?
|
||||||
return (double)$rval;
|
return (double)$rval;
|
||||||
}
|
}
|
||||||
|
} else if (in_array(strtolower($rval), ["true", "false"]) ) { // it's a boolean
|
||||||
|
return $rval === "true";
|
||||||
} else if (str_starts_with($rval, '"') && str_ends_with($rval, '"')){ // it's a string
|
} else if (str_starts_with($rval, '"') && str_ends_with($rval, '"')){ // it's a string
|
||||||
return substr($rval, 1, strlen($rval) - 2); // strip leading and trailing quotes
|
return substr($rval, 1, strlen($rval) - 2); // strip leading and trailing quotes
|
||||||
} else { // it must be a column name
|
} else { // it must be a column name
|
||||||
|
@ -403,4 +403,17 @@ class GroupMgr
|
|||||||
$a = $qb->where(["games", "CONTAINS", (int)$gameid])->select(["_id"])->getQuery()->fetch();
|
$a = $qb->where(["games", "CONTAINS", (int)$gameid])->select(["_id"])->getQuery()->fetch();
|
||||||
return array_map(fn($r) => $r["_id"], $a);
|
return array_map(fn($r) => $r["_id"], $a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get group by group compound (name#id).
|
||||||
|
function getGroupByUniqueName(string $uniqueName): Group|null {
|
||||||
|
$a = $this->db->findOneBy([ function($g) use ($uniqueName) : bool {
|
||||||
|
$group = Group::fromArray($this, $g);
|
||||||
|
return $group->getUniqueName() === $uniqueName;
|
||||||
|
}]);
|
||||||
|
if ($a !== null) {
|
||||||
|
return Group::fromArray($this, $a);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -400,7 +400,7 @@ class TestMgr
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get test results by game ID.
|
// Get test results by game ID.
|
||||||
function getResultsByGameId(string $gameid, string $filter, string $orderby, bool $exclude_challenge_data): array
|
function getResultsByGameId(string $gameid, string $filter, string $orderby, bool $exclude_challenge_data, array ...$furtherFilters): array
|
||||||
{
|
{
|
||||||
$qb = $this->db->createQueryBuilder();
|
$qb = $this->db->createQueryBuilder();
|
||||||
$qb = $qb->where(["gameid", "=", (int)$gameid]);
|
$qb = $qb->where(["gameid", "=", (int)$gameid]);
|
||||||
@ -417,9 +417,19 @@ class TestMgr
|
|||||||
}
|
}
|
||||||
|
|
||||||
$criteria = ExpressionBuilder::buildQuery($filter);
|
$criteria = ExpressionBuilder::buildQuery($filter);
|
||||||
|
|
||||||
$qb->where($criteria);
|
$qb->where($criteria);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// add further filters
|
||||||
|
if (count($furtherFilters) > 0) {
|
||||||
|
foreach ($furtherFilters as $ff) {
|
||||||
|
if ($ff !== []) {
|
||||||
|
$qb->where($ff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ordering
|
// ordering
|
||||||
if (trim($orderby) !== "") {
|
if (trim($orderby) !== "") {
|
||||||
$ordering = ExpressionBuilder::buildOrdering($orderby);
|
$ordering = ExpressionBuilder::buildOrdering($orderby);
|
||||||
|
@ -481,12 +481,35 @@ function get_results_by_gameid(ReqHandler &$rh, array $params): array
|
|||||||
$gameid = trim($params["gameid"]);
|
$gameid = trim($params["gameid"]);
|
||||||
$filter = trim($params["filter"] ?? "");
|
$filter = trim($params["filter"] ?? "");
|
||||||
$ordering = trim($params["orderby"] ?? "");
|
$ordering = trim($params["orderby"] ?? "");
|
||||||
|
$groups = explode_list(trim($params["groups"] ?? ""));
|
||||||
|
|
||||||
$game = $gameMgr->getGame($gameid);
|
$game = $gameMgr->getGame($gameid);
|
||||||
|
|
||||||
$result = [];
|
$result = [];
|
||||||
if (($game !== null) && ($game->isUserContributorOrOwner($user->getNickname()) || $user->hasQuizmasterPrivilege())) {
|
if (($game !== null) && ($game->isUserContributorOrOwner($user->getNickname()) || $user->hasQuizmasterPrivilege())) {
|
||||||
$game_results = $testMgr->getResultsByGameId($gameid, $filter, $ordering, true);
|
$group_filter = [];
|
||||||
|
if ($groups !== []) {
|
||||||
|
global $groupMgr;
|
||||||
|
$n = 0;
|
||||||
|
foreach ($groups as $groupname) {
|
||||||
|
if ($n > 0) { // place OR between each group criterion
|
||||||
|
$group_filter[] = "OR";
|
||||||
|
}
|
||||||
|
$group = $groupMgr->getGroupByUniqueName($groupname);
|
||||||
|
if ($group !== null) {
|
||||||
|
$nicknames = $group->getMembers();
|
||||||
|
$group_filter[] = ["nickname", "IN", $nicknames];
|
||||||
|
}
|
||||||
|
$n++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// prepend filter criteria with AND
|
||||||
|
// if (count($group_filter) > 0) {
|
||||||
|
// $group_filter = ["AND", $group_filter];
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
$game_results = $testMgr->getResultsByGameId($gameid, $filter, $ordering, true, $group_filter);
|
||||||
$result = $game_results;
|
$result = $game_results;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,6 +35,7 @@ function fetch_results() {
|
|||||||
|
|
||||||
let filterF = document.getElementById("filter");
|
let filterF = document.getElementById("filter");
|
||||||
let orderbyF = document.getElementById("orderby");
|
let orderbyF = document.getElementById("orderby");
|
||||||
|
let groupsF = document.getElementById("groups");
|
||||||
|
|
||||||
let filter = autoconvert_datetime(filterF.value.trim());
|
let filter = autoconvert_datetime(filterF.value.trim());
|
||||||
|
|
||||||
@ -44,7 +45,8 @@ function fetch_results() {
|
|||||||
action: "get_results_by_gameid",
|
action: "get_results_by_gameid",
|
||||||
gameid: GAMEID,
|
gameid: GAMEID,
|
||||||
filter: filter.trim(),
|
filter: filter.trim(),
|
||||||
orderby: orderbyF.value.trim()
|
orderby: orderbyF.value.trim(),
|
||||||
|
groups: groupsF.value.trim()
|
||||||
};
|
};
|
||||||
|
|
||||||
request(req).then(resp => {
|
request(req).then(resp => {
|
||||||
|
@ -48,7 +48,8 @@ if (!$gameMgr->getGame($game_id)->isUserContributorOrOwner($user_data["nickname"
|
|||||||
|
|
||||||
<section style="margin-bottom: 0.3em">
|
<section style="margin-bottom: 0.3em">
|
||||||
<input type="text" placeholder="Szűrőfeltétel" id="filter" style="font-family: 'Monaco', monospace; width: 50em;">
|
<input type="text" placeholder="Szűrőfeltétel" id="filter" style="font-family: 'Monaco', monospace; width: 50em;">
|
||||||
<input type="text" placeholder="Rendezés" id="orderby" style="font-family: 'Monaco', monospace; width: 50em;">
|
<input type="text" placeholder="Csoportok" id="groups" style="font-family: 'Monaco', monospace; width: 30em;">
|
||||||
|
<input type="text" placeholder="Rendezés" id="orderby" style="font-family: 'Monaco', monospace; width: 30em;">
|
||||||
<input type="button" value="Szűrés" onclick="fetch_results()">
|
<input type="button" value="Szűrés" onclick="fetch_results()">
|
||||||
<input type="button" value="Jelentés előállítása" onclick="generate_report()">
|
<input type="button" value="Jelentés előállítása" onclick="generate_report()">
|
||||||
<input type="button" value="Kijelöltek törlése" onclick="delete_tests()">
|
<input type="button" value="Kijelöltek törlése" onclick="delete_tests()">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user