From d46f43096fa409bce1b509d8ad967bdefe95c8de Mon Sep 17 00:00:00 2001 From: Leila Gonzales <lmg@agiweb.org> Date: Tue, 28 Jun 2016 15:47:16 -0700 Subject: [PATCH] Update for compatibility with MySQL 5.7+ and PostgreSQL getUniqueResources, getUniqueTags, and getUniqueUsers was failing due to mySQL5.7 compatibility issues. The error being thrown by mySQL was: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by To fix, we have to either turn off the only_full_group_by option or specifically select the columns that are used instead of selecting *. See: https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html for more info. PostgreSQL was failing due to fields being present in ORDER but missing from GROUP BY. This has also been corrected. --- .../src/VuFind/Db/Table/ResourceTags.php | 84 +++++++++++++++++-- 1 file changed, 78 insertions(+), 6 deletions(-) diff --git a/module/VuFind/src/VuFind/Db/Table/ResourceTags.php b/module/VuFind/src/VuFind/Db/Table/ResourceTags.php index e42704dadc7..c7c2be073c1 100644 --- a/module/VuFind/src/VuFind/Db/Table/ResourceTags.php +++ b/module/VuFind/src/VuFind/Db/Table/ResourceTags.php @@ -299,6 +299,30 @@ class ResourceTags extends Gateway $userId = null, $resourceId = null, $tagId = null ) { $callback = function ($select) use ($userId, $resourceId, $tagId) { + $select->columns( + [ + 'resource_id' => new Expression( + 'MAX(?)', ['resource_tags.resource_id'], + [Expression::TYPE_IDENTIFIER] + ), + 'tag_id' => new Expression( + 'MAX(?)', ['resource_tags.tag_id'], + [Expression::TYPE_IDENTIFIER] + ), + 'list_id' => new Expression( + 'MAX(?)', ['resource_tags.list_id'], + [Expression::TYPE_IDENTIFIER] + ), + 'user_id' => new Expression( + 'MAX(?)', ['resource_tags.user_id'], + [Expression::TYPE_IDENTIFIER] + ), + 'id' => new Expression( + 'MAX(?)', ['resource_tags.id'], + [Expression::TYPE_IDENTIFIER] + ) + ] + ); $select->join( ['r' => 'resource'], 'resource_tags.resource_id = r.id', @@ -313,8 +337,8 @@ class ResourceTags extends Gateway if (!is_null($tagId)) { $select->where->equalTo('resource_tags.tag_id', $tagId); } - $select->group(["resource_id"]); - $select->order(["title"]); + $select->group(['resource_id', 'title']); + $select->order(['title']); }; return $this->select($callback); } @@ -332,6 +356,30 @@ class ResourceTags extends Gateway { $callback = function ($select) use ($userId, $resourceId, $tagId) { + $select->columns( + [ + 'resource_id' => new Expression( + 'MAX(?)', ['resource_tags.resource_id'], + [Expression::TYPE_IDENTIFIER] + ), + 'tag_id' => new Expression( + 'MAX(?)', ['resource_tags.tag_id'], + [Expression::TYPE_IDENTIFIER] + ), + 'list_id' => new Expression( + 'MAX(?)', ['resource_tags.list_id'], + [Expression::TYPE_IDENTIFIER] + ), + 'user_id' => new Expression( + 'MAX(?)', ['resource_tags.user_id'], + [Expression::TYPE_IDENTIFIER] + ), + 'id' => new Expression( + 'MAX(?)', ['resource_tags.id'], + [Expression::TYPE_IDENTIFIER] + ) + ] + ); $select->join( ['t' => 'tags'], 'resource_tags.tag_id = t.id', @@ -346,8 +394,8 @@ class ResourceTags extends Gateway if (!is_null($tagId)) { $select->where->equalTo('resource_tags.tag_id', $tagId); } - $select->group(["tag_id"]); - $select->order(["tag"]); + $select->group(['tag_id', 'tag']); + $select->order(['tag']); }; return $this->select($callback); } @@ -364,6 +412,30 @@ class ResourceTags extends Gateway public function getUniqueUsers($userId = null, $resourceId = null, $tagId = null) { $callback = function ($select) use ($userId, $resourceId, $tagId) { + $select->columns( + [ + 'resource_id' => new Expression( + 'MAX(?)', ['resource_tags.resource_id'], + [Expression::TYPE_IDENTIFIER] + ), + 'tag_id' => new Expression( + 'MAX(?)', ['resource_tags.tag_id'], + [Expression::TYPE_IDENTIFIER] + ), + 'list_id' => new Expression( + 'MAX(?)', ['resource_tags.list_id'], + [Expression::TYPE_IDENTIFIER] + ), + 'user_id' => new Expression( + 'MAX(?)', ['resource_tags.user_id'], + [Expression::TYPE_IDENTIFIER] + ), + 'id' => new Expression( + 'MAX(?)', ['resource_tags.id'], + [Expression::TYPE_IDENTIFIER] + ) + ] + ); $select->join( ['u' => 'user'], 'resource_tags.user_id = u.id', @@ -378,8 +450,8 @@ class ResourceTags extends Gateway if (!is_null($tagId)) { $select->where->equalTo('resource_tags.tag_id', $tagId); } - $select->group(["user_id"]); - $select->order(["username"]); + $select->group(['user_id', 'username']); + $select->order(['username']); }; return $this->select($callback); } -- GitLab