From 24efc7edf83bb06b5a01080d2742c07ef68d21b2 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Tue, 12 Jul 2016 17:00:17 +1200 Subject: [PATCH] BUG Fix sorting ArrayList with sql-like syntax Replaces #5726 --- model/ArrayList.php | 5 +++-- tests/model/ArrayListTest.php | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/model/ArrayList.php b/model/ArrayList.php index 21db8740d..7ece7c988 100644 --- a/model/ArrayList.php +++ b/model/ArrayList.php @@ -360,7 +360,8 @@ class ArrayList extends ViewableData implements SS_List, SS_Filterable, SS_Sorta } // Parse column specification, considering possible ansi sql quoting - if(preg_match('/^"?(?[^"\s]+)"?(\s+(?((asc)|(desc))(ending)?))?$/i', $column, $match)) { + // Note that table prefix is allowed, but discarded + if(preg_match('/^("?(?[^"\s]+)"?\\.)?"?(?[^"\s]+)"?(\s+(?((asc)|(desc))(ending)?))?$/i', $column, $match)) { $column = $match['column']; if(empty($direction) && !empty($match['direction'])) { $direction = $match['direction']; @@ -448,7 +449,7 @@ class ArrayList extends ViewableData implements SS_List, SS_Filterable, SS_Sorta } $multisortArgs[] = &$originalKeys; - + $list = clone $this; // As the last argument we pass in a reference to the items that all the sorting will be applied upon $multisortArgs[] = &$list->items; diff --git a/tests/model/ArrayListTest.php b/tests/model/ArrayListTest.php index 1f91a58d6..963d676aa 100644 --- a/tests/model/ArrayListTest.php +++ b/tests/model/ArrayListTest.php @@ -274,6 +274,30 @@ class ArrayListTest extends SapphireTest { array('Name' => 'Steve') )); + // Quoted name name with table + $list4 = $list->sort('"Record"."Name"'); + $this->assertEquals($list4->toArray(), array( + (object) array('Name' => 'Bob'), + array('Name' => 'John'), + array('Name' => 'Steve') + )); + + // Quoted name name with table (desc) + $list5 = $list->sort('"Record"."Name" DESC'); + $this->assertEquals($list5->toArray(), array( + array('Name' => 'Steve'), + array('Name' => 'John'), + (object) array('Name' => 'Bob') + )); + + // Table without quotes + $list6 = $list->sort('Record.Name'); + $this->assertEquals($list6->toArray(), array( + (object) array('Name' => 'Bob'), + array('Name' => 'John'), + array('Name' => 'Steve') + )); + // Check original list isn't altered $this->assertEquals($list->toArray(), array( array('Name' => 'Steve'),