declare function local:getExistingDates($allDates, $date) as xs:string* {
for $item in map:find($allDates, $date)
where exists($item)
return $item
};
declare function local:getChanges4Ids($doc as node(), $ids as xs:string*, $change as element()*) as element()* {
let $changes := for $id in $ids
return $doc//tei:change[@xml:id = $id]
return ($changes, $change)
};
declare function api:timeline($request as map(*)) {
let $doc := doc($config:data-root || "/Druckmanuskript_D_20.xml")
let $dates := ()
let $allDatesMap := for $span in $doc//tei:profileDesc/tei:creation/tei:listChange/tei:change[descendant::tei:date[(@notAfter and @notBefore) or (@from and @to)]]
return map:merge(( for $date in local:getTimeSpan($span, $dates)
return map:entry($date, string($span/@xml:id))
))
let $allDates := local:getAllDates($allDatesMap, $doc//tei:profileDesc/tei:creation/tei:listChange/tei:change//tei:date/@when/xs:date(.))
let $log := console:log($allDates)
return map:merge((
for $date in $allDates
let $existingDates := local:getExistingDates($allDatesMap, $date)
let $change := $doc//tei:profileDesc/tei:creation/tei:listChange/tei:change[descendant::tei:date[@when = $date]]
return
if (count($existingDates) gt 0) then (
map:entry($date, map {
"count": if ($change) then (count($existingDates) + 1) else (count($existingDates)),