← Back to team overview

mahara-contributors team mailing list archive

[Bug 1898650] A patch has been submitted for review

 

Patch for "master" branch: https://reviews.mahara.org/11744

-- 
You received this bug notification because you are a member of Mahara
Contributors, which is subscribed to Mahara.
Matching subscriptions: mahara-contributors
https://bugs.launchpad.net/bugs/1898650

Title:
  Duplicate Collection View Displayorder

Status in Mahara:
  Fix Released

Bug description:
  Mahara: 19.10.04  ( 2019093018 )
  OS: Linux 16.04 (PHP 7.0)
  DB: Postgres
  Browser: FF / Chrome

  
  In certain situations, the users are able to create a collection where the displayorder of the pages are duplicated. i.e. 2 pages with displayorder = 0 in the collection_view table.

  I have no idea how this situation came about. I only saw it in one of
  our production sites.

  For 1 collection with 37 pages, there were:

  * 2 pages with displayorder = 0
  * 2 pages with displayorder = 1

  The remaining pages were ordered correctly starting from 2 onwards.

  The result was the error:

  'A nonrecoverable error occurred. This probably means you have
  encountered a bug in the system'

  When trying to go to the Pages and Collections screen.

  The offending subquery which returned multiple records for a column is
  in lib/view.php::get_myviews_data() line 3804:

          $collselect = '
              UNION
              SELECT (SELECT view FROM {collection_view} cvid WHERE cvid.collection = c.id AND displayorder = 0) as id,
              null AS vid, c.name as title, c.name AS vtitle, c.description, null as type, c.ctime as vctime, c.mtime as vmtime, c.mtime as vatime,
              c.owner, c.group, c.institution, null as locked, null as ownerformat, null as urlid, null AS vvisits,
                     (SELECT COUNT(*) FROM {collection_view} cv WHERE cv.collection = c.id) AS numviews, c.id AS collid';

  
  As a side note, we really should not be calling subqueries for a column. This has huge performance issues since that subquery will be run for every row.

  I also note that there is another subquery to retrieve 'numviews'.
  Again, another performance hit.

  
  To eliminate the performance hit, the following should be changed:

          $collselect = '
              UNION
              SELECT cvid.view as id,
              null AS vid, c.name as title, c.name AS vtitle, c.description, null as type, c.ctime as vctime, c.mtime as vmtime, c.mtime as vatime,
              c.owner, c.group, c.institution, null as locked, null as ownerformat, null as urlid, null AS vvisits,
              numviews.numviews AS numviews, c.id AS collid';


          $collfrom = '
              FROM {view} v
              LEFT OUTER JOIN {collection_view} cv ON cv.view = v.id
              LEFT OUTER JOIN {collection} c ON cv.collection = c.id
              INNER join {collection_view} cvid on cvid.collection = c.id AND cvid.displayorder = 0
              INNER JOIN (SELECT COUNT(*) as numviews, numcv.collection 
                      FROM {collection_view} numcv
                      INNER JOIN {collection} numc ON numcv.collection = numc.id
                      GROUP BY numcv.collection) as numviews on numviews.collection = cv.collection';

  
  and under 'mostcomments':

  $collgroupby = ' GROUP BY cvid.view, numviews.numviews, c.id';

To manage notifications about this bug go to:
https://bugs.launchpad.net/mahara/+bug/1898650/+subscriptions


References