Skip to content

Commit 01d8fef

Browse files
committed
fix: qualify columns, change order logic using subquery
1 parent 41da510 commit 01d8fef

1 file changed

Lines changed: 44 additions & 62 deletions

File tree

‎ProcessMaker/Traits/TaskControllerIndexMethods.php‎

Lines changed: 44 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Illuminate\Database\QueryException;
77
use Illuminate\Support\Arr;
88
use Illuminate\Support\Facades\Cache;
9+
use Illuminate\Support\Facades\DB;
910
use ProcessMaker\Filters\Filter;
1011
use ProcessMaker\Managers\DataManager;
1112
use ProcessMaker\Models\Process;
@@ -69,7 +70,7 @@ private function applyFilters($query, $request)
6970
}
7071

7172
$filterByFields = [
72-
'process_id',
73+
'process_request_tokens.process_id' => 'process_id',
7374
'process_request_tokens.user_id' => 'user_id',
7475
'process_request_tokens.status' => 'status',
7576
'element_id',
@@ -247,60 +248,6 @@ private function applyColumnOrdering($query, $request)
247248
'is_priority',
248249
];
249250

250-
$hasProcessRequestOrdering = false;
251-
$hasUserOrdering = false;
252-
foreach ($orderColumns as $column) {
253-
$normalizedColumn = preg_replace(
254-
'/^(process_request|processRequests)\./',
255-
'process_requests.',
256-
$column
257-
);
258-
259-
if (in_array($normalizedColumn, array_map(
260-
fn ($name) => 'process_requests.' . $name,
261-
$processRequestColumns
262-
), true) || preg_match('/^data\.[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)*$/', $column)) {
263-
$hasProcessRequestOrdering = true;
264-
}
265-
if ($column === 'user.name') {
266-
$hasUserOrdering = true;
267-
}
268-
}
269-
270-
if ($hasProcessRequestOrdering) {
271-
$query->leftJoin(
272-
'process_requests',
273-
'process_requests.id',
274-
'=',
275-
'process_request_tokens.process_request_id'
276-
);
277-
}
278-
if ($hasUserOrdering) {
279-
$query->leftJoin(
280-
'users',
281-
'users.id',
282-
'=',
283-
'process_request_tokens.user_id'
284-
);
285-
}
286-
if ($hasProcessRequestOrdering || $hasUserOrdering) {
287-
if ($query->getQuery()->columns === null) {
288-
$query->select('process_request_tokens.*');
289-
} else {
290-
$query->select(array_map(function ($column) {
291-
if (!is_string($column)) {
292-
return $column;
293-
}
294-
295-
$column = ltrim($column, '.');
296-
297-
return str_contains($column, '.')
298-
? $column
299-
: 'process_request_tokens.' . $column;
300-
}, $query->getQuery()->columns));
301-
}
302-
}
303-
304251
$hasValidOrdering = false;
305252
foreach ($orderColumns as $index => $column) {
306253
$direction = strtolower($orderDirections[$index] ?? $orderDirections[0] ?? 'asc');
@@ -312,17 +259,44 @@ private function applyColumnOrdering($query, $request)
312259
);
313260

314261
if ($column === 'user.name') {
315-
$query->orderBy('users.firstname', $direction)
316-
->orderBy('users.lastname', $direction);
262+
$query->orderBy(
263+
$this->relatedOrderSubquery('users', 'firstname', 'users.id', 'process_request_tokens.user_id'),
264+
$direction
265+
)->orderBy(
266+
$this->relatedOrderSubquery('users', 'lastname', 'users.id', 'process_request_tokens.user_id'),
267+
$direction
268+
);
317269
$hasValidOrdering = true;
318270
} elseif (preg_match('/^data\.([A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)*)$/', $column, $matches)) {
319-
$query->orderBy('process_requests.data->' . str_replace('.', '->', $matches[1]), $direction);
271+
$jsonColumn = 'data->' . str_replace('.', '->', $matches[1]);
272+
$query->orderBy(
273+
$this->relatedOrderSubquery(
274+
'process_requests',
275+
$jsonColumn,
276+
'process_requests.id',
277+
'process_request_tokens.process_request_id'
278+
),
279+
$direction
280+
);
320281
$hasValidOrdering = true;
321282
} elseif (in_array($normalizedColumn, array_map(
322283
fn ($name) => 'process_requests.' . $name,
323284
$processRequestColumns
324285
), true)) {
325-
$query->orderBy($normalizedColumn, $direction);
286+
$columnName = substr($normalizedColumn, strlen('process_requests.'));
287+
if ($columnName === 'id') {
288+
$query->orderBy('process_request_tokens.process_request_id', $direction);
289+
} else {
290+
$query->orderBy(
291+
$this->relatedOrderSubquery(
292+
'process_requests',
293+
$columnName,
294+
'process_requests.id',
295+
'process_request_tokens.process_request_id'
296+
),
297+
$direction
298+
);
299+
}
326300
$hasValidOrdering = true;
327301
} elseif (in_array($column, $tokenColumns, true)) {
328302
$query->orderBy('process_request_tokens.' . $column, $direction);
@@ -335,14 +309,22 @@ private function applyColumnOrdering($query, $request)
335309
}
336310
}
337311

312+
private function relatedOrderSubquery(string $table, string $column, string $localKey, string $foreignKey)
313+
{
314+
return DB::table($table)
315+
->select($column)
316+
->whereColumn($localKey, $foreignKey)
317+
->limit(1);
318+
}
319+
338320
private function applyStatusFilter($query, $request)
339321
{
340322
$statusFilter = $request->input('statusfilter', '');
341323
if ($statusFilter) {
342324
$statusFilter = array_map(function ($value) {
343325
return mb_strtoupper(trim($value));
344326
}, explode(',', $statusFilter));
345-
$query->whereIn('status', $statusFilter);
327+
$query->whereIn('process_request_tokens.status', $statusFilter);
346328
}
347329
}
348330

@@ -544,8 +526,8 @@ private function applyForCurrentUser($query, $user)
544526
}
545527

546528
$query->where(function ($query) use ($user) {
547-
$query->where('user_id', $user->id)
548-
->orWhereIn('id', $user->availableSelfServiceTasksQuery());
529+
$query->where('process_request_tokens.user_id', $user->id)
530+
->orWhereIn('process_request_tokens.id', $user->availableSelfServiceTasksQuery());
549531
});
550532
}
551533

0 commit comments

Comments
 (0)