Modifications pour le document Macros de résultats Livetable
Modifié par Florent Charton le 2026/03/13 11:03
Depuis la version 4.1
modifié par Florent Charton
sur 2026/01/08 10:56
sur 2026/01/08 10:56
Commentaire de modification :
Install extension [org.xwiki.platform:xwiki-platform-livetable-ui/17.4.8]
À 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
-
... ... @@ -884,34 +884,79 @@ 884 884 *# 885 885 #macro (livetable_filterDBStringListProperty) 886 886 ## Perform exact matching by default if no match type is specified. 887 - ## Note that for DBStringList properties we takeintoaccount onlythefirstmatch type,evenifmultiplefilter888 - ## 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. 889 889 #livetable_getMatchTypes($colname $filterValues.size() 'exact') 890 - #if ($matchType == 'partial' || $matchType == 'prefix') 891 - ## We need to join with the list of values in order to be able to use the LIKE operator. 892 - #set ($matchTarget = "${safe_tableAlias}_item") 893 - #if ($whereParams.entrySet()) 894 - #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)") 895 895 #else 896 - #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 897 897 #end 898 - #set ($joinPos = $mathtool.add($fromSql.lastIndexOf(" $safe_tableAlias"), $mathtool.add($safe_tableAlias.length(), 1))) 899 - #set ($fromSql = "$fromSql.substring(0, $joinPos) join ${safe_tableAlias}.list as $matchTarget $fromSql.substring($joinPos)") 900 - #else 901 - ## Fall-back on exact matching even if the match type is specified, when its value is not supported. 902 - #set ($matchType = 'exact') 903 - #set ($matchTarget = "${safe_tableAlias}.list") 904 - #if ($whereParams.entrySet()) 905 - #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}") 906 906 #else 907 - #set ($paramPrefix = $NULL) 956 + ## Combine non-empty group and empty condition using the join operator. 957 + #set ($whereSql = "${whereSql} and ($filterQuery.trim() ${joinOperator} ${emptyConstraint})") 908 908 #end 909 909 #end 910 - #set ($filterQuery = "#livetable_getFilterQuery($matchTarget $matchType true $filterValues.size() $paramPrefix $NULL)") 911 - #set ($whereSql = "$whereSql and ($filterQuery.trim())") 912 - #foreach ($filterValue in $filterValues) 913 - #livetable_addFilterParam($filterValue $matchType $whereParams "${paramPrefix}${foreach.count}") 914 - #end 915 915 #end 916 916 917 917 ... ... @@ -1006,9 +1006,9 @@ 1006 1006 #if ($matchType == 'partial' || $matchType == 'prefix') 1007 1007 #livetable_repeatParams("upper($column) like upper(?)", " $joinOperator ", $valueCount, $paramPrefix, $paramOffset) 1008 1008 #elseif($matchType == 'empty') 1009 - ## 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 1010 1010 ## of the column is null (to be compliant with Oracle which stores the empty string as a NULL value). 1011 - #livetable_repeatParams("($column like ? or $column is null)", " $joinOperator ", $valueCount, $paramPrefix, 1056 + #livetable_repeatParams("($column like ? or $column is null)", " $joinOperator ", $valueCount, $paramPrefix, 1012 1012 $paramOffset) 1013 1013 #elseif ($isList) 1014 1014 #livetable_repeatParams("? in elements($column)", " $joinOperator ", $valueCount, $paramPrefix, $paramOffset)