Last modified by Artur K. on 2026/06/01 15:50

Hide last authors
Artur K. 1.1 1 {{velocity output="false"}}
2 #set($ROOT_SPACE = "OntologyElements")
3
4 #set($groups = {})
5 #set($meta = {})
6
7 #set($q = "select doc.fullName, doc.space from Document doc where doc.fullName like '${ROOT_SPACE}.%'")
8 #set($rows = $services.query.xwql($q).execute())
9
10 #foreach($row in $rows)
11 #set($fullName = $row.get(0).toString())
12 #set($space = $row.get(1).toString())
13
14 #set($parts = $space.split("\."))
15 #set($size = $parts.size())
16
17 #if($size >= 2)
18 #set($lastIndex = $size - 1)
19 #set($pagePart = $parts.get($lastIndex))
20
21 ## parentSpace
22 #set($parentParts = [])
23 #set($i = 0)
24 #foreach($p in $parts)
25 #if($i < $lastIndex)
26 #set($discard = $parentParts.add($p))
27 #end
28 #set($i = $i + 1)
29 #end
30 #set($parentSpace = $parentParts.join("."))
31
32 ## baseName
33 #set($baseName = $pagePart.replaceAll("_\d+$",""))
34
35 #set($key = "${parentSpace}|${baseName}")
36
37 #if(!$groups.containsKey($key))
38 #set($discard = $groups.put($key, []))
39
40 #set($m = {})
41 #set($discard = $m.put("parentSpace", $parentSpace))
42 #set($discard = $m.put("baseName", $baseName))
43 #set($discard = $meta.put($key, $m))
44 #end
45
46 #set($discard = $groups.get($key).add($fullName))
47 #end
48 #end
49
50 #set($dupKeys = [])
51 #foreach($k in $groups.keySet())
52 #set($lst = $groups.get($k))
53 #if($lst.size() > 1)
54 #set($discard = $dupKeys.add($k))
55 #end
56 #end
57 {{/velocity}}
58
59 {{velocity output="true"}}
60 #if($dupKeys.isEmpty())
61 {{info}}No duplicates found.{{/info}}
62 #else
63 #set($discard = $dupKeys.sort())
64 {{info}}Number of duplicate groups found: $dupKeys.size(){{/info}}
65
66 {{html wiki="true" clean="false"}}
67 <table class="xwiki-table">
68 <thead>
69 <tr>
70 <th>Base name</th>
71 <th>Count</th>
72 <th>Pages</th>
73 <th>Parents</th>
74 </tr>
75 </thead>
76 <tbody>
77 #foreach($k in $dupKeys)
78 #set($info = $meta.get($k))
79 #set($lst = $groups.get($k))
80 <tr>
81 <td><code>$info.get("baseName")</code></td>
82 <td>$lst.size()</td>
83
84 <td>
85 #foreach($fn in $lst)
86 <div>[[$fn]]</div>
87 #end
88 </td>
89
90 <td>
91 #foreach($fn in $lst)
92 #set($rdoc = $xwiki.getDocument($fn))
93 #set($parent = $rdoc.getParent())
94 #if($parent && $parent != "")
95 <div>[[$parent>>$parent]]</div>
96 #else
97 <div><span style="color:#888;">(empty)</span></div>
98 #end
99 #end
100 </td>
101
102 </tr>
103 #end
104 </tbody>
105 </table>
106 {{/html}}
107 #end
108 {{/velocity}}
© Semantic R&D Group, 2026