30
Подход к реализации XQuery Паращенко Олег нкт-Петербургский Государственный Универси [email protected] Обнинск, 2004

Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет [email protected]

Embed Size (px)

Citation preview

Page 1: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

Подход к реализации XQuery

Паращенко Олег

Санкт-Петербургский Государственный Университет

[email protected]

Обнинск, 2004

Page 2: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

XML<article id="hw"> <title>Hello</title> <para>Hello, <object>World</object>!</para></article>

article

/

title para@id

object“hw” “Hello” “Hello, ” “!”

“World”

Page 3: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

<usr> <bin> <cat/> <echo/> <xmllint/> … </bin> <lib> … </lib></usr>

Простой XPath

Похож на путь к файлу

/usr/bin/xmllint

Page 4: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

<AAA> <BBB/> <CCC/> <BBB/> <BBB/> <DDD> <BBB/> </DDD> <CCC/></AAA>

Простой XPath

Результат —множество узлов

/AAA/CCC

Page 5: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

<AAA> <BBB/> <CCC/> <BBB/> <DDD> <BBB/> </DDD> <CCC> <DDD> <BBB/> <BBB/> </DDD> </CCC></AAA>

//

Поиск по всемуподдереву

//DDD/BBB

Page 6: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

<AAA> <XXX> <DDD> <BBB/> <EEE/> <FFF/> </DDD> </XXX> <CCC> <XXX> <BBB/> <BBB/> <EEE/> <FFF/> </XXX> </CCC></AAA>

*

Любое имя

/AAA/*/*/BBB

Page 7: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

<AAA> <BBB id="b1"/> <BBB id="b2"/> <BBB name="bbb"/> <BBB/></AAA>

@

Атрибут

//BBB/@name

Page 8: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

Оси навигации

child::enamedescendant::enameparent::node()attribute::anameself::node()ancestorfollowing-siblingpreceding-sibling…

ename//ename..@aname.

Page 9: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

Фильтрация

<AAA> <BBB/> <BBB/> <BBB/> <BBB/></AAA>

<AAA> <BBB/> <BBB/> <BBB/> <BBB/></AAA>

(/AAA/BBB)[1] (/AAA/BBB)[last()]

Page 10: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

Фильтрация, функции

//bin[vim]

//openssh[.//sshd[@date<20040923]]

//bin/*[contains(name(), 'vi')]

Page 11: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

Запросы не для XPath

Обратные ссылки/... /xxx//... /yyy//... [..?xxx..?yyy...]

Создание элементов,переименование

Page 12: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

Пример XQuery

<example> <p> Here is a query. </p> <eg> doc("books.xml")//book[1]/title </eg> <p> Here is the result of the above query.</p> <eg>{ doc("books.xml")//book[1]/title }</eg></example>

<example> <p> Here is a query. </p> <eg> doc("books.xml")//book[1]/title </eg> <p> Here is the result of the above query.</p> <eg><title>TCP/IP Illustrated</title></eg></example>

Page 13: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

FLWOR (“flower”) expressions

for—let—where—order by—return

for $i in (1, 2, 3)return <tuple><i>{ $i }</i></tuple>

<tuple><i>1</i></tuple><tuple><i>2</i></tuple><tuple><i>3</i></tuple>

Page 14: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

define function toc($book-or-section as element()) as element()*{ for $section in $book-or-section/section return <section> { $section/@* , $section/title , toc($section) } </section>}<toc> { for $s in doc("xquery-book.xml")/book return toc($s) }</toc>

Функции

Page 15: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

Ресурсы

Спецификации

А.Валиков “Технология XSLT”

http://xmlhack.ru/

“XQuery from the Experts: A Guide to the W3C XML Query Language” by Howard Katz, D. D. Chamberlin

http://zvon.org/

Page 16: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

Подход к реализации XQuery

Паращенко Олег

Санкт-Петербургский Государственный Университет

[email protected]

Обнинск, 2004

(продолжение)

Page 17: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

XPath vs “вручную”get_elem("elemname[i]") vs/** * Returns child element at given position. Position can be * negative. In this case nodes are counting from end. * Last node position is '-1'. * @param node parent node * @param name name of node, null if not important * @param pos position of node starting from zero, can be negative */public static Element getChildElement (Element node, String name, int s) { // // Update position to be always positive. // boolean fromEnd = pos < 0; if (fromEnd) { pos = -(pos + 1); } // // Initialize // Node cur_node = fromEnd ? node.getLastChild(): node.getFirstChild(); int cur_pos = -1; // // Walk on children //

for (; cur_node != null; cur_node = (fromEnd ? cur_node.getPreviousSibling() : cur_node.getNextSibling ())) { // // Check that current node is of type 'element' // if (cur_node.getNodeType() != Node.ELEMENT_NODE) { continue; } // // Get element, check its name and position // Element cur_elem = (Element)cur_node; if ((name != null) && (! name.equals (cur_elem.getTagName()))) { continue; } cur_pos++; if (cur_pos == pos) { return cur_elem; } } // // If node was found, it was returned from inside loop // return null;}

Page 18: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

XPath vs “вручную”

наглядность

меньше кода – меньше ошибоки дополнительных расходов

менее 1 минутыvs

более 2 часов

Page 19: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

Программы с деревьями

findтекстовые процессорыкомпиляторы, интерпретаторы

встроенный xpath/xquery —“серебрянная пуля”

Page 20: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

Единая реализацияБиблиотеки C vs Java vs .NET vs …

Виртуальная машина● Реализация XQuery на удобном языке программирования● Байт-код ВМ● Интерпретатор ВМ

Page 21: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

Готовые реализации● CL-XML● SXML/SXPath/SXQuery

Удобный язык● Common Lisp или Scheme

Page 22: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

SXML

<article id="hw"> <title>Hello</title> <para>Hello, <object>World</object>!</para></article>

(*TOP* (article (@ (id "hw")) (title "Hello") (para "Hello, " (object "World") "!")))

S-exp:

XML:

Page 23: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

SXPath

((txpath "//TAF/VALID/@TRange/text()") document)

((sxpath '(// TAF VALID @ TRange *text*)) document)

((node-join (node-closure (node-typeof? 'TAF)) (select-kids (node-typeof? 'VALID)) (select-kids (node-typeof? '@)) (select-kids (node-typeof? 'TRange)) (select-kids (node-typeof? '*text*))) document)

Page 24: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

Части системы

SXQuery XQuery VM

макрораскрытие, компиляция

В программе:Интерпретатор ВМ

Привязка (bindings)

Парсер XML, XPath, XQuery

Page 25: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

Этапы развития

Сейчас – проверка идеи

v.0.1: Python AST

v.1.0: Docbook XSLT

Page 26: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

Похожие системы

Частично – любая реализацияXPath/XQuery

XSLTC от Oracle

Page 27: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

Оптимизация

(//ename)[1]

Page 28: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

ВМ как исходный код

e1 := _X(doc, “AAA//BBB/CCC”)e2 := _X(doc, “AAA//BBB/DDD”)

t1 := child(doc, “AAA”)t2 := descendant(t1, “BBB”)e1 := child(t2, “CCC”)t3 := child(doc, “AAA”)t4 := descendant(t3, “BBB”)e2 := child(t4, “DDD”)

t1 := child(doc, “AAA”)t2 := descendant(t1, “BBB”)e1 := child(t2, “CCC”)e2 := child(t2, “DDD”)

Page 29: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

Другие ВМ

Java VM

.NET VM

LLVM

Page 30: Подход к реализации XQuery Паращенко Олег Санкт-Петербургский Государственный Университет olpa@uucode.com

Подход к реализации XQuery

Паращенко Олег

Санкт-Петербургский Государственный Университет

[email protected]

Обнинск, 2004