Änderungen von Dokument Live-Table Ergebnismakros

Zuletzt geändert von Daniel Herrmann am 2026/02/07 23:25

Von Version Icon 3.1 Icon
bearbeitet von Daniel Herrmann
am 2026/02/04 20:23
Änderungskommentar: Install extension [org.xwiki.platform:xwiki-platform-livetable-ui/17.10.3]
Auf Version 1.1 Icon
bearbeitet von admin
am 2025/02/23 10:22
Änderungskommentar: Install extension [org.xwiki.platform:xwiki-platform-livetable-ui/17.0.0]

Zusammenfassung

Details

Icon Seiteneigenschaften
Dokument-Autor
... ... @@ -1,1 +1,1 @@
1 -XWiki.dherrman
1 +XWiki.admin
Inhalt
... ... @@ -37,10 +37,9 @@
37 37   #foreach($colname in $collist)
38 38   ## If a classname is defined and the class field corresponding to the column name,
39 39   ## we check the type of the field and skip it if it's Password.
40 - #livetable_getPropertyClassAndType($colname)
41 - #if ($propType != '')
42 - #set ($isPasswordType = $propClass.get($colname).classType == 'Password')
43 - #set ($isEmailType = $propClass.get($colname).classType == 'Email')
40 + #if ($className != '' && $class.get($colname))
41 + #set ($isPasswordType = $class.get($colname).classType == 'Password')
42 + #set ($isEmailType = $class.get($colname).classType == 'Email')
44 44   #set ($emailObfuscated = $services.mail.general.shouldObfuscate())
45 45   #if (!($isPasswordType || ($isEmailType && $emailObfuscated)))
46 46   #livetable_addColumnToQuery($colname)
... ... @@ -306,7 +306,10 @@
306 306   #if(!$offset || $offset < 0)
307 307   #set($offset = 0)
308 308   #end
309 - #getAndValidateQueryLimitFromRequest('limit', 15, $limit)
308 + #set($limit = $numbertool.toNumber($request.get('limit')).intValue())
309 + #if(!$limit)
310 + #set ($limit = 15)
311 + #end
310 310   #set($query = $services.query.hql($sql))
311 311   ## Apply query filters if defined. Otherwise use default.
312 312   #foreach ($queryFilter in $stringtool.split($!request.queryFilters, ', '))
... ... @@ -558,10 +558,8 @@
558 558   #elseif($propType == 'TextAreaClass' || $propType == 'UsersClass' || $propType == 'GroupsClass')
559 559   #set($tableName = 'LargeStringProperty')
560 560   #elseif($propType == 'StaticListClass' || $propType == 'DBListClass' || $propType == 'DBTreeListClass' || $propType == 'PageClass')
561 - ## The following logic is mirrored from ListClass and might need to be updated when the logic in ListClass changes.
562 562   #set($multiSelect = $propClass.get($colname).getProperty('multiSelect').getValue())
563 563   #set($relationalStorage = $propClass.get($colname).getProperty('relationalStorage').getValue())
564 - #set($largeStorage = $propClass.get($colname).getProperty('largeStorage').getValue())
565 565   #if($multiSelect == 1)
566 566   #if($relationalStorage == 1)
567 567   #set($tableName = 'DBStringListProperty')
... ... @@ -568,8 +568,6 @@
568 568   #else
569 569   #set($tableName = 'StringListProperty')
570 570   #end
571 - #elseif($largeStorage == 1)
572 - #set($tableName = 'LargeStringProperty')
573 573   #else
574 574   #set($tableName = 'StringProperty')
575 575   #end
... ... @@ -691,19 +691,6 @@
691 691   #elseif ($colName == 'doc.date' || $colName == 'doc.creationDate' || $colName == 'doc.contentUpdateDate')
692 692   #livetable_getTableAlias($colName)
693 693   #livetable_filterDateProperty()
694 - #elseif ($colName == 'doc.hidden' || $colName == 'doc.minorEdit1' || $colName == 'doc.enforceRequiredRights')
695 - ## Boolean document fields need special handling to work across all databases
696 - ## (HSQLDB/PostgreSQL use true/false, MySQL/MariaDB/Oracle use 1/0).
697 - ## Support both true/false and 1/0 as Live Data uses the former while LiveTable uses the latter.
698 - #set ($booleanValue = ($filterValue.toLowerCase() == 'true' || $filterValue == '1'))
699 - ## No need to clean the column name since it's only one of the given values.
700 - #if ($whereParams.entrySet())
701 - #set ($whereSql = "${whereSql} and $colName = :${colName.replace('.', '_')}_filter")
702 - #set ($discard = $whereParams.put("${colName.replace('.', '_')}_filter", $booleanValue))
703 - #else
704 - #set ($whereSql = "${whereSql} and $colName = ?")
705 - #set ($discard = $whereParams.add($booleanValue))
706 - #end
707 707   #else
708 708   #set ($safeColName = $colName.replaceAll('[^a-zA-Z0-9_.]', '').replace('_', '.'))
709 709   #if ($whereParams.entrySet())
... ... @@ -896,79 +896,34 @@
896 896   *#
897 897  #macro (livetable_filterDBStringListProperty)
898 898   ## Perform exact matching by default if no match type is specified.
899 - ## For DBStringList properties we still apply a single match type to all non-empty values, but we also allow
900 - ## combining the special "empty" match type with other match types.
884 + ## Note that for DBStringList properties we take into account only the first match type, even if multiple filter
885 + ## values are specified. Basically the first match type is used for all filter values.
901 901   #livetable_getMatchTypes($colname $filterValues.size() 'exact')
902 - #livetable_getJoinOperator($colname)
903 -
904 - ## Collect non-empty filter values (those whose match type is not 'empty').
905 - #set ($nonEmptyValues = [])
906 - #set ($hasEmpty = false)
907 - #set ($matchType = 'invalid')
908 - #foreach ($filterValue in $filterValues)
909 - #if ($matchTypes.get($foreach.index) == 'empty')
910 - #set ($hasEmpty = true)
911 - ## When we want to match empty values, we can't have other match types than exact for non-empty values as for
912 - ## other match types, we need to join with the list of values, which is not compatible with checking for
913 - ## emptiness.
914 - #set ($matchType = 'exact')
915 - #elseif ("$!filterValue" != '')
916 - #set ($discard = $nonEmptyValues.add($filterValue))
917 - ## Store the first non-empty match type.
918 - #if ($matchType == 'invalid')
919 - #set ($matchType = $matchTypes.get($foreach.index))
920 - #end
921 - #end
922 - #end
923 -
924 - ## 1) Apply the non-empty constraints.
925 - #if (!$nonEmptyValues.isEmpty())
926 - #if ($matchType == 'partial' || $matchType == 'prefix')
927 - ## We need to join with the list of values in order to be able to use the LIKE operator.
928 - #set ($matchTarget = "${safe_tableAlias}_item")
929 - #if ($whereParams.entrySet())
930 - #set ($paramPrefix = "${safe_tableAlias}_item_")
931 - #else
932 - #set ($paramPrefix = $NULL)
933 - #end
934 - #set ($joinPos = $mathtool.add($fromSql.lastIndexOf(" $safe_tableAlias"), $mathtool.add($safe_tableAlias.length(), 1)))
935 - #set ($fromSql = "$fromSql.substring(0, $joinPos) join ${safe_tableAlias}.list as $matchTarget $fromSql.substring($joinPos)")
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_")
936 936   #else
937 - ## Fall-back on exact matching even if the match type is specified, when its value is not supported.
938 - #set ($matchType = 'exact')
939 - #set ($matchTarget = "${safe_tableAlias}.list")
940 - #if ($whereParams.entrySet())
941 - #set ($paramPrefix = "${safe_tableAlias}_list_")
942 - #else
943 - #set ($paramPrefix = $NULL)
944 - #end
893 + #set ($paramPrefix = $NULL)
945 945   #end
946 -
947 - #set ($filterQuery = "#livetable_getFilterQuery($matchTarget $matchType true $nonEmptyValues.size() $paramPrefix $NULL)")
948 - #if (!$hasEmpty)
949 - ## Only non-empty values are used, combine directly with the existing constraints, otherwise, they will be
950 - ## combined later together with the empty constraint.
951 - #set ($whereSql = "$whereSql and ($filterQuery.trim())")
952 - #end
953 - #foreach ($filterValue in $nonEmptyValues)
954 - #livetable_addFilterParam($filterValue $matchType $whereParams "${paramPrefix}${foreach.count}")
955 - #end
956 - #end
957 -
958 - ## 2) Optionally add a single constraint if any match type is 'empty'.
959 - #if ($hasEmpty)
960 - ## "empty" means that there is no list item stored for this property on the filtered object.
961 - ## The proper way to check for that would be "${safe_tableAlias}.list IS EMPTY", but JSQL cannot parse "IS EMPTY"
962 - ## which means that we cannot use it without programming right.
963 - #set ($emptyConstraint = "size(${safe_tableAlias}.list) = 0")
964 - #if ($nonEmptyValues.isEmpty())
965 - ## Only 'empty' is used, combine with the existing constraints.
966 - #set ($whereSql = "${whereSql} and ${emptyConstraint}")
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_")
967 967   #else
968 - ## Combine non-empty group and empty condition using the join operator.
969 - #set ($whereSql = "${whereSql} and ($filterQuery.trim() ${joinOperator} ${emptyConstraint})")
904 + #set ($paramPrefix = $NULL)
970 970   #end
971 971   #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
972 972  #end
973 973  
974 974  
... ... @@ -1063,9 +1063,9 @@
1063 1063   #if ($matchType == 'partial' || $matchType == 'prefix')
1064 1064   #livetable_repeatParams("upper($column) like upper(?)", " $joinOperator ", $valueCount, $paramPrefix, $paramOffset)
1065 1065   #elseif($matchType == 'empty')
1066 - ## Check if the value of the column is like the empty parameter (which is often the empty string), or if the value
1006 + ## Check if the value of the column is like the empty parameter (which is often the empty string), or if the value
1067 1067   ## of the column is null (to be compliant with Oracle which stores the empty string as a NULL value).
1068 - #livetable_repeatParams("($column like ? or $column is null)", " $joinOperator ", $valueCount, $paramPrefix,
1008 + #livetable_repeatParams("($column like ? or $column is null)", " $joinOperator ", $valueCount, $paramPrefix,
1069 1069   $paramOffset)
1070 1070   #elseif ($isList)
1071 1071   #livetable_repeatParams("? in elements($column)", " $joinOperator ", $valueCount, $paramPrefix, $paramOffset)