4.3.3.3  Webapps mit mehreren Datenbanken

Jeder App-Server ist in MarkLogic genau einer Content-Database zugeordnet. Darin sollten alle Daten vorhanden sein, auf die die Webapplikation zugreift.

Es ist jedoch über einen kleinen "Hack" möglich andere Datenbanken in derselben MarkLogic Webapp abzufragen. Dazu verwendet man die xdmp:eval-in Funktion.

Wie der Name schon sagt, wird damit ein Ausdruck in einer anderen Datenbank evaluiert.

Das Beispiel dazu auf der MarkLogic-Doku Seite sieht folgendermassen aus:

xquery version "0.9-ml"
declare namespace my='http://mycompany.com/test'

let $s :=
      "xquery version '0.9-ml'
       declare namespace my='http://mycompany.com/test'
       define variable $my:x as xs:string external
       concat('hello ', $my:x)"
return
    (: evaluate the query string $s using the variables
       supplied as the second parameter to xdmp:eval :)
    xdmp:eval-in($s,
                 xdmp:database("Documents"),
		 ("my:x"),
		 "world"))

=> hello world
Plain Text

Ein Anwendungsbeispiel aus der Praxis würde demnach so aussehen:

declare function local:remove-sql-view($sql-view-name) {
  let $url := concat('/sql-views/', $sql-view-name)
  return xdmp:eval-in('xquery version "1.0-ml";
               declare variable $url as xs:string external;
               xdmp:document-delete($url),
               xdmp:schema-database(),
               ('url'),$url)
  )
};
Plain Text

Hier wird eine zuvor gesetzte SQL View, vgl. Kapitel SQL Views in MarkLogic , die per Default in der Schema-Datenbank untergebracht ist, wieder aus dem System gelöscht.