correctly sort by numeric columns

This commit is contained in:
2018-08-11 23:34:48 +02:00
parent 8d6ec7b47d
commit e1c7114bd4
6 changed files with 73 additions and 35 deletions
+1 -1
View File
@@ -46,7 +46,7 @@ class TableController extends Controller
$columns = Column::columnsFromJson($revision->columns);
$rq = $revision->rowsData($columns);
if (count($columns)) $rq = $rq->orderByRaw("data->>'".$columns[0]->id."'");
if (count($columns)) $rq = $rq->sortByCol($columns[0]);
$rows = $rq->paginate(25, []);
return view('table.view', [
+3 -1
View File
@@ -97,7 +97,9 @@ class TableEditController extends Controller
{
$revision = $changeset->revision;
$columns = $changeset->fetchAndTransformColumns();
$rows = $revision->rowsData($columns, true, false)->paginate(25, []);
$rows = $revision->rowsData($columns, true, false)
->sortByCol($changeset->fetchRevisionColumns()[0])
->paginate(25, []);
return view('table.propose.edit-rows', [
'changeset' => $changeset,
+22
View File
@@ -2,6 +2,9 @@
namespace App\Models;
use App\Tables\Column;
use Illuminate\Database\Eloquent\Builder;
/**
* Row in a data table
*
@@ -25,6 +28,25 @@ class Row extends BaseModel
$this->data->_id = $value;
}
public function scopeSortByCol(Builder $query, Column $column, $dir="asc")
{
$q = "data->>'".$column->id."'";
if ($column->type == 'int' || $column->type == 'float') {
$q = "CAST($q AS INTEGER)";
}
else if ($column->type == 'float') {
$q = "CAST($q AS FLOAT)";
}
if ($dir == 'asc') {
$q .= ' ASC';
} else {
$q .= ' DESC';
}
return $query->orderByRaw($q);
}
/**
* Allocate a single Global Row ID, application-unique.
*
+1 -1
View File
@@ -132,7 +132,7 @@ abstract class BaseExporter
$columns = $this->columns;
// TODO raw query to allow selecting aggregates, column subsets, etc
if (count($columns)) $rq = $rq->orderByRaw("data->>'".$columns[0]->id."'");
if (count($columns)) $rq = $rq->sortByCol($columns[0]);
while ($start < $count) {
$rows = $rq->offset($start)->limit($chunkSize)->get()->toArray();