Version 21.57.2: Nov 14, 2021 Code refactoring in timeline.

This commit is contained in:
acanas 2021-11-14 01:13:07 +01:00
parent bbf39d2fe4
commit b911c3480a
8 changed files with 99 additions and 71 deletions

View File

@ -13508,4 +13508,18 @@ SELECT gam_questions.QstCod,gam_questions.QstInd,tst_questions.AnsType,tst_quest
SELECT COUNT(tst_answers.AnsInd) AS N FROM tst_answers,gam_questions WHERE gam_questions.GamCod=8 AND gam_questions.QstCod=tst_answers.QstCod GROUP BY tst_answers.QstCod;
---------------------------
SELECT MAX(PubCod) AS NewestPubCod
FROM tml_pubs
GROUP BY NotCod
ORDER BY NewestPubCod DESC
LIMIT 10;
SELECT PubCod
FROM tml_pubs
WHERE NotCod NOT IN (SELECT NotCod FROM tml_tmp_just_retrieved_notes)
ORDER BY PubCod DESC
LIMIT 1;

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.57.1 (2021-11-12)"
#define Log_PLATFORM_VERSION "SWAD 21.57.2 (2021-11-14)"
#define CSS_FILE "swad21.57.css"
#define JS_FILE "swad21.57.js"
/*
TODO: Rename CENTRE to CENTER in help wiki.
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
Version 21.57.2: Nov 14, 2021 Code refactoring in timeline. (319257 lines)
Version 21.57.1: Nov 12, 2021 Code refactoring in multimedia. (319241 lines)
Version 21.57: Nov 11, 2021 Code refactoring in timeline. (319208 lines)
Version 21.56.5: Nov 10, 2021 Code refactoring in switch statements. (319181 lines)

View File

@ -184,7 +184,7 @@ void Tml_ResetTimeline (struct Tml_Timeline *Timeline)
{
Timeline->UsrOrGbl = Tml_Usr_TIMELINE_GBL;
Timeline->Who = Tml_Who_DEFAULT_WHO;
Timeline->WhatToGet = Tml_GET_RECENT_TIMELINE;
Timeline->WhatToGet = Tml_GET_RECENT_PUBS;
Timeline->Pubs.Top =
Timeline->Pubs.Bottom = NULL,
Timeline->NotCod = -1L;
@ -248,7 +248,7 @@ void Tml_ShowTimelineGblHighlighting (struct Tml_Timeline *Timeline,long NotCod)
/***** Get list of pubications to show in timeline *****/
Timeline->UsrOrGbl = Tml_Usr_TIMELINE_GBL;
Timeline->WhatToGet = Tml_GET_RECENT_TIMELINE;
Timeline->WhatToGet = Tml_GET_RECENT_PUBS;
Tml_Pub_GetListPubsToShowInTimeline (Timeline);
/***** Show timeline *****/
@ -277,7 +277,7 @@ void Tml_ShowTimelineUsrHighlighting (struct Tml_Timeline *Timeline,long NotCod)
/***** Get list of pubications to show in timeline *****/
Timeline->UsrOrGbl = Tml_Usr_TIMELINE_USR;
Timeline->WhatToGet = Tml_GET_RECENT_TIMELINE;
Timeline->WhatToGet = Tml_GET_RECENT_PUBS;
Tml_Pub_GetListPubsToShowInTimeline (Timeline);
/***** Show timeline *****/
@ -310,7 +310,7 @@ void Tml_RefreshNewTimelineGbl (void)
/***** Get list of pubications to show in timeline *****/
Timeline.UsrOrGbl = Tml_Usr_TIMELINE_GBL;
Timeline.WhatToGet = Tml_GET_ONLY_NEW_PUBS;
Timeline.WhatToGet = Tml_GET_NEW_PUBS;
Tml_Pub_GetListPubsToShowInTimeline (&Timeline);
/***** Show new timeline *****/
@ -336,7 +336,7 @@ void Tml_RefreshOldTimelineGbl (void)
/***** Show old publications *****/
Timeline.UsrOrGbl = Tml_Usr_TIMELINE_GBL;
Timeline.WhatToGet = Tml_GET_ONLY_OLD_PUBS;
Timeline.WhatToGet = Tml_GET_OLD_PUBS;
Tml_GetAndShowOldTimeline (&Timeline);
}
@ -353,7 +353,7 @@ void Tml_RefreshOldTimelineUsr (void)
/***** If user exists, show old publications *****/
Timeline.UsrOrGbl = Tml_Usr_TIMELINE_USR;
Timeline.WhatToGet = Tml_GET_ONLY_OLD_PUBS;
Timeline.WhatToGet = Tml_GET_OLD_PUBS;
Tml_GetAndShowOldTimeline (&Timeline);
}

View File

@ -69,12 +69,14 @@ typedef enum
#define Tml_NUM_WHAT_TO_GET 3
typedef enum
{
Tml_GET_RECENT_TIMELINE, // Recent timeline is shown when the user clicks on action menu,...
// or after editing timeline
Tml_GET_ONLY_NEW_PUBS, // New publications are retrieved via AJAX
// automatically from time to time
Tml_GET_ONLY_OLD_PUBS, // Old publications are retrieved via AJAX
// when the user clicks on link at bottom of timeline
Tml_GET_NEW_PUBS, // New publications are retrieved via AJAX...
// automatically from time to time
Tml_GET_RECENT_PUBS, // Recent timeline is shown...
// when the user clicks on action menu,...
// or after editing timeline
Tml_GET_OLD_PUBS, // Old publications are retrieved via AJAX...
// when the user clicks on link...
// at bottom of timeline
} Tml_WhatToGet_t;
struct Tml_Timeline

View File

@ -922,9 +922,9 @@ void Tml_DB_CreateSubQueryAlreadyExists (const struct Tml_Timeline *Timeline,
{
static const char *Table[Tml_NUM_WHAT_TO_GET] =
{
[Tml_GET_RECENT_TIMELINE] = "tml_tmp_just_retrieved_notes", // Avoid notes just retrieved
[Tml_GET_ONLY_NEW_PUBS ] = "tml_tmp_just_retrieved_notes", // Avoid notes just retrieved
[Tml_GET_ONLY_OLD_PUBS ] = "tml_tmp_visible_timeline", // Avoid notes already shown
[Tml_GET_NEW_PUBS ] = "tml_tmp_just_retrieved_notes", // Avoid notes just retrieved
[Tml_GET_RECENT_PUBS] = "tml_tmp_just_retrieved_notes", // Avoid notes just retrieved
[Tml_GET_OLD_PUBS ] = "tml_tmp_visible_timeline", // Avoid notes already shown
};
snprintf (SubQueries->AlreadyExists,sizeof (SubQueries->AlreadyExists),
@ -970,8 +970,8 @@ unsigned Tml_DB_SelectTheMostRecentPub (const struct Tml_Pub_SubQueries *SubQuer
"tml_pubs.PubType" // row[3]
" FROM tml_pubs%s"
" WHERE %s%s%s%s"
" ORDER BY tml_pubs.PubCod"
" DESC LIMIT 1",
" ORDER BY tml_pubs.PubCod DESC"
" LIMIT 1",
SubQueries->TablePublishers,
SubQueries->RangeBottom,
SubQueries->RangeTop,
@ -1024,28 +1024,18 @@ long Tml_DB_GetNotCodFromPubCod (long PubCod)
long Tml_DB_GetPubCodFromSession (const char *FieldName)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
long PubCod;
/***** Get last publication code from database *****/
if (DB_QuerySELECT (&mysql_res,"can not get publication code from session",
"SELECT %s" // row[0]
" FROM ses_sessions"
" WHERE SessionId='%s'",
FieldName,Gbl.Session.Id) == 1)
{
/* Get last publication code */
row = mysql_fetch_row (mysql_res);
if (sscanf (row[0],"%ld",&PubCod) != 1)
PubCod = 0;
}
else
PubCod = DB_QuerySELECTCode ("can not get publication code from session",
"SELECT %s" // row[0]
" FROM ses_sessions"
" WHERE SessionId='%s'",
FieldName,
Gbl.Session.Id);
if (PubCod < 0)
PubCod = 0;
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
return PubCod;
}

View File

@ -63,7 +63,24 @@ static Tml_Pub_Type_t Tml_Pub_GetPubTypeFromStr (const char *Str);
/*****************************************************************************/
/*************** Get list of pubications to show in timeline *****************/
/*****************************************************************************/
/*
_ ______________________
/ |______________________| Tml_GET_ONLY_NEW_PUBS
New < |______________________| automatically from time to time
\_|______________________| (AJAX)
_|_See_new_activity_(3)_|
/ |______________________| Tml_GET_RECENT_TIMELINE
| |______________________| user clicks on action menu
Recent < |______________________| or after editing timeline
| |______________________|
\_|______________________|
_|_______See_more_______|
/ |______________________| Tml_GET_ONLY_OLD_PUBS
| |______________________| user clicks on bottom link
Old < |______________________| (AJAX)
| |______________________|
\_|______________________|
*/
void Tml_Pub_GetListPubsToShowInTimeline (struct Tml_Timeline *Timeline)
{
struct Tml_Pub_SubQueries SubQueries;
@ -76,7 +93,7 @@ void Tml_Pub_GetListPubsToShowInTimeline (struct Tml_Timeline *Timeline)
Tml_Pub_InitializeRangeOfPubs (Timeline->WhatToGet,&RangePubsToGet);
/***** Clear timeline for this session in database *****/
if (Timeline->WhatToGet == Tml_GET_RECENT_TIMELINE)
if (Timeline->WhatToGet == Tml_GET_RECENT_PUBS)
Tml_DB_ClearTimelineNotesOfSessionFromDB ();
/***** Create temporary tables *****/
@ -84,7 +101,7 @@ void Tml_Pub_GetListPubsToShowInTimeline (struct Tml_Timeline *Timeline)
Tml_DB_CreateTmpTableJustRetrievedNotes ();
/* Create temporary table with all notes visible in timeline */
if (Timeline->WhatToGet == Tml_GET_ONLY_OLD_PUBS)
if (Timeline->WhatToGet == Tml_GET_OLD_PUBS)
Tml_DB_CreateTmpTableVisibleTimeline ();
/***** Create subqueries *****/
@ -120,15 +137,16 @@ void Tml_Pub_GetListPubsToShowInTimeline (struct Tml_Timeline *Timeline)
/***** Get the publications in timeline *****/
/* With the current approach, we select one by one
the publications and notes in a loop. In each iteration,
we get the most recent publication (original, shared or commment)
of every set of publications corresponding to the same note,
checking that the note is not already retrieved.
After getting a publication, its note code is stored
in order to not get it again.
the publications and notes in a loop.
In each iteration:
we get the most recent publication (original, shared or comment)
of every set of publications corresponding to the same note,
checking that the note is not already retrieved.
After getting a publication, its note code is saved
in order to not get it again.
As an alternative, we tried to get the maximum PubCod,
i.e more recent publication (original, shared or commment),
i.e more recent publication (original, shared or comment),
of every set of publications corresponding to the same note:
SELECT MAX(PubCod) AS NewestPubCod
FROM tml_pubs ...
@ -152,7 +170,7 @@ void Tml_Pub_GetListPubsToShowInTimeline (struct Tml_Timeline *Timeline)
Timeline->Pubs.Top = Pub; // Pointer to top publication
else
Timeline->Pubs.Bottom->Next = Pub; // Chain the previous publication with the current one
Timeline->Pubs.Bottom = Pub; // Update pointer to bottom publication
Timeline->Pubs.Bottom = Pub; // Update pointer to bottom publication
if (Pub == NULL) // Nothing got ==> abort loop
break; // Last publication
@ -160,7 +178,7 @@ void Tml_Pub_GetListPubsToShowInTimeline (struct Tml_Timeline *Timeline)
/* Insert note in temporary tables with just retrieved notes.
These tables will be used to not get notes already shown */
Tml_DB_InsertNoteInJustRetrievedNotes (Pub->NotCod);
if (Timeline->WhatToGet == Tml_GET_ONLY_OLD_PUBS) // Get only old publications
if (Timeline->WhatToGet == Tml_GET_OLD_PUBS) // Get only old publications
Tml_DB_InsertNoteInVisibleTimeline (Pub->NotCod);
/* Narrow the range for the next iteration */
@ -177,7 +195,7 @@ void Tml_Pub_GetListPubsToShowInTimeline (struct Tml_Timeline *Timeline)
/***** Drop temporary tables *****/
/* Drop temporary tables with notes already retrieved */
Tml_DB_DropTmpTableJustRetrievedNotes ();
if (Timeline->WhatToGet == Tml_GET_ONLY_OLD_PUBS) // Get only old publications
if (Timeline->WhatToGet == Tml_GET_OLD_PUBS) // Get only old publications
Tml_DB_DropTmpTableVisibleTimeline ();
/* Drop temporary table with me and users I follow */
@ -210,28 +228,31 @@ static void Tml_Pub_InitializeRangeOfPubs (Tml_WhatToGet_t WhatToGet,
|_____| 1
0
*/
/* Default range */
RangePubsToGet->Top = 0; // +Infinite
RangePubsToGet->Bottom = 0; // -Infinite
switch (WhatToGet)
{
case Tml_GET_ONLY_NEW_PUBS: // Get the publications (without limit)
// newer than LastPubCod
case Tml_GET_NEW_PUBS: // Get the publications (without limit)
// newer than LastPubCod
/* This query is made via AJAX automatically from time to time */
RangePubsToGet->Top = 0; // +Infinite
RangePubsToGet->Bottom = Tml_DB_GetPubCodFromSession ("LastPubCod");
break;
case Tml_GET_ONLY_OLD_PUBS: // Get some limited publications
// older than FirstPubCod
case Tml_GET_RECENT_PUBS: // Get some limited recent publications
/* This is the first query to get initial timeline shown
==> no notes yet in current timeline table */
RangePubsToGet->Top = 0; // +Infinite
RangePubsToGet->Bottom = 0; // -Infinite
break;
case Tml_GET_OLD_PUBS: // Get some limited publications
// older than FirstPubCod
/* This query is made via AJAX
when I click in link to get old publications */
RangePubsToGet->Top = Tml_DB_GetPubCodFromSession ("FirstPubCod");
RangePubsToGet->Bottom = 0; // -Infinite
break;
case Tml_GET_RECENT_TIMELINE: // Get some limited recent publications
default:
/* This is the first query to get initial timeline shown
==> no notes yet in current timeline table */
break;
RangePubsToGet->Top = 0; // +Infinite
RangePubsToGet->Bottom = 0; // -Infinite
}
}
@ -243,9 +264,9 @@ static unsigned Tml_Pub_GetMaxPubsToGet (const struct Tml_Timeline *Timeline)
{
static const unsigned MaxPubsToGet[Tml_NUM_WHAT_TO_GET] =
{
[Tml_GET_RECENT_TIMELINE] = Tml_Pub_MAX_REC_PUBS_TO_GET_AND_SHOW,
[Tml_GET_ONLY_NEW_PUBS ] = Tml_Pub_MAX_NEW_PUBS_TO_GET_AND_SHOW,
[Tml_GET_ONLY_OLD_PUBS ] = Tml_Pub_MAX_OLD_PUBS_TO_GET_AND_SHOW,
[Tml_GET_NEW_PUBS ] = Tml_Pub_MAX_NEW_PUBS_TO_GET_AND_SHOW,
[Tml_GET_RECENT_PUBS] = Tml_Pub_MAX_REC_PUBS_TO_GET_AND_SHOW,
[Tml_GET_OLD_PUBS ] = Tml_Pub_MAX_OLD_PUBS_TO_GET_AND_SHOW,
};
return MaxPubsToGet[Timeline->WhatToGet];
@ -262,18 +283,18 @@ static void Tml_Pub_UpdateFirstLastPubCodesIntoSession (const struct Tml_Timelin
switch (Timeline->WhatToGet)
{
case Tml_GET_ONLY_NEW_PUBS: // Get only new publications
case Tml_GET_NEW_PUBS: // Get only new publications
Tml_DB_UpdateLastPubCodInSession ();
break;
case Tml_GET_ONLY_OLD_PUBS: // Get only old publications
case Tml_GET_RECENT_TIMELINE: // Get last publications
case Tml_GET_RECENT_PUBS: // Get last publications
case Tml_GET_OLD_PUBS: // Get only old publications
// The oldest publication code retrieved and shown
FirstPubCod = Timeline->Pubs.Bottom ? Timeline->Pubs.Bottom->PubCod :
0;
if (Timeline->WhatToGet == Tml_GET_ONLY_OLD_PUBS)
Tml_DB_UpdateFirstPubCodInSession (FirstPubCod);
else
if (Timeline->WhatToGet == Tml_GET_RECENT_PUBS)
Tml_DB_UpdateFirstLastPubCodsInSession (FirstPubCod);
else
Tml_DB_UpdateFirstPubCodInSession (FirstPubCod);
break;
}
}

View File

@ -37,8 +37,8 @@
/*****************************************************************************/
// Number of recent publishings got and shown the first time, before refreshing
#define Tml_Pub_MAX_REC_PUBS_TO_GET_AND_SHOW 10 // Recent publishings to show (first time)
#define Tml_Pub_MAX_NEW_PUBS_TO_GET_AND_SHOW 10000 // New publishings retrieved (big number)
#define Tml_Pub_MAX_REC_PUBS_TO_GET_AND_SHOW 10 // Recent publishings to show (first time)
#define Tml_Pub_MAX_OLD_PUBS_TO_GET_AND_SHOW 20 // Old publishings are retrieved in packs of this size
/*****************************************************************************/

View File

@ -45,8 +45,8 @@
typedef enum
{
Tml_Usr_TIMELINE_USR, // Show the timeline of a user
Tml_Usr_TIMELINE_GBL, // Show the timeline of the users follwed by me
Tml_Usr_TIMELINE_USR, // Show the timeline of a user
Tml_Usr_TIMELINE_GBL, // Show the timeline of the users follwed by me
} Tml_Usr_UsrOrGbl_t;
typedef enum