@@ -14,6 +14,7 @@ declare variable $facet:XML :=
14
14
<time>14 :22 :19.329 +01 :00 </time>
15
15
<likes>9 </likes>
16
16
<score>6.0 </score>
17
+ <subject>art</subject>
17
18
</letter>
18
19
<letter>
19
20
<from>Rudi</from>
@@ -23,6 +24,7 @@ declare variable $facet:XML :=
23
24
<time>15 :22 :19.329 +01 :00 </time>
24
25
<likes>19 </likes>
25
26
<score>8.25 </score>
27
+ <subject>history</subject>
26
28
</letter>
27
29
<letter>
28
30
<from>Susi</from>
@@ -31,6 +33,8 @@ declare variable $facet:XML :=
31
33
<date>2019 -04 -01 </date>
32
34
<likes>29 </likes>
33
35
<score>16.5 </score>
36
+ <subject>engineering</subject>
37
+ <subject>history</subject>
34
38
</letter>
35
39
<letter>
36
40
<from>Heinz</from>
@@ -39,6 +43,7 @@ declare variable $facet:XML :=
39
43
<date>2017 -03 -11 </date>
40
44
<likes>1 </likes>
41
45
<score>14.25 </score>
46
+ <subject>history</subject>
42
47
</letter>
43
48
<letter>
44
49
<from>Heinz</from>
@@ -47,13 +52,15 @@ declare variable $facet:XML :=
47
52
<date>2015 -06 -22 </date>
48
53
<likes>5 </likes>
49
54
<score>29.50 </score>
55
+ <subject>history</subject>
50
56
</letter>
51
57
<letter>
52
58
<from>Heinz</from>
53
59
<to>Basia Kowalska</to>
54
60
<place>Wrocław</place>
55
61
<date>2013 -06 -22 </date>
56
62
<likes>3 </likes>
63
+ <subject>history</subject>
57
64
<score>16.0 </score>
58
65
</letter>
59
66
</letters>;
@@ -70,6 +77,19 @@ declare variable $facet:TAXONOMY :=
70
77
</place>
71
78
</places>;
72
79
80
+ declare variable $facet:SUBJECT :=
81
+ <subject>
82
+ <subject name = "science" >
83
+ <subject name = "math" />
84
+ <subject name = "engineering" />
85
+ </subject>
86
+ <subject name = "humanities" >
87
+ <subject name = "art" />
88
+ <subject name = "sociology" />
89
+ <subject name = "history" />
90
+ </subject>
91
+ </subject>;
92
+
73
93
declare variable $facet:DOCUMENTS :=
74
94
<documents>
75
95
<document id = "D-37/2" >
@@ -110,6 +130,15 @@ declare variable $facet:MODULE :=
110
130
else
111
131
()
112
132
};
133
+
134
+ declare function idx:subject-hierarchy ($key as xs:string*) {
135
+ if (exists ($key)) then
136
+ array:for-each (array {$key}, function ($k) {
137
+ doc ('/db/lucenetest/subjects.xml' )//subject[@name=$k]/ancestor-or-self::subject/@name
138
+ })
139
+ else
140
+ ()
141
+ };
113
142
]``;
114
143
115
144
declare variable $facet:XCONF1 :=
@@ -124,6 +153,7 @@ declare variable $facet:XCONF1 :=
124
153
<text qname = "letter" analyzer = "nodiacritics" >
125
154
<facet dimension = "place" expression = "place" />
126
155
<facet dimension = "location" expression = "idx:place-hierarchy(place)" hierarchical = "yes" />
156
+ <facet dimension = "subject" expression = "idx:subject-hierarchy(subject)" hierarchical = "yes" />
127
157
<facet dimension = "from" expression = "from" />
128
158
<facet dimension = "to" expression = "to" />
129
159
<facet dimension = "date" expression = "tokenize(date, '-')" hierarchical = "yes" />
@@ -164,6 +194,7 @@ function facet:setup() {
164
194
xmldb:store ($testCol, "module.xql" , $facet:MODULE, "application/xquery" ),
165
195
xmldb:store ($confCol, "collection.xconf" , $facet:XCONF1),
166
196
xmldb:store ($testCol, "places.xml" , $facet:TAXONOMY),
197
+ xmldb:store ($testCol, "subjects.xml" , $facet:SUBJECT),
167
198
xmldb:store ($testCol, "test.xml" , $facet:XML),
168
199
xmldb:store ($testCol, "documents.xml" , $facet:DOCUMENTS),
169
200
xmldb:store ($testCol, "multi-lang.xml" , $facet:MULTI_LANGUAGE)
@@ -294,6 +325,34 @@ function facet:hierarchical-place() {
294
325
)
295
326
};
296
327
328
+ declare
329
+ %test:assertEquals('{"art":1,"history":5}' ,'{"engineering":1}' )
330
+ function facet:hierarchical-subject () {
331
+ let $result := collection ("/db/lucenetest" )//letter[ft:query (., ())]
332
+ let $facets := ft:facets ($result, "subject" , 10 ) (: Returns facet counts for "science" and "humanities" :)
333
+ for $topic in map:keys ($facets)
334
+ order by $topic
335
+ return
336
+ serialize (
337
+ ft:facets ($result, "subject" , 10 , $topic), (: Get facet counts for sub-categories :)
338
+ map { "method" : "json" }
339
+ )
340
+ };
341
+
342
+ declare
343
+ %test:assertEquals('{"history":1}' ,'{"engineering":1}' )
344
+ function facet:hierarchical-multivalue-subject () {
345
+ let $result := collection ("/db/lucenetest" )//letter[ft:query (., 'from:susi' )]
346
+ let $facets := ft:facets ($result, "subject" , 10 ) (: Returns facet counts for "science" and "humanities" :)
347
+ for $topic in map:keys ($facets)
348
+ order by $topic
349
+ return
350
+ serialize (
351
+ ft:facets ($result, "subject" , 10 , $topic), (: Get facet counts for sub-categories :)
352
+ map { "method" : "json" }
353
+ )
354
+ };
355
+
297
356
declare
298
357
%test:args("place:hamburg" )
299
358
%test:assertEquals(1 )
0 commit comments