Skip to content

Commit

Permalink
add new function query:group-collection-by-facsimiles
Browse files Browse the repository at this point in the history
to align facets:facsimile and search:facsimile-filter
  • Loading branch information
peterstadler committed Mar 16, 2023
1 parent a5f7dc1 commit f434358
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 33 deletions.
34 changes: 5 additions & 29 deletions modules/facets.xqm
Original file line number Diff line number Diff line change
Expand Up @@ -84,36 +84,12 @@ declare %private function facets:from-docType($collection as node()*, $facet as
};

declare %private function facets:facsimile($collection as node()*, $facet as xs:string, $lang as xs:string) as array(*) {
let $facsimiles := $collection ! query:facsimile(.)
let $external := ($facsimiles[matches(@sameAs, '^http')] | $facsimiles[tei:graphic[matches(@sameAs, '^http')]])/root()
let $internal := $facsimiles[@sameAs or tei:graphic]/root() except $external
let $internalCount := count($internal)
let $externalCount := count($external)
let $noFacsCount := count($collection) - count($external | $internal)
return
array {
if($internalCount > 0) then
map {
'value' : 'internal',
'label' : lang:get-language-string('internal', $lang),
'frequency' : $internalCount
}
else (),
if($externalCount > 0) then
map {
'value' : 'external',
'label' : lang:get-language-string('external', $lang),
'frequency' : $externalCount
}
else (),
if($noFacsCount > 0) then
map {
'value' : 'without',
'label' : lang:get-language-string('without', $lang),
'frequency' : $noFacsCount
}
else ()
array:for-each(
query:group-collection-by-facsimiles($collection),
function($obj) as map(*) {
map:remove($obj, 'documents') => map:put('label', lang:get-language-string($obj?value, $lang))
}
)
};


Expand Down
41 changes: 41 additions & 0 deletions modules/query.xqm
Original file line number Diff line number Diff line change
Expand Up @@ -504,6 +504,47 @@ declare function query:facsimile($doc as document-node()?) as element(tei:facsim
| $doc//tei:facsimile[tei:graphic[starts-with(@url, 'http')]]
};

(:~
: Group a collection of TEI documents by having internal, external, or no facsimiles
:
: @param $collection the collection of TEI documents
: @return an array of three map objects with the keys 'value' (internal|external|without),
: 'documents' (a sequence of document-nodes), and 'frequency' (the number of documents)
~:)
declare function query:group-collection-by-facsimiles($collection as document-node()*) as array(*) {
let $facsimiles as element(tei:facsimile)* := $collection ! query:facsimile(.)
let $external as document-node()* := ($facsimiles[matches(@sameAs, '^http')] | $facsimiles[tei:graphic[matches(@sameAs, '^http')]])/root()
let $internal as document-node()* := $facsimiles[@sameAs or tei:graphic]/root() except $external
let $noFacs as document-node()* := $collection except ($external | $internal)
let $internalCount := count($internal)
let $externalCount := count($external)
let $noFacsCount := count($noFacs)
return
array {
if($internalCount > 0) then
map {
'value' : 'internal',
'documents' : $internal,
'frequency' : $internalCount
}
else (),
if($externalCount > 0) then
map {
'value' : 'external',
'documents' : $external,
'frequency' : $externalCount
}
else (),
if($noFacsCount > 0) then
map {
'value' : 'without',
'documents' : $noFacs,
'frequency' : $noFacsCount
}
else ()
}
};

(:~
: Return the appropriate source element for a given TEI facsimile element
: (this is the inverse function of query:witness-facsimile())
Expand Down
8 changes: 4 additions & 4 deletions modules/search.xqm
Original file line number Diff line number Diff line change
Expand Up @@ -384,14 +384,14 @@ declare %private function search:revealed-filter($collection as document-node()*
};

declare %private function search:facsimile-filter($collection as document-node()*, $filters as xs:string*) as document-node()* {
let $facsimiles := $collection ! query:facsimile(.)
let $facsimiles as array(*) := $collection => query:group-collection-by-facsimiles()
return
for $filter in $filters
return
switch($filter)
case 'internal' return $facsimiles[not(@sameAs)][tei:graphic]/root()
case 'external' return $facsimiles[@sameAs]/root()
default return $collection except $facsimiles/root()
case 'internal' return $facsimiles?*[.?value='internal']?documents
case 'external' return $facsimiles?*[.?value='external']?documents
default return $facsimiles?*[.?value='without']?documents
};

(:~
Expand Down

0 comments on commit f434358

Please sign in to comment.