\documentclass{beamer}
\mode<presentation>{\usetheme{Marburg}}
\setbeamercovered{transparent}

\usepackage{ngerman}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes}
\usepackage{graphicx}
\usepackage{listings}
\lstset{showstringspaces=false}
\lstset{stringstyle=\color{red!70!black}}
\lstset{basicstyle=\small}

\AtBeginSection[]
{
    \begin{frame}
        \frametitle{Übersicht}
        \tableofcontents[currentsection]
    \end{frame}
}

\AtBeginSubsection[]
{
    \begin{frame}
        \frametitle{Übersicht}
        \tableofcontents[currentsection,currentsubsection]
    \end{frame}
}

\tikzstyle{pfeil}=[->,thick]
\tikzstyle{pfeilwichtig}=[->,draw=red!50,thick]
\tikzstyle{rel}=[ellipse,draw,thick]
\tikzstyle{xml}=[ellipse,draw,fill=red!40,thick]

\newcommand{\xmltag}[1]{$\langle${#1}$\rangle$}
\newcommand{\xmltext}[1]{#1}

\title{XQuery in MS SQL Server 2005}
\author{Volker Grabsch \and Christine Janischek}
\date{14. Januar 2008}

\begin{document}

\begin{frame}
    \titlepage
\end{frame}

\begin{frame}
    \frametitle{Allgemeines}

    \begin{itemize}
    \item veröffentlicht unter \\
        \url{http://www.profv.de/uni/}

    \vfill

    \item lizensiert unter \\
        \href{http://creativecommons.org/licenses/by-sa/3.0/deed.de}{%
        % CC-Icons heruntergeladen von:
        % http://creativecommons.org/presskit
        \includegraphics{by-sa} \\
        Creative Commons BY-SA 3.0}
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{Quelle}

    Dieser Vortrag basiert auf dem Paper
        \begin{quote}
        XQuery Implementation \\
        in a Relational Database System
        \end{quote}
    und der Webseite
        \begin{quote}
        \href{http://technet.microsoft.com/en-us/library/ms345117.aspx}
             {XML Support in Microsoft SQL Server 2005}
        \end{quote}
    der Microsoft Corporation.
\end{frame}

\begin{frame}
    \frametitle{Übersicht}
    \tableofcontents
\end{frame}

\section{Benutzung}

\begin{frame}[fragile]
    \frametitle{Beispiel-Relation "`reports"'}

    \begin{center}
    \begin{tabular}{ll}
    \hline
    \textbf{reportname} &
    \textbf{report}
    \\
    \hline
    Bericht-0 &
\begin{lstlisting}[language=XML,basicstyle=\tiny]
<report>
    <author>Christine</author>
    <author>Volker</author>
    <date>Jan 2008</date>
    <section/>
</report>
\end{lstlisting}
    \\
    \hline
    Bericht-1 &
\begin{lstlisting}[language=XML,basicstyle=\tiny]
<report>
    <author>Christine</author>
    <author>Volker</author>
    <date>Jan 2008</date>
    <section>... blabla ...</section>
</report>
\end{lstlisting}
    \\
    \hline
    Bericht-2 &
\begin{lstlisting}[language=XML,basicstyle=\tiny]
<report>
    <author>Christine</author>
    <author>Volker</author>
    <date>Jan 2008</date>
    <section>
        <section>... blabla ...</section>
        <section>... suelzsuelz ...</section>
    </section>
</report>
\end{lstlisting}
    \\
    \hline
    \end{tabular}
    \end{center}
\end{frame}

\begin{frame}[fragile]
    \frametitle{Registrieren des XML-Schemas}

    \begin{itemize}
    \item XML-Schemas müssen registriert werden
    \item Erkennungsmerkmal: Namespace
        \begin{itemize}
        \item http://www.profv.de/uni/xml\_xpath\_xquery/report
        \end{itemize}
    \end{itemize}

    \pause

\begin{lstlisting}[language=SQL,basicstyle=\tiny]
CREATE XML SCHEMA COLLECTION report_schemas
AS '<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                xmlns="http://www.profv.de/uni/xml_xpath_xquery/report"
    <xsd:element name="report" type="report"/>
    <xsd:complexType name="report">
        <xsd:sequence>
            <xsd:element name="author" type="xsd:string"
                         maxOccurs="unbounded"/>
            <xsd:element name="date" type="xsd:string"/>
            <xsd:element name="section" type="section"
                         maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="section" mixed="true">
        <xsd:sequence>
            <xsd:element name="section" type="section"
                         minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
    </xsd:schema>'

ALTER XML SCHEMA COLLECTION report_schemas ADD '...'
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
    \frametitle{Erstellen der Relation}

    \begin{itemize}
    \item Relation mit Constraint für das XML-Schema
\begin{lstlisting}[language=SQL]
CREATE TABLE reports (
    reportname VARCHAR(64) PRIMARY KEY, 
    report     XML(DOCUMENT report_schemas)
)
\end{lstlisting}

    \pause

    \item XML-Index
\begin{lstlisting}[language=SQL]
CREATE PRIMARY XML INDEX pxi_report
ON reports (report)
\end{lstlisting}

    \pause

    \item XML-Dokumente mit Namespace einfügen
\begin{lstlisting}[language=SQL,basicstyle=\tiny]
INSERT INTO reports (reportname, report) VALUES
('Bericht-0',
 '<report xmlns="http://www.profv.de/uni/xml_xpath_xquery/report">
      <author>Christine</author>
      <author>Volker</author>
      <date>Jan 2008</date>
      <section/>
  </report>')
\end{lstlisting}
    \end{itemize}
\end{frame}

\begin{frame}[fragile]
    \frametitle{Einfache SQL/XQuery-Anfrage}

\begin{lstlisting}[language=SQL]
SELECT
    reportname,
    report.query('
        FOR $i in /report[date="Jan 2008"]
        RETURN <januar-quatsch>
                   {$i/section}
               </januar-quatsch>')
FROM
    reports
\end{lstlisting}
\end{frame}

\section{Anfrage-Bearbeitung}

\begin{frame}
    \frametitle{Anfrage-Bearbeitung}

    \begin{itemize}
    \item XQuery $\rightarrow$ XML-Algebra-Baum
    \item XML-Algebra-Baum $\rightarrow$ (relationaler) Op.-Baum
    \item Op.-Baum erhält zusätzliche Operationen (Rel+)
    \item Optimierung des \textit{gesamtem} Op.-Baums
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{Anfrage-Bearbeitung}

    \begin{center}
    \begin{tikzpicture}[node distance=1.4cm]
        \node [rel]     (Ergebnis)                                   {Ergebnis};
        \node [rel]     (Optimierung) [above of=Ergebnis]            {Optimierung}
            edge [pfeil]    (Ergebnis);
        \node [rel]     (Op-Baum)     [above of=Optimierung]         {Op.-Baum \textcolor{red!60}{(Rel+)}}
            edge [pfeil]    (Optimierung);
        \node [rel]     (SQL)         [above of=Op-Baum,xshift=-2cm] {SQL}
            edge [pfeil]    (Op-Baum);
        \node [xml]     (XML-Op-Baum) [above of=Op-Baum,xshift=2cm]  {Op.-Baum (XML)}
            edge [pfeil]    (Op-Baum);
        \node [xml]     (XQuery)      [above of=XML-Op-Baum]         {XQuery}
            edge [pfeil]    (XML-Op-Baum);
        \node [rel]     (Anfrage)     [above of=XQuery,xshift=-2cm]  {Anfrage}
            edge [pfeil]    (XQuery)
            edge [pfeil]    (SQL);
    \end{tikzpicture}
    \end{center}
\end{frame}

\begin{frame}
    \frametitle{Neue relationale Operatoren (Rel+)}

    \begin{itemize}
    \item Apply
    \item XML\_Serialize
    \item Assemble Subtree
    \item Switch\_Union
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{Datenstruktur}

    \begin{itemize}
    \item XML-Dokument oder mehrere XML-Fragmente

    \pause

    \item XML als BLOB
        \begin{itemize}
        \item XML nicht in Relationen zerlegt
        \end{itemize}

    \pause

    \item XML-Index zeigt in den BLOB
    \item Auswertung: XML-Parser an entsprechender Stelle ansetzen
    \item Serialisierung: Ausschnitte herauskopieren
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{Typcheck}

    \begin{itemize}
    \item Typ-Inferenz
    \item überwiegend statischer Typcheck
    \item XML-Schema genutzt

    \pause

    \item Fehlerbehandlung
        \begin{itemize}
        \item bei statischem Typcheck $\rightarrow$ Abbruch
        \item bei dynamischen Typcheck $\rightarrow$ NULL / leeres XML
        \end{itemize}
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{XML-Index}

    \begin{itemize}
    \item indexierter vs. nicht-indexierter XML-Zugriff

    \pause

    \item primärer XML-Index
        \begin{itemize}
        \item XML-Knoten (Name, Typ, Wert)
        \item Pfad-ID
        \item OrdPath
        \end{itemize}

    \pause

    \item sekundäre XML-Indexe
        \begin{itemize}
        \item PATH
        \item PROPERTY
        \item VALUE
        \end{itemize}
    \end{itemize}
\end{frame}

\section{XQuery-Übersetzung}

\begin{frame}
    \frametitle{XQuery-Übersetzung: FOR}

    \begin{itemize}
    \item FOR
        \begin{itemize}
        \item XPath-Ausdruck
            \begin{itemize}
            \item Pfad-Ausdruck: exakt vs. inexakt
            \item Prädikat: siehe WHERE
            \end{itemize}
        \item Variablenbindung (Apply)
        \end{itemize}
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{Beispiel: Exakter Pfad-Ausdruck}

    \resizebox{\textwidth}{!}{%
        \includegraphics{Scherz-Skizze-3}}

\setbeamercovered{invisible}
\pause

    \begin{center}
    \Large\bf\color{red}
    Nur ein Scherz!
    \end{center}
\end{frame}

\begin{frame}[fragile]
    \frametitle{Beispiel: Exakter Pfad-Ausdruck}

\begin{lstlisting}[language=SQL]
SELECT
    reportname,
    report.query('
        FOR $i in /report/section
        RETURN $i')
FROM
    reports
\end{lstlisting}

\hrulefill
\vfill

    \begin{tikzpicture}[level distance=1cm]
        \tikzstyle{level 1}=[sibling distance=0cm]
        \tikzstyle{level 2}=[sibling distance=5cm]
        \tikzstyle{level 3}=[sibling distance=1.5cm]
        \node {XML\_Serialize}
            child[level distance=0.8cm] {node {Apply}
                child {node {SELECT(\$i)}
                    child {node {GET(PXI)}}
                    child[level distance=1.5cm] {node {Path\_ID='\#section\#report'}}}
                child {node {SELECT}
                    child {node {GET(PXI)}}
                    child[level distance=2cm] {node {\$i.OrdPath $\leq$ OrdPath $<$ DL(\$i)}}}}
            ;
    \end{tikzpicture}
\end{frame}

\begin{frame}[fragile]
    \frametitle{Beispiel: Inexakter Pfad-Ausdruck}

\begin{lstlisting}[language=SQL]
SELECT
    reportname,
    report.query('
        FOR $i in /report//section
        RETURN {$i}')
FROM
    reports
\end{lstlisting}

\hrulefill
\vfill

    \begin{tikzpicture}[level distance=1cm]
        \tikzstyle{level 1}=[sibling distance=0cm]
        \tikzstyle{level 2}=[sibling distance=4cm]
        \tikzstyle{level 3}=[sibling distance=4cm]
        \node {XML\_Serialize}
            child[level distance=0.8cm] {node {Apply}
                child {node {SELECT(\$i)}
                    child {node {GET(PXI)}}
                    child[level distance=1.5cm] {node {Path\_ID LIKE '\#section\%\#report'}}}
                child[level distance=1.1cm] {node {Assemble subtree of $<$section$>$}}}
            ;
    \end{tikzpicture}
\end{frame}

\begin{frame}
    \frametitle{XQuery-Übersetzung: LET}

    \begin{itemize}
    \item LET
        \begin{itemize}
        \item (noch) nicht unterstützt
        \end{itemize}
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{XQuery-Übersetzung: WHERE}

    \begin{itemize}
    \item WHERE / XPath-Prädikat
        \begin{itemize}
        \item SQL: Sub-SELECT mit EXISTS-Quantor
        \end{itemize}
    \end{itemize}
\end{frame}

\begin{frame}[fragile]
    \frametitle{Beispiel: XPath-Prädikat}

\begin{lstlisting}[language=SQL]
SELECT
    reportname,
    report.query('
        FOR $i in /report[date="Jan 2008"]
        RETURN {$i}')
FROM
    reports
\end{lstlisting}

\hrulefill
\vfill

    \begin{tikzpicture}[level distance=0.8cm]
        \tikzstyle{level 1}=[sibling distance=4cm]
        \tikzstyle{level 2}=[sibling distance=4cm]
        \tikzstyle{level 3}=[sibling distance=4cm]
        \tikzstyle{level 4}=[sibling distance=4cm]
        \node {...}
            child {node {SELECT}
                child {node {...}}
                child {node {EXISTS}
                    child {node {SELECT}
                        child {node {GET(PXI)}}
                        child {node {VALUE='Jan 2008' AND ...}}}}}
            ;
    \end{tikzpicture}
\end{frame}

\begin{frame}
    \frametitle{XQuery-Übersetzung: ORDER BY}

    \begin{itemize}
    \item ORDER BY
        \begin{itemize}
        \item SQL: ORDER BY
        \item zusätzliche Spalte: Rangfolge
            \begin{itemize}
            \item konvertiert nach OrdPath
            \end{itemize}
        \end{itemize}
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{XQuery-Übersetzung: RETURN}

    \begin{itemize}
    \item RETURN
        \begin{itemize}
        \item zusätzliche Spalte: New-Flag
        \item Zusammenfügen unter Berücksichtigung des Flags (Switch\_Union)
        \end{itemize}
    \end{itemize}
\end{frame}

\section{Optimierungen}

\begin{frame}[fragile]
    \frametitle{Optimierungen}

    \begin{itemize}
    \item unnötige Sortierungen vermeiden

    \pause

    \item Pfade über Klauseln hinweg zusammenführen
\begin{lstlisting}
    FOR $i in /report
        RETURN $i/author
\end{lstlisting}

    \pause

    \item nutze statische Typ-Information
        \begin{itemize}
        \item Zwischenwerte in korrektem Typ
        \item unnötige Konvertierungen vermeiden
        \item bei 1-elementigen Listen abkürzen
        \end{itemize}
    \end{itemize}
\end{frame}

\begin{frame}
    \frametitle{Frage an das Publikum}

    \begin{itemize}
    \item Wird das XML-Schema zur Optimierung genutzt?
    \end{itemize}
\end{frame}

\end{document}
