Fix sorting by editor in Creator column (since 5.0.78)

This commit is contained in:
Dan Stillman 2020-01-29 13:39:17 -05:00
parent 851af7f45b
commit eec0f00784

View file

@ -1359,11 +1359,14 @@ Zotero.Items = function() {
return _sortCreatorSQL;
}
var editorCreatorTypeID = Zotero.CreatorTypes.getID('editor');
var contributorCreatorTypeID = Zotero.CreatorTypes.getID('contributor');
var nameSQL = "lastName || ' ' || firstName ";
var sql = "COALESCE(" +
var sql = "COALESCE("
// First try for primary creator types
"CASE (" +
+ "CASE (" +
"SELECT COUNT(*) FROM itemCreators IC " +
"LEFT JOIN itemTypeCreatorTypes ITCT " +
"ON (IC.creatorTypeID=ITCT.creatorTypeID AND ITCT.itemTypeID=O.itemTypeID) " +
@ -1404,69 +1407,57 @@ Zotero.Items = function() {
"LEFT JOIN itemTypeCreatorTypes ITCT " +
"ON (IC.creatorTypeID=ITCT.creatorTypeID AND ITCT.itemTypeID=O.itemTypeID) " +
"WHERE itemID=O.itemID AND primaryField=1 ORDER BY orderIndex LIMIT 2,1)" +
") " +
"END, " +
") "
+ "END, "
// Then try editors
"CASE (" +
"SELECT COUNT(*) FROM itemCreators WHERE itemID=O.itemID AND creatorTypeID IN (3)" +
") " +
"WHEN 0 THEN NULL " +
"WHEN 1 THEN (" +
"SELECT " + nameSQL + " FROM itemCreators NATURAL JOIN creators " +
"WHERE itemID=O.itemID AND creatorTypeID IN (3)" +
") " +
"WHEN 2 THEN (" +
"SELECT " +
"(SELECT " + nameSQL + " FROM itemCreators NATURAL JOIN creators " +
"WHERE itemID=O.itemID AND creatorTypeID IN (3) ORDER BY orderIndex LIMIT 1)" +
" || ' ' || " +
"(SELECT " + nameSQL + " FROM itemCreators NATURAL JOIN creators " +
"WHERE itemID=O.itemID AND creatorTypeID IN (3) ORDER BY orderIndex LIMIT 1,1) " +
") " +
"ELSE (" +
"SELECT " +
"(SELECT " + nameSQL + " FROM itemCreators NATURAL JOIN creators " +
"WHERE itemID=O.itemID AND creatorTypeID IN (3) ORDER BY orderIndex LIMIT 1)" +
" || ' ' || " +
"(SELECT " + nameSQL + " FROM itemCreators NATURAL JOIN creators " +
"WHERE itemID=O.itemID AND creatorTypeID IN (3) ORDER BY orderIndex LIMIT 1,1)" +
" || ' ' || " +
"(SELECT " + nameSQL + " FROM itemCreators NATURAL JOIN creators " +
"WHERE itemID=O.itemID AND creatorTypeID IN (3) ORDER BY orderIndex LIMIT 2,1)" +
") " +
"END, " +
+ "CASE ("
+ "SELECT COUNT(*) FROM itemCreators "
+ `WHERE itemID=O.itemID AND creatorTypeID=${editorCreatorTypeID}`
+ ") "
+ "WHEN 0 THEN NULL "
+ "WHEN 1 THEN ("
+ "SELECT " + nameSQL + " FROM itemCreators NATURAL JOIN creators "
+ `WHERE itemID=O.itemID AND creatorTypeID=${editorCreatorTypeID}`
+ ") "
+ "END, "
// Then try contributors
"CASE (" +
"SELECT COUNT(*) FROM itemCreators WHERE itemID=O.itemID AND creatorTypeID IN (2)" +
") " +
"WHEN 0 THEN NULL " +
"WHEN 1 THEN (" +
"SELECT " + nameSQL + " FROM itemCreators NATURAL JOIN creators " +
"WHERE itemID=O.itemID AND creatorTypeID IN (2)" +
") " +
"WHEN 2 THEN (" +
"SELECT " +
"(SELECT " + nameSQL + " FROM itemCreators NATURAL JOIN creators " +
"WHERE itemID=O.itemID AND creatorTypeID IN (2) ORDER BY orderIndex LIMIT 1)" +
" || ' ' || " +
"(SELECT " + nameSQL + " FROM itemCreators NATURAL JOIN creators " +
"WHERE itemID=O.itemID AND creatorTypeID IN (2) ORDER BY orderIndex LIMIT 1,1) " +
") " +
"ELSE (" +
"SELECT " +
"(SELECT " + nameSQL + " FROM itemCreators NATURAL JOIN creators " +
"WHERE itemID=O.itemID AND creatorTypeID IN (2) ORDER BY orderIndex LIMIT 1)" +
" || ' ' || " +
"(SELECT " + nameSQL + " FROM itemCreators NATURAL JOIN creators " +
"WHERE itemID=O.itemID AND creatorTypeID IN (2) ORDER BY orderIndex LIMIT 1,1)" +
" || ' ' || " +
"(SELECT " + nameSQL + " FROM itemCreators NATURAL JOIN creators " +
"WHERE itemID=O.itemID AND creatorTypeID IN (2) ORDER BY orderIndex LIMIT 2,1)" +
") " +
"END" +
") AS sortCreator";
+ "CASE ("
+ "SELECT COUNT(*) FROM itemCreators "
+ `WHERE itemID=O.itemID AND creatorTypeID=${contributorCreatorTypeID}`
+ ") "
+ "WHEN 0 THEN NULL "
+ "WHEN 1 THEN ("
+ "SELECT " + nameSQL + " FROM itemCreators NATURAL JOIN creators "
+ `WHERE itemID=O.itemID AND creatorTypeID=${contributorCreatorTypeID}`
+ ") "
+ "WHEN 2 THEN ("
+ "SELECT "
+ "(SELECT " + nameSQL + " FROM itemCreators NATURAL JOIN creators "
+ `WHERE itemID=O.itemID AND creatorTypeID=${contributorCreatorTypeID} `
+ "ORDER BY orderIndex LIMIT 1)"
+ " || ' ' || "
+ "(SELECT " + nameSQL + " FROM itemCreators NATURAL JOIN creators "
+ `WHERE itemID=O.itemID AND creatorTypeID=${contributorCreatorTypeID} `
+ "ORDER BY orderIndex LIMIT 1,1) "
+ ") "
+ "ELSE ("
+ "SELECT "
+ "(SELECT " + nameSQL + " FROM itemCreators NATURAL JOIN creators "
+ `WHERE itemID=O.itemID AND creatorTypeID=${contributorCreatorTypeID} `
+ "ORDER BY orderIndex LIMIT 1)"
+ " || ' ' || "
+ "(SELECT " + nameSQL + " FROM itemCreators NATURAL JOIN creators "
+ `WHERE itemID=O.itemID AND creatorTypeID=${contributorCreatorTypeID} `
+ "ORDER BY orderIndex LIMIT 1,1)"
+ " || ' ' || "
+ "(SELECT " + nameSQL + " FROM itemCreators NATURAL JOIN creators "
+ `WHERE itemID=O.itemID AND creatorTypeID=${contributorCreatorTypeID} `
+ "ORDER BY orderIndex LIMIT 2,1)"
+ ") "
+ "END"
+ ") AS sortCreator";
_sortCreatorSQL = sql;
return sql;