Version 20.41.4: Mar 03, 2021 Code refactoring in timeline publications.

This commit is contained in:
acanas 2021-03-03 22:29:12 +01:00
parent fe4a67691a
commit 907824c0c3
4 changed files with 34 additions and 38 deletions

View File

@ -598,10 +598,11 @@ TODO: DNI de un estudiante sale err
TODO: BUG: Cuando un tipo de grupo sólo tiene un grupo, inscribirse es voluntario, el estudiante sólo puede pertenecer a un grupo, y se inscribe en él, debería poder desapuntarse. Ahora no puede.
TODO: Salvador Romero Cortés: @acanas opción para editar posts
*/
#define Log_PLATFORM_VERSION "SWAD 20.41.3 (2021-03-03)"
#define Log_PLATFORM_VERSION "SWAD 20.41.4 (2021-03-03)"
#define CSS_FILE "swad20.33.9.css"
#define JS_FILE "swad20.6.2.js"
/*
Version 20.41.4: Mar 03, 2021 Code refactoring in timeline publications. (305577 lines)
Version 20.41.3: Mar 03, 2021 Code refactoring in timeline publications. (305580 lines)
Version 20.41.2: Mar 03, 2021 Code refactoring in timeline. (305569 lines)
Version 20.41.1: Mar 03, 2021 Code refactoring in timeline posts. (305563 lines)

View File

@ -772,22 +772,18 @@ void TL_DB_CreateSubQueryAlreadyExists (const struct TL_Timeline *Timeline,
/***** Create subqueries with range of publications to get from tl_pubs ******/
/*****************************************************************************/
void TL_DB_CreateSubQueryRangeBottom (const struct TL_Pub_RangePubsToGet *RangePubsToGet,
struct TL_Pub_SubQueries *SubQueries)
void TL_DB_CreateSubQueryRangeBottom (long Bottom,struct TL_Pub_SubQueries *SubQueries)
{
if (RangePubsToGet->Bottom > 0)
sprintf (SubQueries->RangeBottom,"tl_pubs.PubCod>%ld AND ",
RangePubsToGet->Bottom);
if (Bottom > 0)
sprintf (SubQueries->RangeBottom,"tl_pubs.PubCod>%ld AND ",Bottom);
else
SubQueries->RangeBottom[0] = '\0';
}
void TL_DB_CreateSubQueryRangeTop (const struct TL_Pub_RangePubsToGet *RangePubsToGet,
struct TL_Pub_SubQueries *SubQueries)
void TL_DB_CreateSubQueryRangeTop (long Top,struct TL_Pub_SubQueries *SubQueries)
{
if (RangePubsToGet->Top > 0)
sprintf (SubQueries->RangeTop,"tl_pubs.PubCod<%ld AND ",
RangePubsToGet->Top);
if (Top > 0)
sprintf (SubQueries->RangeTop,"tl_pubs.PubCod<%ld AND ",Top);
else
SubQueries->RangeTop[0] = '\0';
}

View File

@ -105,10 +105,8 @@ void TL_DB_CreateSubQueryPublishers (const struct TL_Timeline *Timeline,
struct TL_Pub_SubQueries *SubQueries);
void TL_DB_CreateSubQueryAlreadyExists (const struct TL_Timeline *Timeline,
struct TL_Pub_SubQueries *SubQueries);
void TL_DB_CreateSubQueryRangeBottom (const struct TL_Pub_RangePubsToGet *RangePubsToGet,
struct TL_Pub_SubQueries *SubQueries);
void TL_DB_CreateSubQueryRangeTop (const struct TL_Pub_RangePubsToGet *RangePubsToGet,
struct TL_Pub_SubQueries *SubQueries);
void TL_DB_CreateSubQueryRangeBottom (long Bottom,struct TL_Pub_SubQueries *SubQueries);
void TL_DB_CreateSubQueryRangeTop (long Top,struct TL_Pub_SubQueries *SubQueries);
unsigned TL_DB_SelectTheMostRecentPub (const struct TL_Pub_SubQueries *SubQueries,
MYSQL_RES **mysql_res);
unsigned TL_DB_GetDataOfPubByCod (long PubCod,MYSQL_RES **mysql_res);

View File

@ -81,6 +81,9 @@ void TL_Pub_GetListPubsToShowInTimeline (struct TL_Timeline *Timeline)
unsigned NumPub;
struct TL_Pub_Publication *Pub;
/***** Initialize range of publications *****/
TL_Pub_InitializeRangeOfPubs (Timeline->WhatToGet,&RangePubsToGet);
/***** Clear timeline for this session in database *****/
if (Timeline->WhatToGet == TL_GET_RECENT_TIMELINE)
TL_DB_ClearTimelineNotesOfSessionFromDB ();
@ -100,30 +103,12 @@ void TL_Pub_GetListPubsToShowInTimeline (struct TL_Timeline *Timeline)
/* Create subquery to get only notes not present in timeline */
TL_DB_CreateSubQueryAlreadyExists (Timeline,&SubQueries);
/***** Get the publications in timeline *****/
/* Initialize range of pubs */
TL_Pub_InitializeRangeOfPubs (Timeline->WhatToGet,&RangePubsToGet);
/* Create subquery with bottom range of publications to get from tl_pubs.
Bottom pub. code remains unchanged in all iterations of the next loop. */
TL_DB_CreateSubQueryRangeBottom (&RangePubsToGet,&SubQueries);
Bottom pub. code remains unchanged in all iterations of the loop. */
TL_DB_CreateSubQueryRangeBottom (RangePubsToGet.Bottom,&SubQueries);
/* 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.
As an alternative, we tried to get the maximum PubCod,
i.e more recent publication (original, shared or commment),
of every set of publications corresponding to the same note:
"SELECT MAX(PubCod) AS NewestPubCod FROM tl_pubs ...
" GROUP BY NotCod ORDER BY NewestPubCod DESC LIMIT ..."
but this query is slow (several seconds) with a big table.
Chained list of publications:
/***** Initialize list of publications *****/
/* Chained list of publications:
Timeline->Pubs.Top Pub #0
______ ______ Pub #1
@ -142,13 +127,29 @@ void TL_Pub_GetListPubsToShowInTimeline (struct TL_Timeline *Timeline)
Timeline->Pubs.Top =
Timeline->Pubs.Bottom = NULL;
/***** 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.
As an alternative, we tried to get the maximum PubCod,
i.e more recent publication (original, shared or commment),
of every set of publications corresponding to the same note:
"SELECT MAX(PubCod) AS NewestPubCod FROM tl_pubs ...
" GROUP BY NotCod ORDER BY NewestPubCod DESC LIMIT ..."
but this query is slow (several seconds) with a big table.
*/
for (NumPub = 0;
NumPub < MaxPubsToGet;
NumPub++)
{
/* Create subquery with top range of publications to get from tl_pubs
In each iteration of this loop, top publication code is changed to a lower value */
TL_DB_CreateSubQueryRangeTop (&RangePubsToGet,&SubQueries);
TL_DB_CreateSubQueryRangeTop (RangePubsToGet.Top,&SubQueries);
/* Select the most recent publication from tl_pubs */
Pub = TL_Pub_SelectTheMostRecentPub (&SubQueries);