Version 21.16.6: Sep 27, 2021 Queries moved to module swad_match_database.

This commit is contained in:
acanas 2021-09-27 18:28:31 +02:00
parent 58bea36918
commit deea5d1cb6
4 changed files with 334 additions and 274 deletions

View File

@ -602,13 +602,14 @@ TODO: FIX BUG, URGENT! En las fechas como par
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
*/
#define Log_PLATFORM_VERSION "SWAD 21.16.5 (2021-09-26)"
#define Log_PLATFORM_VERSION "SWAD 21.16.6 (2021-09-27)"
#define CSS_FILE "swad20.45.css"
#define JS_FILE "swad20.69.1.js"
/*
TODO: Rename CENTRE to CENTER in help wiki.
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
Version 21.16.6: Sep 27, 2021 Queries moved to module swad_match_database. (317186 lines)
Version 21.16.5: Sep 26, 2021 Queries moved to module swad_match_database. (317134 lines)
Version 21.16.4: Sep 25, 2021 Queries moved to module swad_match_database. (317091 lines)
Version 21.16.3: Sep 25, 2021 Queries moved to module swad_match_database. (317085 lines)

View File

@ -975,6 +975,154 @@ unsigned Mch_DB_GetNumUsrsWhoHavePlayedMch (long MchCod)
MchCod);
}
/*****************************************************************************/
/**** Get all users who have answered any match question in a given match *****/
/*****************************************************************************/
unsigned Mch_DB_GetUsrsWhoHavePlayedMch (MYSQL_RES **mysql_res,long MchCod)
{
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get users in match",
"SELECT users.UsrCod"
" FROM (SELECT mch_results.UsrCod AS UsrCod"
" FROM mch_results,"
"mch_matches,"
"gam_games"
" WHERE mch_results.MchCod=%ld"
" AND mch_results.MchCod=mch_matches.MchCod"
" AND mch_matches.GamCod=gam_games.GamCod"
" AND gam_games.CrsCod=%ld) AS users," // Extra check
"usr_data"
" WHERE users.UsrCod=usr_data.UsrCod"
" ORDER BY usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName",
MchCod,
Gbl.Hierarchy.Crs.CrsCod);
}
/*****************************************************************************/
/**** Get all users who have answered any match question in a given game *****/
/*****************************************************************************/
unsigned Mch_DB_GetUsrsWhoHavePlayedGam (MYSQL_RES **mysql_res,long GamCod)
{
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get users in game",
"SELECT users.UsrCod"
" FROM (SELECT DISTINCT mch_results.UsrCod AS UsrCod"
" FROM mch_results,"
"mch_matches,"
"gam_games"
" WHERE mch_matches.GamCod=%ld"
" AND mch_matches.MchCod=mch_results.MchCod"
" AND mch_matches.GamCod=gam_games.GamCod"
" AND gam_games.CrsCod=%ld) AS users," // Extra check
"usr_data"
" WHERE users.UsrCod=usr_data.UsrCod"
" ORDER BY usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName",
GamCod,
Gbl.Hierarchy.Crs.CrsCod);
}
/*****************************************************************************/
/********* Show the matches results of a user in the current course **********/
/*****************************************************************************/
unsigned Mch_DB_GetUsrMchResults (MYSQL_RES **mysql_res,
Usr_MeOrOther_t MeOrOther,
long MchCod, // <= 0 ==> any
long GamCod, // <= 0 ==> any
const char *GamesSelectedCommas)
{
char *MchSubQuery;
char *GamSubQuery;
char *HidGamSubQuery;
/***** Build matches subquery *****/
if (MchCod > 0)
{
if (asprintf (&MchSubQuery," AND mch_results.MchCod=%ld",MchCod) < 0)
Err_NotEnoughMemoryExit ();
}
else
{
if (asprintf (&MchSubQuery,"%s","") < 0)
Err_NotEnoughMemoryExit ();
}
/***** Build games subquery *****/
if (GamCod > 0)
{
if (asprintf (&GamSubQuery," AND mch_matches.GamCod=%ld",GamCod) < 0)
Err_NotEnoughMemoryExit ();
}
else if (GamesSelectedCommas)
{
if (GamesSelectedCommas[0])
{
if (asprintf (&GamSubQuery," AND mch_matches.GamCod IN (%s)",
GamesSelectedCommas) < 0)
Err_NotEnoughMemoryExit ();
}
else
{
if (asprintf (&GamSubQuery,"%s","") < 0)
Err_NotEnoughMemoryExit ();
}
}
else
{
if (asprintf (&GamSubQuery,"%s","") < 0)
Err_NotEnoughMemoryExit ();
}
/***** Subquery: get hidden games?
· A student will not be able to see their results in hidden games
· A teacher will be able to see results from other users even in hidden games
*****/
switch (MeOrOther)
{
case Usr_ME: // A student watching her/his results
if (asprintf (&HidGamSubQuery," AND gam_games.Hidden='N'") < 0)
Err_NotEnoughMemoryExit ();
break;
default: // A teacher/admin watching the results of other users
if (asprintf (&HidGamSubQuery,"%s","") < 0)
Err_NotEnoughMemoryExit ();
break;
}
/***** Make database query *****/
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get matches results",
"SELECT mch_results.MchCod"
" FROM mch_results,"
"mch_matches,"
"gam_games"
" WHERE mch_results.UsrCod=%ld"
"%s" // Match subquery
" AND mch_results.MchCod=mch_matches.MchCod"
"%s" // Games subquery
" AND mch_matches.GamCod=gam_games.GamCod"
"%s" // Hidden games subquery
" AND gam_games.CrsCod=%ld" // Extra check
" ORDER BY mch_matches.Title",
(MeOrOther == Usr_ME) ? Gbl.Usrs.Me.UsrDat.UsrCod :
Gbl.Usrs.Other.UsrDat.UsrCod,
MchSubQuery,
GamSubQuery,
HidGamSubQuery,
Gbl.Hierarchy.Crs.CrsCod);
/***** Free subqueries *****/
free (HidGamSubQuery);
free (GamSubQuery);
free (MchSubQuery);
}
/*****************************************************************************/
/********* Get maximum number of users per score in match results ************/
/*****************************************************************************/

View File

@ -116,6 +116,13 @@ bool Mch_DB_CheckIfMatchPrintExists (const struct MchPrn_Print *Print);
unsigned Mch_DB_GetMatchPrintData (MYSQL_RES **mysql_res,
const struct MchPrn_Print *Print);
unsigned Mch_DB_GetNumUsrsWhoHavePlayedMch (long MchCod);
unsigned Mch_DB_GetUsrsWhoHavePlayedMch (MYSQL_RES **mysql_res,long MchCod);
unsigned Mch_DB_GetUsrsWhoHavePlayedGam (MYSQL_RES **mysql_res,long GamCod);
unsigned Mch_DB_GetUsrMchResults (MYSQL_RES **mysql_res,
Usr_MeOrOther_t MeOrOther,
long MchCod, // <= 0 ==> any
long GamCod, // <= 0 ==> any
const char *GamesSelectedCommas);
unsigned Mch_DB_GetMaxUsrsPerScore (long MchCod);
unsigned Mch_DB_GetNumUsrsPerScore (MYSQL_RES **mysql_res,long MchCod);

View File

@ -41,6 +41,7 @@
#include "swad_HTML.h"
#include "swad_ID.h"
#include "swad_match.h"
#include "swad_match_database.h"
#include "swad_match_result.h"
#include "swad_photo.h"
#include "swad_test_visibility.h"
@ -404,24 +405,7 @@ static void MchRes_ListAllMchResultsInGam (struct Gam_Games *Games,long GamCod)
MchRes_ShowHeaderMchResults (Usr_OTHER);
/***** Get all users who have answered any match question in this game *****/
NumUsrs = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get users in game",
"SELECT users.UsrCod"
" FROM (SELECT DISTINCT mch_results.UsrCod AS UsrCod"
" FROM mch_results,"
"mch_matches,"
"gam_games"
" WHERE mch_matches.GamCod=%ld"
" AND mch_matches.MchCod=mch_results.MchCod"
" AND mch_matches.GamCod=gam_games.GamCod"
" AND gam_games.CrsCod=%ld) AS users," // Extra check
"usr_data"
" WHERE users.UsrCod=usr_data.UsrCod"
" ORDER BY usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName",
GamCod,
Gbl.Hierarchy.Crs.CrsCod);
NumUsrs = Mch_DB_GetUsrsWhoHavePlayedGam (&mysql_res,GamCod);
/***** List matches results for each user *****/
for (NumUsr = 0;
@ -496,24 +480,7 @@ static void MchRes_ListAllMchResultsInMch (struct Gam_Games *Games,long MchCod)
MchRes_ShowHeaderMchResults (Usr_OTHER);
/***** Get all users who have answered any match question in this game *****/
NumUsrs = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get users in match",
"SELECT users.UsrCod"
" FROM (SELECT mch_results.UsrCod AS UsrCod"
" FROM mch_results,"
"mch_matches,"
"gam_games"
" WHERE mch_results.MchCod=%ld"
" AND mch_results.MchCod=mch_matches.MchCod"
" AND mch_matches.GamCod=gam_games.GamCod"
" AND gam_games.CrsCod=%ld) AS users," // Extra check
"usr_data"
" WHERE users.UsrCod=usr_data.UsrCod"
" ORDER BY usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName",
MchCod,
Gbl.Hierarchy.Crs.CrsCod);
NumUsrs = Mch_DB_GetUsrsWhoHavePlayedMch (&mysql_res,MchCod);
/***** List matches results for each user *****/
for (NumUsr = 0;
@ -762,9 +729,6 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
const char *GamesSelectedCommas)
{
extern const char *Txt_Result;
char *MchSubQuery;
char *GamSubQuery;
char *HidGamSubQuery;
MYSQL_RES *mysql_res;
struct UsrData *UsrDat;
struct MchRes_ICanView ICanView;
@ -792,83 +756,8 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
UsrDat = (MeOrOther == Usr_ME) ? &Gbl.Usrs.Me.UsrDat :
&Gbl.Usrs.Other.UsrDat;
/***** Build matches subquery *****/
if (MchCod > 0)
{
if (asprintf (&MchSubQuery," AND mch_results.MchCod=%ld",MchCod) < 0)
Err_NotEnoughMemoryExit ();
}
else
{
if (asprintf (&MchSubQuery,"%s","") < 0)
Err_NotEnoughMemoryExit ();
}
/***** Build games subquery *****/
if (GamCod > 0)
{
if (asprintf (&GamSubQuery," AND mch_matches.GamCod=%ld",GamCod) < 0)
Err_NotEnoughMemoryExit ();
}
else if (GamesSelectedCommas)
{
if (GamesSelectedCommas[0])
{
if (asprintf (&GamSubQuery," AND mch_matches.GamCod IN (%s)",
GamesSelectedCommas) < 0)
Err_NotEnoughMemoryExit ();
}
else
{
if (asprintf (&GamSubQuery,"%s","") < 0)
Err_NotEnoughMemoryExit ();
}
}
else
{
if (asprintf (&GamSubQuery,"%s","") < 0)
Err_NotEnoughMemoryExit ();
}
/***** Subquery: get hidden games?
· A student will not be able to see their results in hidden games
· A teacher will be able to see results from other users even in hidden games
*****/
switch (MeOrOther)
{
case Usr_ME: // A student watching her/his results
if (asprintf (&HidGamSubQuery," AND gam_games.Hidden='N'") < 0)
Err_NotEnoughMemoryExit ();
break;
default: // A teacher/admin watching the results of other users
if (asprintf (&HidGamSubQuery,"%s","") < 0)
Err_NotEnoughMemoryExit ();
break;
}
/***** Make database query *****/
NumResults = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get matches results",
"SELECT mch_results.MchCod"
" FROM mch_results,"
"mch_matches,"
"gam_games"
" WHERE mch_results.UsrCod=%ld"
"%s" // Match subquery
" AND mch_results.MchCod=mch_matches.MchCod"
"%s" // Games subquery
" AND mch_matches.GamCod=gam_games.GamCod"
"%s" // Hidden games subquery
" AND gam_games.CrsCod=%ld" // Extra check
" ORDER BY mch_matches.Title",
UsrDat->UsrCod,
MchSubQuery,
GamSubQuery,
HidGamSubQuery,
Gbl.Hierarchy.Crs.CrsCod);
free (HidGamSubQuery);
free (GamSubQuery);
free (MchSubQuery);
NumResults = Mch_DB_GetUsrMchResults (&mysql_res,MeOrOther,MchCod,GamCod,GamesSelectedCommas);
/***** Show user's data *****/
HTM_TR_Begin (NULL);
@ -908,7 +797,8 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
StartEndTime++)
{
UniqueId++;
if (asprintf (&Id,"mch_res_time_%u_%u",(unsigned) StartEndTime,UniqueId) < 0)
if (asprintf (&Id,"mch_res_time_%u_%u",
(unsigned) StartEndTime,UniqueId) < 0)
Err_NotEnoughMemoryExit ();
HTM_TD_Begin ("id =\"%s\" class=\"DAT LT COLOR%u\"",
Id,Gbl.RowEvenOdd);
@ -1038,27 +928,33 @@ static void MchRes_ShowMchResults (struct Gam_Games *Games,
else
{
/* Columns for dates and match */
HTM_TD_Begin ("colspan=\"3\" class=\"LINE_BOTTOM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("colspan=\"3\" class=\"LINE_BOTTOM COLOR%u\"",
Gbl.RowEvenOdd);
HTM_TD_End ();
/* Column for questions */
HTM_TD_Begin ("class=\"LINE_BOTTOM LINE_LEFT COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"LINE_BOTTOM LINE_LEFT COLOR%u\"",
Gbl.RowEvenOdd);
HTM_TD_End ();
/* Columns for answers */
HTM_TD_Begin ("colspan=\"2\" class=\"LINE_BOTTOM LINE_LEFT COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("colspan=\"2\" class=\"LINE_BOTTOM LINE_LEFT COLOR%u\"",
Gbl.RowEvenOdd);
HTM_TD_End ();
/* Columns for score */
HTM_TD_Begin ("colspan=\"2\" class=\"LINE_BOTTOM LINE_LEFT COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("colspan=\"2\" class=\"LINE_BOTTOM LINE_LEFT COLOR%u\"",
Gbl.RowEvenOdd);
HTM_TD_End ();
/* Column for grade */
HTM_TD_Begin ("class=\"LINE_BOTTOM LINE_LEFT COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"LINE_BOTTOM LINE_LEFT COLOR%u\"",
Gbl.RowEvenOdd);
HTM_TD_End ();
/* Column for link to show the result */
HTM_TD_Begin ("class=\"LINE_BOTTOM LINE_LEFT COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"LINE_BOTTOM LINE_LEFT COLOR%u\"",
Gbl.RowEvenOdd);
HTM_TD_End ();
HTM_TR_End ();
@ -1085,50 +981,58 @@ static void MchRes_ShowMchResultsSummaryRow (unsigned NumResults,
HTM_TR_Begin (NULL);
/***** Row title *****/
HTM_TD_Begin ("colspan=\"3\" class=\"DAT_N RM LINE_TOP LINE_BOTTOM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("colspan=\"3\" class=\"DAT_N RM LINE_TOP LINE_BOTTOM COLOR%u\"",
Gbl.RowEvenOdd);
HTM_TxtColonNBSP (Txt_Matches);
HTM_Unsigned (NumResults);
HTM_TD_End ();
/***** Write total number of questions *****/
HTM_TD_Begin ("class=\"DAT_N RM LINE_TOP LINE_BOTTOM LINE_LEFT COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N RM LINE_TOP LINE_BOTTOM LINE_LEFT COLOR%u\"",
Gbl.RowEvenOdd);
if (NumResults)
HTM_Unsigned (NumTotalQsts->All);
HTM_TD_End ();
/***** Write total number of non-blank answers *****/
HTM_TD_Begin ("class=\"DAT_N RM LINE_TOP LINE_BOTTOM LINE_LEFT COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N RM LINE_TOP LINE_BOTTOM LINE_LEFT COLOR%u\"",
Gbl.RowEvenOdd);
if (NumResults)
HTM_Unsigned (NumTotalQsts->NotBlank);
HTM_TD_End ();
/***** Write total number of blank answers *****/
HTM_TD_Begin ("class=\"DAT_N RM LINE_TOP LINE_BOTTOM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N RM LINE_TOP LINE_BOTTOM COLOR%u\"",
Gbl.RowEvenOdd);
if (NumResults)
HTM_Unsigned (NumTotalQsts->All - NumTotalQsts->NotBlank);
HTM_TD_End ();
/***** Write total score *****/
HTM_TD_Begin ("class=\"DAT_N RM LINE_TOP LINE_BOTTOM LINE_LEFT COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N RM LINE_TOP LINE_BOTTOM LINE_LEFT COLOR%u\"",
Gbl.RowEvenOdd);
HTM_Double2Decimals (TotalScore);
HTM_Txt ("/");
HTM_Unsigned (NumTotalQsts->All);
HTM_TD_End ();
/***** Write average score per question *****/
HTM_TD_Begin ("class=\"DAT_N RM LINE_TOP LINE_BOTTOM COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N RM LINE_TOP LINE_BOTTOM COLOR%u\"",
Gbl.RowEvenOdd);
HTM_Double2Decimals (NumTotalQsts->All ? TotalScore /
(double) NumTotalQsts->All :
0.0);
HTM_TD_End ();
/***** Write total grade *****/
HTM_TD_Begin ("class=\"DAT_N RM LINE_TOP LINE_BOTTOM LINE_LEFT COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N RM LINE_TOP LINE_BOTTOM LINE_LEFT COLOR%u\"",
Gbl.RowEvenOdd);
HTM_Double2Decimals (TotalGrade);
HTM_TD_End ();
/***** Last cell *****/
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LINE_BOTTOM LINE_LEFT COLOR%u\"",Gbl.RowEvenOdd);
HTM_TD_Begin ("class=\"DAT_N LINE_TOP LINE_BOTTOM LINE_LEFT COLOR%u\"",
Gbl.RowEvenOdd);
HTM_TD_End ();
/***** End row *****/