Modifications pour le document Macros de résultats Livetable
Modifié par Florent Charton le 2026/03/13 11:03
Depuis la version 2.1
modifié par Florent Charton
sur 2024/08/08 18:43
sur 2024/08/08 18:43
Commentaire de modification :
Install extension [org.xwiki.platform:xwiki-platform-livetable-ui/15.10.11]
À la version 5.1
modifié par Florent Charton
sur 2026/01/13 15:00
sur 2026/01/13 15:00
Commentaire de modification :
Install extension [org.xwiki.platform:xwiki-platform-livetable-ui/17.10.2]
Résumé
-
Propriétés de la Page (1 modifications, 0 ajouts, 0 suppressions)
Détails
- Propriétés de la Page
-
- Contenu
-
... ... @@ -305,10 +305,7 @@ 305 305 #if(!$offset || $offset < 0) 306 306 #set($offset = 0) 307 307 #end 308 - #set($limit = $numbertool.toNumber($request.get('limit')).intValue()) 309 - #if(!$limit) 310 - #set ($limit = 15) 311 - #end 308 + #getAndValidateQueryLimitFromRequest('limit', 15, $limit) 312 312 #set($query = $services.query.hql($sql)) 313 313 ## Apply query filters if defined. Otherwise use default. 314 314 #foreach ($queryFilter in $stringtool.split($!request.queryFilters, ', ')) ... ... @@ -506,7 +506,9 @@ 506 506 #set($discard = $map.put('params', $sqlParams)) 507 507 #end 508 508 #set($discard = $map.put('reqNo', $numbertool.toNumber($request.reqNo).intValue())) 509 - #gridresult_buildTagCloudJSON($map) 506 + #if("$!request.tagcloud" == 'true') 507 + #gridresult_buildTagCloudJSON($map) 508 + #end 510 510 #gridresult_buildRowsJSON($map) 511 511 #end 512 512 ... ... @@ -560,8 +560,10 @@ 560 560 #elseif($propType == 'TextAreaClass' || $propType == 'UsersClass' || $propType == 'GroupsClass') 561 561 #set($tableName = 'LargeStringProperty') 562 562 #elseif($propType == 'StaticListClass' || $propType == 'DBListClass' || $propType == 'DBTreeListClass' || $propType == 'PageClass') 562 + ## The following logic is mirrored from ListClass and might need to be updated when the logic in ListClass changes. 563 563 #set($multiSelect = $propClass.get($colname).getProperty('multiSelect').getValue()) 564 564 #set($relationalStorage = $propClass.get($colname).getProperty('relationalStorage').getValue()) 565 + #set($largeStorage = $propClass.get($colname).getProperty('largeStorage').getValue()) 565 565 #if($multiSelect == 1) 566 566 #if($relationalStorage == 1) 567 567 #set($tableName = 'DBStringListProperty') ... ... @@ -568,6 +568,8 @@ 568 568 #else 569 569 #set($tableName = 'StringListProperty') 570 570 #end 572 + #elseif($largeStorage == 1) 573 + #set($tableName = 'LargeStringProperty') 571 571 #else 572 572 #set($tableName = 'StringProperty') 573 573 #end ... ... @@ -881,34 +881,79 @@ 881 881 *# 882 882 #macro (livetable_filterDBStringListProperty) 883 883 ## Perform exact matching by default if no match type is specified. 884 - ## Note that for DBStringList properties we takeintoaccount onlythefirstmatch type,evenifmultiplefilter885 - ## valuesare specified. Basicallythefirst match type isused for allfilter values.887 + ## For DBStringList properties we still apply a single match type to all non-empty values, but we also allow 888 + ## combining the special "empty" match type with other match types. 886 886 #livetable_getMatchTypes($colname $filterValues.size() 'exact') 887 - #if ($matchType == 'partial' || $matchType == 'prefix') 888 - ## We need to join with the list of values in order to be able to use the LIKE operator. 889 - #set ($matchTarget = "${safe_tableAlias}_item") 890 - #if ($whereParams.entrySet()) 891 - #set ($paramPrefix = "${safe_tableAlias}_item_") 890 + #livetable_getJoinOperator($colname) 891 + 892 + ## Collect non-empty filter values (those whose match type is not 'empty'). 893 + #set ($nonEmptyValues = []) 894 + #set ($hasEmpty = false) 895 + #set ($matchType = 'invalid') 896 + #foreach ($filterValue in $filterValues) 897 + #if ($matchTypes.get($foreach.index) == 'empty') 898 + #set ($hasEmpty = true) 899 + ## When we want to match empty values, we can't have other match types than exact for non-empty values as for 900 + ## other match types, we need to join with the list of values, which is not compatible with checking for 901 + ## emptiness. 902 + #set ($matchType = 'exact') 903 + #elseif ("$!filterValue" != '') 904 + #set ($discard = $nonEmptyValues.add($filterValue)) 905 + ## Store the first non-empty match type. 906 + #if ($matchType == 'invalid') 907 + #set ($matchType = $matchTypes.get($foreach.index)) 908 + #end 909 + #end 910 + #end 911 + 912 + ## 1) Apply the non-empty constraints. 913 + #if (!$nonEmptyValues.isEmpty()) 914 + #if ($matchType == 'partial' || $matchType == 'prefix') 915 + ## We need to join with the list of values in order to be able to use the LIKE operator. 916 + #set ($matchTarget = "${safe_tableAlias}_item") 917 + #if ($whereParams.entrySet()) 918 + #set ($paramPrefix = "${safe_tableAlias}_item_") 919 + #else 920 + #set ($paramPrefix = $NULL) 921 + #end 922 + #set ($joinPos = $mathtool.add($fromSql.lastIndexOf(" $safe_tableAlias"), $mathtool.add($safe_tableAlias.length(), 1))) 923 + #set ($fromSql = "$fromSql.substring(0, $joinPos) join ${safe_tableAlias}.list as $matchTarget $fromSql.substring($joinPos)") 892 892 #else 893 - #set ($paramPrefix = $NULL) 925 + ## Fall-back on exact matching even if the match type is specified, when its value is not supported. 926 + #set ($matchType = 'exact') 927 + #set ($matchTarget = "${safe_tableAlias}.list") 928 + #if ($whereParams.entrySet()) 929 + #set ($paramPrefix = "${safe_tableAlias}_list_") 930 + #else 931 + #set ($paramPrefix = $NULL) 932 + #end 894 894 #end 895 - #set ($joinPos = $mathtool.add($fromSql.lastIndexOf(" $safe_tableAlias"), $mathtool.add($safe_tableAlias.length(), 1))) 896 - #set ($fromSql = "$fromSql.substring(0, $joinPos) join ${safe_tableAlias}.list as $matchTarget $fromSql.substring($joinPos)") 897 - #else 898 - ## Fall-back on exact matching even if the match type is specified, when its value is not supported. 899 - #set ($matchType = 'exact') 900 - #set ($matchTarget = "${safe_tableAlias}.list") 901 - #if ($whereParams.entrySet()) 902 - #set ($paramPrefix = "${safe_tableAlias}_list_") 934 + 935 + #set ($filterQuery = "#livetable_getFilterQuery($matchTarget $matchType true $nonEmptyValues.size() $paramPrefix $NULL)") 936 + #if (!$hasEmpty) 937 + ## Only non-empty values are used, combine directly with the existing constraints, otherwise, they will be 938 + ## combined later together with the empty constraint. 939 + #set ($whereSql = "$whereSql and ($filterQuery.trim())") 940 + #end 941 + #foreach ($filterValue in $nonEmptyValues) 942 + #livetable_addFilterParam($filterValue $matchType $whereParams "${paramPrefix}${foreach.count}") 943 + #end 944 + #end 945 + 946 + ## 2) Optionally add a single constraint if any match type is 'empty'. 947 + #if ($hasEmpty) 948 + ## "empty" means that there is no list item stored for this property on the filtered object. 949 + ## The proper way to check for that would be "${safe_tableAlias}.list IS EMPTY", but JSQL cannot parse "IS EMPTY" 950 + ## which means that we cannot use it without programming right. 951 + #set ($emptyConstraint = "size(${safe_tableAlias}.list) = 0") 952 + #if ($nonEmptyValues.isEmpty()) 953 + ## Only 'empty' is used, combine with the existing constraints. 954 + #set ($whereSql = "${whereSql} and ${emptyConstraint}") 903 903 #else 904 - #set ($paramPrefix = $NULL) 956 + ## Combine non-empty group and empty condition using the join operator. 957 + #set ($whereSql = "${whereSql} and ($filterQuery.trim() ${joinOperator} ${emptyConstraint})") 905 905 #end 906 906 #end 907 - #set ($filterQuery = "#livetable_getFilterQuery($matchTarget $matchType true $filterValues.size() $paramPrefix $NULL)") 908 - #set ($whereSql = "$whereSql and ($filterQuery.trim())") 909 - #foreach ($filterValue in $filterValues) 910 - #livetable_addFilterParam($filterValue $matchType $whereParams "${paramPrefix}${foreach.count}") 911 - #end 912 912 #end 913 913 914 914 ... ... @@ -1003,9 +1003,9 @@ 1003 1003 #if ($matchType == 'partial' || $matchType == 'prefix') 1004 1004 #livetable_repeatParams("upper($column) like upper(?)", " $joinOperator ", $valueCount, $paramPrefix, $paramOffset) 1005 1005 #elseif($matchType == 'empty') 1006 - ## Check if the value of the column is like the empty parameter (which is often the empty string), or if the value 1054 + ## Check if the value of the column is like the empty parameter (which is often the empty string), or if the value 1007 1007 ## of the column is null (to be compliant with Oracle which stores the empty string as a NULL value). 1008 - #livetable_repeatParams("($column like ? or $column is null)", " $joinOperator ", $valueCount, $paramPrefix, 1056 + #livetable_repeatParams("($column like ? or $column is null)", " $joinOperator ", $valueCount, $paramPrefix, 1009 1009 $paramOffset) 1010 1010 #elseif ($isList) 1011 1011 #livetable_repeatParams("? in elements($column)", " $joinOperator ", $valueCount, $paramPrefix, $paramOffset)