跳轉到內容

XQuery/呼叫圖

來自 Wikibooks,開放世界中的開放書籍

您有很多 XQuery 函式和模組,並且您希望透過生成一個顯示函式之間呼叫關係的圖表來了解它們之間的呼叫關係。

示例單個模組呼叫圖

[編輯 | 編輯原始碼]

以下是單個模組的呼叫圖示例。

示例單個 XQuery 模組呼叫的呼叫圖。每個圓形節點都是一個函式。連線節點的線表示一個函式呼叫另一個函式。
  • 您可以快速檢視哪些函式不呼叫其他函式且從未被呼叫(孤立函式)。
  • 有些函式呼叫其他函式,但不會被該模組中的其他函式呼叫。
  • 有些函式被認為是葉子函式,因為它們不呼叫除標準 XQuery 庫函式之外的任何其他函式。
  • 有些函式被其他函式多次呼叫。這些是實用程式模組的理想候選者。
  • 有些函式只被呼叫一次。如果是這種情況,您就會知道如果它發生變化,該模組中函式的影響。
  • 帶有指向自身的箭頭函式是遞迴函式

以下是一個模組之間呼叫圖的示例

示例 XQuery 模組呼叫的呼叫圖。每個模組都在一個矩形中,每個函式都在一個圓圈中。兩個節點之間的連結表示對另一個函式的呼叫。

我們可以使用 inspect 模組提取模組的呼叫資訊

eXist 站點上的 Inspect 模組

或者,如果您已將文件本地安裝到桌面或筆記型電腦上:本地 eXist 文件

inspect 函式將返回一個類似這樣的結構

<module uri="http://docbook.org/ns/docbook" prefix="docbook" location="/db/apps/doc/modules/docbook.xql">
    <function name="docbook:load" module="http://docbook.org/ns/docbook">
    ...
      <calls>
         <function name="dq:do-query" module="http://exist-db.org/xquery/documentation/search" arity="3"/>
       </calls>
    </function>
</module>

我們希望將其視覺化,如上圖所示。

示例圖形標記語言

[編輯 | 編輯原始碼]
<!-- sample XQuery call graph with two modules.
    Module A has three functions, a, b, and c where a calls b and c.
    Module B has three functions d, e, and f where b calls e and f.
    a also calls d which must be placed outside and after the module clusters.
    -->
<graph xmlns="http://www.martin-loetzsch.de/DOTML"  rankdir="LR" bgcolor="silver">
    <cluster id="m1" bgcolor="yellow" label="module A">
        <!-- each function within a module is a node -->
        <node id="m1a" label="a"/>
        <node id="m1b" label="b"/>
        <node id="m1c" label="c"/>
        <!-- each call to another function generates an edge -->
        <edge from="m1a" to="m1b"/>
        <edge from="m1a" to="m1c"/>   
    </cluster>
    
    <cluster id="m2" bgcolor="pink"  label="module B">
        <!-- each function within a module is a node -->
        <node id="m2d" label="d"/>
        <node id="m2e" label="e"/>
        <node id="m2f" label="f"/>
        <!-- each call to another function generates an edge -->
        <edge from="m2d" to="m2e"/>
        <edge from="m2d" to="m2f"/>
    </cluster>
    
    <!-- inter module calls must be placed AFTER the modules themselves -->
    <edge from="m1c" to="m2d"/>
</graph>

GraphViz 是一個非常成熟的節點佈局系統,具有許多複雜的功能和非 XML 輸入格式。

  • 如果 GraphViz 管道中存在錯誤,則幾乎沒有反饋資訊。我們應該使用 try/catch 來獲取有關錯誤的更多反饋。
  • Dot 語言在 ID 中不接受“破折號”(-)或冒號(:)字元。如果它們出現,轉換將簡單地不返回任何結果,而不會出現錯誤訊息。這些字元必須從 ID 中刪除,並且必須使用“label”屬性來顯示節點上的值。
  • 理想情況下,應該有一個單一的 XQuery typeswitch 轉換來執行轉換為 SVG,但準確放置圖中的節點是一個複雜的過程。
  • 應該有一些方法來調整轉換位置,例如提示將類似函式名稱分組在一起。
  • 應該有一些方法來保持此係統在使用 XQDoc 的 XML 開發工具之間可移植。這取決於 XQDoc 工具是否匯出正確的資訊。
華夏公益教科書