Wiki-Quellcode von CommonCode

Zuletzt geändert von Daniel Herrmann am 2026/02/04 20:25

Verstecke letzte Bearbeiter
Daniel Herrmann 2.1 1 {{groovy output=false}}
2 proMacroCQLQueryExecutor = { query ->
3 def resultList = [];
4 try {
5 def res = query.execute();
6 return [res, null];
7 } catch (Exception e) {
8 return [null, e];
9 }
10 }
11 {{/groovy}}
12
Daniel Herrmann 1.1 13 {{velocity output="false"}}
14
15 ## See https://solr.apache.org/guide/solr/latest/query-guide/standard-query-parser.html#escaping-special-characters
16 ## And https://jira.xwiki.org/browse/XCOMMONS-2926
17 #set ($solrSpecialChars = ['+', '-', '&&', '||', '!', '(', ')', '{', '}', '[', ']', '^', '"', '~', '*', '?', ':', '/', '\', ' '])
18 #set ($escapedSolrSpecialChars = ['\+', '\-', '\&&', '\||', '\!', '\(', '\)', '\{', '\}', '\[', '\]', '\^', '\"', '\~', '\*', '\?', '\:', '\/', '\\', '\ '])
19
20 #macro (escapeSolr $v)
21 $stringtool.replaceEach($v, $solrSpecialChars, $escapedSolrSpecialChars)##
22 #end
23
24 #macro (getSpaceFacet $space)
25 #set ($facetNumber = $space.getReversedReferenceChain().size() - 1)
26 #if ($space.getRoot().getType().toString() == "WIKI")
27 #set ($facetNumber = $facetNumber - 1)
28 #escapeSolr("${facetNumber}/${services.model.serialize($space)}.")##
29 #end
30 #end
31
32 #macro (getCQLMacroResults $wikimacro $results)
33 #set ($results = $NULL)
34 #set ($cql = $wikimacro.params.cql)
35 #if ("$!cql" == "")
36 #if ("$!xcontext.macro.params.operator" == "AND" || "$!xcontext.macro.params.operator" == "and")
37 #set ($operator = "AND")
38 #else
39 #set ($operator = "OR")
40 #end
41 #set ($labels = $wikimacro.params.labels)
42 #if ("$!labels" == "")
43 #set ($labels = $wikimacro.params.label)
44 #end
45 #if ("$!labels" != "")
46 #set ($labelList = $labels.split("\s*,\s*|\s+"))
47 #set ($stringifiedLabels = [])
48 #set ($cql = "")
49 #foreach ($label in $labelList)
50 #if ($foreach.first)
51 #set ($join = "")
52 #else
53 #set ($join = " $operator ")
54 #end
55 #set ($cql = "${cql}${join}label = ${jsontool.serialize($label)}")
56 #end
57 #set ($cql = "(${cql})")
58 #set ($type = $wikimacro.params.type)
59 #if ("$!type" != "")
60 #set ($cql = "$cql AND type = ${jsontool.serialize($type)}")
61 #end
62 #end
63 #end
64 #set ($query = $services.query.createQuery($cql, "cql"))
65 #set ($fq = "")
66 #if ("$!xcontext.macro.params.cql" == "")
67 #set ($spaces = "$!xcontext.macro.params.spaces")
68 #if (!$spaces.isEmpty() && !$spaces.contains("@all"))
69 #foreach ($space in $spaces.split("\s*,\s*|\s+"))
70 #set ($s = $services.confluence.spaces.getSloppySpace($space))
71 #if ($objecttool.isNotNull($s))
72 #set ($fq = "$fq space_facet:#getSpaceFacet($s)")
73 #end
74 #end
75 #end
76 #end
77 #if ("$!type" == "")
78 #set ($fq = "$fq type:DOCUMENT")
79 #end
80 #if (!$fq.trim().isEmpty())
81 #set ($discard = $query.bindValue("fq", $fq.trim()))
82 #end
83 ## Max value. By default, Solr limits to 10 results,
84 ## which doesn't correspond to the behavior of Confluence.
85 ## INT_MAX causes huge performance issues, so we limit to 1000
86 ## arbritrarily by default
87 #set ($discard = $query.setLimit(1000))
88 #if ("$!xcontext.macro.params.max" != "")
89 #set ($limit = $numbertool.toNumber($wikimacro.params.max))
90 #if ($objecttool.isNotNull($limit))
91 #set ($discard = $query.setLimit($limit))
92 #end
93 #end
94 #if ("$!xcontext.macro.params.sort" == "modified")
95 #set ($sortField = "date")
96 #elseif ("$!xcontext.macro.params.sort" == "creation")
97 #set ($sortField = "creationdate")
98 #else
99 #set ($sortField = "title_sort")
100 #end
101 #if ("$!xcontext.macro.params.reverse" == "true")
102 #set ($sortAsc = "desc")
103 #else
104 #set ($sortAsc = "asc")
105 #end
106 #set ($discard = $query.bindValue("sort", "$sortField $sortAsc"))
Daniel Herrmann 2.1 107 #set ($alreadyListed = $collectiontool.getSet())
108 #set ($exec = $proMacroCQLQueryExecutor.call($query))
Daniel Herrmann 1.1 109 #set ($resultList = [])
Daniel Herrmann 2.1 110 #if ($objecttool.isNull($exec[1]))
111 #foreach ($r in $exec[0][0].results)
112 #set ($ref = "$r.wiki:$r.fullname")
113 #if (!$alreadyListed.contains($ref))
114 #set ($discard = $resultList.add($r))
115 #set ($discard = $alreadyListed.add($ref))
116 #end
Daniel Herrmann 1.1 117 #end
Daniel Herrmann 2.1 118 #else
119
120 {{html}}
121 #displayException($services.localization.render('rendering.macro.cqlmacro.queryerror'), $exec[1])
122 {{/html}}
123
124 #set ($resultList = $NULL)
Daniel Herrmann 1.1 125 #end
126 #setVariable("$results" $resultList)
127 #end
128 {{/velocity}}