66use Illuminate \Database \QueryException ;
77use Illuminate \Support \Arr ;
88use Illuminate \Support \Facades \Cache ;
9+ use Illuminate \Support \Facades \DB ;
910use ProcessMaker \Filters \Filter ;
1011use ProcessMaker \Managers \DataManager ;
1112use 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