Commit 333b8fcb authored by Max Kanat-Alexander's avatar Max Kanat-Alexander

Bug 552919: Sort group_concat results so that they sort correctly for buglists

r=mkanat, a=mkanat (module owner)
parent 569c6b69
...@@ -126,12 +126,15 @@ sub bz_last_key { ...@@ -126,12 +126,15 @@ sub bz_last_key {
} }
sub sql_group_concat { sub sql_group_concat {
my ($self, $column, $separator) = @_; my ($self, $column, $separator, $sort) = @_;
my $sep_sql; $separator = $self->quote(', ') if !defined $separator;
if ($separator) { $sort = 1 if !defined $sort;
$sep_sql = " SEPARATOR $separator"; if ($sort) {
my $sort_order = $column;
$sort_order =~ s/^DISTINCT\s+//i;
$column = "$column ORDER BY $sort_order";
} }
return "GROUP_CONCAT($column$sep_sql)"; return "GROUP_CONCAT($column SEPARATOR $separator)";
} }
sub sql_regexp { sub sql_regexp {
......
...@@ -119,7 +119,7 @@ sub bz_explain { ...@@ -119,7 +119,7 @@ sub bz_explain {
sub sql_group_concat { sub sql_group_concat {
my ($self, $text, $separator) = @_; my ($self, $text, $separator) = @_;
$separator ||= "','"; $separator = $self->quote(', ') if !defined $separator;
return "group_concat(T_CLOB_DELIM($text, $separator))"; return "group_concat(T_CLOB_DELIM($text, $separator))";
} }
......
...@@ -98,9 +98,14 @@ sub bz_last_key { ...@@ -98,9 +98,14 @@ sub bz_last_key {
} }
sub sql_group_concat { sub sql_group_concat {
my ($self, $text, $separator) = @_; my ($self, $text, $separator, $sort) = @_;
$separator ||= "','"; $sort = 1 if !defined $sort;
return "array_to_string(array_accum($text), $separator)"; $separator = $self->quote(', ') if !defined $separator;
my $sql = "array_accum($text)";
if ($sort) {
$sql = "array_sort($sql)";
}
return "array_to_string($sql, $separator)";
} }
sub sql_istring { sub sql_istring {
...@@ -224,6 +229,20 @@ sub bz_setup_database { ...@@ -224,6 +229,20 @@ sub bz_setup_database {
)"); )");
} }
$self->do(<<'END');
CREATE OR REPLACE FUNCTION array_sort(ANYARRAY)
RETURNS ANYARRAY LANGUAGE SQL
IMMUTABLE STRICT
AS $$
SELECT ARRAY(
SELECT $1[s.i] AS each_item
FROM
generate_series(array_lower($1,1), array_upper($1,1)) AS s(i)
ORDER BY each_item
);
$$;
END
# PostgreSQL doesn't like having *any* index on the thetext # PostgreSQL doesn't like having *any* index on the thetext
# field, because it can't have index data longer than 2770 # field, because it can't have index data longer than 2770
# characters on that field. # characters on that field.
......
...@@ -3198,8 +3198,8 @@ sub _populate_bugs_fulltext { ...@@ -3198,8 +3198,8 @@ sub _populate_bugs_fulltext {
q{INSERT INTO bugs_fulltext (bug_id, short_desc, comments, q{INSERT INTO bugs_fulltext (bug_id, short_desc, comments,
comments_noprivate) comments_noprivate)
SELECT bugs.bug_id, bugs.short_desc, } SELECT bugs.bug_id, bugs.short_desc, }
. $dbh->sql_group_concat('longdescs.thetext', $newline) . $dbh->sql_group_concat('longdescs.thetext', $newline, 0)
. ', ' . $dbh->sql_group_concat('nopriv.thetext', $newline) . . ', ' . $dbh->sql_group_concat('nopriv.thetext', $newline, 0) .
qq{ FROM bugs qq{ FROM bugs
LEFT JOIN longdescs LEFT JOIN longdescs
ON bugs.bug_id = longdescs.bug_id ON bugs.bug_id = longdescs.bug_id
......
...@@ -308,10 +308,10 @@ sub COLUMNS { ...@@ -308,10 +308,10 @@ sub COLUMNS {
. " * ($actual_time / ($actual_time + bugs.remaining_time))" . " * ($actual_time / ($actual_time + bugs.remaining_time))"
. " END)", . " END)",
'flagtypes.name' => $dbh->sql_group_concat('DISTINCT ' 'flagtypes.name' => $dbh->sql_group_concat('DISTINCT '
. $dbh->sql_string_concat('flagtypes.name', 'flags.status'), "', '"), . $dbh->sql_string_concat('flagtypes.name', 'flags.status')),
'keywords' => $dbh->sql_group_concat('DISTINCT keyworddefs.name', "', '"), 'keywords' => $dbh->sql_group_concat('DISTINCT keyworddefs.name'),
); );
# Backward-compatibility for old field names. Goes new_name => old_name. # Backward-compatibility for old field names. Goes new_name => old_name.
...@@ -354,8 +354,7 @@ sub COLUMNS { ...@@ -354,8 +354,7 @@ sub COLUMNS {
} }
elsif ($field->type == FIELD_TYPE_MULTI_SELECT) { elsif ($field->type == FIELD_TYPE_MULTI_SELECT) {
$sql = $dbh->sql_group_concat( $sql = $dbh->sql_group_concat(
'DISTINCT map_bug_' . $field->name . '.value', 'DISTINCT map_bug_' . $field->name . '.value');
$dbh->quote(', '));
} }
else { else {
$sql = 'bugs.' . $field->name; $sql = 'bugs.' . $field->name;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment