Top Banner
1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke
49

1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

Dec 21, 2015

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

1

XQuery to SQL by XAT

Xin ZhangThanks:

Brian, Mukesh, Maged, Lily, Elke

Page 2: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

2

Outline Merged algebra proposed based on

Niagara XPERANTO

One thorough example of XQuery SQL

Page 3: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

3

Data Model An Ordered Table in two dimensions

Tuple order Column order.

Every cell has its own domain Every column binds to one variable. The domain can be:

SQL domains. XML Fragment.

Can be a list of XML elements. Comparison are done by values

Page 4: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

4

Data Model Examples Table of XML Fragments. Explicit Naming

E.g. variable bindings Implicit Naming

E.g. XPath notations. Reduce complexity of many

internal variables.

<carrier> $carrier</carrier

invoice_id

carrier

carrier_entry

carriers <carrier> $carrier</carrier<carrier> $carrier</carrier>……….

/ /invoice /invoice/account_number

$rate

Page 5: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

5

Naming of Columns Implicit:

SQL operators Navigate

Explicit ( “name”): Variable binding:

Holding a set of values. Variable name ($name) is name of a column

Rename Distinguish in one operator where,

same “names” from different sources Abbreviate a very long “name”.

Create a new name for creation operators Need to used with those operators. E.g. Tagger

Page 6: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

6

Operators SQL like (9):

Project, Select, Join (Theta, Outer, Semi), Groupby, Orderby, Union (Node, Outer), COp.

XML like (4): Tagger, Navigate, is(Element, Text),

Aggregate. Special:

SQL, Function, Source, Name, FOR

Page 7: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

7

SQL like Operators (9)NiagaraNiagara XPERANTOXPERANTO

Project Expose Project

Select Select Select

Theta Join Join Theta Join

Outer Join N/A Outer Join

Semi Join N/A N/A

Groupby Group Groupby

Orderby N/A Orderby

Union Union Union

Outer Union

Union Outer Union

COp N/A Correlated Join

Page 8: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

8

XML like OperatorsNiagarNiagaraa

XPERANTOXPERANTO

Tagger*(pattern)

Vertex Project:cr8(Elem, AttList, Att, XMLFragList),

Navigate(from, path)

Follow Project:get(TagName, Attributes, Contents, AttName, AttValue), Unnest

Is N/A Select:is(Element, Text),

Aggregate Group AggXMLFrags

Page 9: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

9

Special Operators

NiagarNiagaraa

XPERANTXPERANTOO

DescriptionDescription

SQL N/A Input Denote a SQL query.

Function

N/A Function Used to represent recursive query

Source Source Table, View

Identify a data source.

Name Rename

N/A Naming of columns.

FOR N/A N/A FOR iteration.

Page 10: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

10

Operator Specification Description

Input Specification. Output Specification. Logic description.

Illustrative Example

Page 11: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

11

Naming Operator Syntax:

Name(“from_name”, “to_name”) Simplified Syntax:

to_name := from_name

Page 12: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

12

Steps in Translation XQuery XML Algebra Tree User View XML Algebra Tree View Composition Computation Pushdown Optimization

Page 13: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

13

<?xml version=”1.0” encoding=”US-ASCII” ?> <!DOCTYPE invoice [<!ELEMENT invoice (account_number,

bill_period, carrier+, itemized_call*, total)>

<!ELEMENT account_number (#PCDATA)><!ELEMENT bill_period (#PCDATA)><!ELEMENT carrier (#PCDATA)><!ELEMENT itemized_call EMPTY><!ATTLIST itemized_call

no ID #REQUIREDdate CDATA #REQUIREDnumber_called CDATA #REQUIREDtime CDATA #REQUIREDrate (NIGHT|DAY) #REQUIREDmin CDATA #REQUIREDamount CDATA #REQUIRED>

<!ELEMENT total (#PCDATA)>]>

<invoice>

<account_number>555 777-3158 573 234 3</account_number>

<bill_period>Jun 9 - Jul 8, 2000</bill_period>

<carrier>Sprint</carrier>

<itemized_call no=”1” date=”JUN 10” number_called=”973 555-8888” time=”10:17pm” rate=”NIGHT” min=”1” amount=”0.05” />

<itemized_call no=”2” date=”JUN 13” number_called=”973 650-2222” time=”10:19pm” rate=”DAY” min=”1” amount=”0.15” />

<itemized_call no=”3” date=”JUN 15” number_called=”206 365-9999” time=”10:25pm” rate=”NIGHT” min=”3” amount=”0.15” />

<total>$0.35</total>

</invoice>

Example of Telephone Bill

Page 14: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

14

Example XQueryUser XQuery: <summary>{

FOR $rate IN distinct(document(“invoice”)/invoice/itemized_call@rate)

LET $itemized_call := document(“invoice”)/invoice/itemized_call[@rate=$rate]

WHERE $itemized_call/@number_called LIKE ‘973%’

RETURN<rate>$rate</rate><number_of_calls>count($itemized_call)</number_of_calls>

}</summary>

Count number of itemized_calls in calling area 973 grouped by the calling rate.

Page 15: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

15

XQuery XML Algebra Tree Divide into query blocks Convert each query block into XML

Algebra Tree (XAT). Identify Correlated Operators Combine into one XML Algebra

Tree. Query decorrelation

Page 16: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

16

Query BlocksUser XQuery: <summary>{

FOR $rate IN distinct(document(“invoice”)/invoice/itemized_call@rate)

LET $itemized_call := document(“invoice”)/invoice/itemized_call[@rate=$rate]

WHERE $itemized_call/@number_called LIKE ‘973%’

RETURN<rate>$rate</rate><number_of_calls>count($itemized_call)</number_of_calls>

}</summary>

B1: Construct summary from the result from B2B2: Get all the distinct rate and iterate through it.

B1

B2

B3

B3: Count itemized call for a given rate.

The block identification is

arbitrary (wrong).

Page 17: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

17

XAT of B1

B1B1<summary>

</summary>

B2B2

XAT:

Tagger(<summary>[V1] </summary>)

B2

[V2] it is a name instead of a part of pattern.

Name(“Tagger(<summary>[V1]</summary>)”, “V2”)

Page 18: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

18

XAT of B2

B3B3{FOR

$rate IN distinct(document(“invoice”)/invoice/itemized_call@rate)

}

B3B3

XAT:

Select(distinct(“invoice/itemized_call/@rate:/”))

B3

Source(“invoice.xml”)

Navigate(“/”, invoice/itemized_call/@rate)

Name(“distinct(invoice/itemized_call/@rate:/)”, “$rate”)

FOR($rate)

Aggregate

Page 19: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

19

XAT of B3

B4B4LET

$itemized_call := document(“invoice”) /invoice/itemized_call [@rate=$rate]

WHERE $itemized_call /@number_called LIKE ‘973%’

RETURN<rate>$rate</rate><number_of_calls> count($itemized_call) </number_of_calls>

XAT:

Navigate(“$itemized_call”, @rate)

Source(“invoice.xml”)

Navigate(“/”, invoice/itemized_call)

B2

Select(“@rate:$itemized_call” = “$rate”)

Name(“invoice/itemized_call:/”, “$itemized_call”)

Page 20: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

20

XAT of B3 (Cont.)

B4B4LET

$itemized_call := document(“invoice”) /invoice/itemized_call [@rate=$rate]

WHERE $itemized_call /@number_called LIKE ‘973%’

RETURN<rate>$rate</rate><number_of_calls> count($itemized_call) </number_of_calls>

XAT:

Navigate(“$itemized_call”, @number_called)

Select(“@number_called:$itemized_call” like ‘973%’)

Page 21: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

21

XAT of B3 (Cont.)

B4B4LET

$itemized_call := document(“invoice”) /invoice/itemized_call [@rate=$rate]

WHERE $itemized_call /@number_called LIKE ‘973%’

RETURN<rate>$rate</rate><number_of_calls> count($itemized_call) </number_of_calls>

XAT:

Tagger(<rate>[$rate]</rate><number_of_calls>

[count($itemized_call)]</number_of_calls>)

Select(count(“$itemized_call”))B2

Name(“Tagger(<rate>[$rate]</rate> <number_of_calls>[count($itemized_call)]</number_of_calls>)”, “V1”)

Page 22: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

22

Put it Together

Select(count(“$itemized_call”))

Navigate(“$itemized_call”, @number_called)

Select(“@number_called:$itemized_call” like ‘973%’)

Source(“invoice.xml”)

Navigate(“/”, invoice/itemized_call)

Select(“@rate:$itemized_call” = “$rate”)

Name(“Tagger(<summary>[V1]</summary>)”, “V2”)

Select(distinct(“invoice/itemized_call/@rate:/”))

Source(“invoice.xml”)

Navigate(“/”, invoice/itemized_call/@rate)

Name(“invoice/itemized_call:/”, “$itemized_call”)

Navigate(“$itemized_call”, @rate)

B1

B2

B3

FOR($rate)

Name(“distinct(invoice/itemized_call/@rate:/)”, “$rate”)

Aggregate()Tagger(<rate>[$rate]</rate><number_of_calls>[count($itemized_call)]</number_of_calls>)

Name(“Tagger(<rate>[$rate]</rate> <number_of_calls>[count($itemized_call)]</number_of_calls>)”, “V1”)

Tagger(<summary>[V1] </summary>)

Page 23: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

23

Syntax Suger

Select(count(“$itemized_call”))

Navigate(“$itemized_call”, @number_called)

Select(“@number_called:$itemized_call” like ‘973%’)

Source(“invoice.xml”)

$itemized_call := Navigate(“/”, invoice/itemized_call)

Select(“@rate:$itemized_call” = “$rate”)

V2 := Tagger(<summary>[V1] </summary>)

$rate := Select(distinct(“invoice/itemized_call/@rate:/”))

Source(“invoice.xml”)

Navigate(“/”, invoice/itemized_call/@rate)Navigate(“$itemized_call”, @rate)

B1

B2

B3

FOR($rate)

Aggregate()

V1:=Tagger(<rate>[$rate]</rate><number_of_calls>[count($itemized_call)]</number_of_calls>)

Page 24: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

24

Query Decorrelation for COp Top-down approach over XAT Tree. Approach:

Correlated Binding (CB) Op1[COp(CB, Op2)[Op3[Correlated

Operator[A],B]]] Op1[ROJ(CB)[Op2[Groupby(CB, Op3[]) [Operator[Cartesian[A,B]]]], B]]

For example: Correlated Join Outer Join with Groupby

with Cartesian

Page 25: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

25

Query Decorrelation for FOR Top-down approach over XAT Tree. Approach:

Correlated Binding (CB) Op1[FOR(CB)[Op2[Correlated

Operator[A],B]]] Op1[Groupby(CB, Op2[]) [Operator[Cartesian[A,B]]]]

Differences: SQL Decorrelation: Return Outer Query XQuery Decorrelation: Return Inner Query CO: Return both Outer/Inner Query

Page 26: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

26

FOR Decorrelation Example

Source(“invoice.xml”)

Select(“@rate:$itemized_call” = “$rate”)

…1

Source(“invoice.xml”)

…3

B2

B3

FOR($rate)

…2

Source(“invoice.xml”)Select(“@rate:$itemized_call” = “$rate”)

Groupby(“$ratel”, )

Cartesian

Source(“invoice.xml”)

…3

B1 B1B2

B3

AggregateAggregate

…2

…1

Page 27: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

27

Default XML View<invoice>

<row><id> 1 </id><account_number>555 777-3158 573 234

3</account_number><bill_period> Jun 9 – Jun 8, 2000 </bill_period><total>$0.35</total>

</row>

</invoice><carrier>

<row><invoice_id> 1 </invoice_id><carrier>Sprint</carrier>

</row>

</carrier>...

id account_number bill_period total

1 555 777-3158 573 234 3

Jun 9 – Jun 8, 2000

$0.35

invoice

invoice_id carrier

1 Sprint

carrier

invoice_id

no

date number_called

time rate min

amount

1 1 JUN 10

973 555-8888

10:17pm

NIGHT

1 0.05

1 2 JUN 13

973 650-2222

10:19am

DAY 1 0.15

1 3 JUN 15

206 365-9999

10:25pm

NIGHT

3 0.15

itemized_call

Page 28: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

28

User Defined XML View<invoice>

<account_number>555 777-3158 573 234 3</account_number>

<bill_period>Jun 9 - Jul 8, 2000</bill_period>

<carrier>Sprint</carrier>

<itemized_call no=”1” date=”JUN 10” number_called=”973 555-8888” time=”10:17pm” rate=”NIGHT” min=”1” amount=”0.05” />

<itemized_call no=”2” date=”JUN 13” number_called=”973 650-2222” time=”10:19pm” rate=”DAY” min=”1” amount=”0.15” />

<itemized_call no=”3” date=”JUN 15” number_called=”206 365-9999” time=”10:25pm” rate=”NIGHT” min=”3” amount=”0.15” />

<total>$0.35</total>

</invoice>

<invoice><row>

<id> 1 </id><account_number>555 777-3158 573 234

3</account_number><bill_period> Jun 9 – Jun 8, 2000 </bill_period><total>$0.35</total>

</row>

</invoice><carrier>

<row><invoice_id> 1 </invoice_id><carrier>Sprint</carrier>

</row>

</carrier><itemized_call>

<row><invoice_id>1</invoice_id><no>1</no>…

</row>…

</itemized_call>

Page 29: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

29

User Defined XML View Cont.

Create view invoice as (FOR

$invoice IN view(“default”)/invoice/row

RETURN<invoice>

<account_number>$invoice/account_number/text()</account_number><bill_period>$invoice/bill_period/text()</bill_period>FOR

$carrier in view(“default”)/carrier/rowWHERE

$carrier/invoice_id = $invoice/idRETURN

<carrier>$carrier/carrier/text()</carrier>FOR

$itemized_call in view(“default”)/itemized_call/rowWHERE

$itemized_call/invoice_id = $invoice/idRETURN

<itemized_call no=$itemized_call/no/text() date=$itemized_call/date/text() number_called=$itemized_call/number_called/text() time=$itemized_call/time/text() rate=$itemized_call/rate/text() min=$itemized_call/min/text() amount=$itemized_call/amount /text()>

SORTBY (@no)<total>$invoice/total/text()</total>

</invoice>

)

Page 30: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

30

User Defined XML View Block

Create view invoice as (FOR

$invoice IN view(“default”)/invoice/row

RETURN<invoice>

<account_number>$invoice/account_number/text()</account_number><bill_period>$invoice/bill_period/text()</bill_period>FOR

$carrier in view(“default”)/carrier/rowWHERE

$carrier/invoice_id = $invoice/idRETURN

<carrier>$carrier/carrier/text()</carrier>FOR

$itemized_call in view(“default”)/itemized_call/rowWHERE

$itemized_call/invoice_id = $invoice/idRETURN

<itemized_call no=$itemized_call/no/text() date=$itemized_call/date/text() number_called=$itemized_call/number_called/text() time=$itemized_call/time/text() rate=$itemized_call/rate/text() min=$itemized_call/min/text() amount=$itemized_call/amount /text()>

SORTBY (@no)<total>$invoice/total/text()</total>

</invoice>

)

B4

B5

B6

Page 31: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

31

XML View XAT

V4 := Tagger(<invoice><account_number>[$invoice/account_number/text()]</account_number><bill_period>[$invoice/bill_period/text()</bill_period>…[V3]<total>[$invoice/total/text()]</total></invoice>)

V3 := Tagger(<itemized_call no=[] date=[]number_called=[] time=[] rate=[] min=[] amount=[]/>

Aggregate()Aggregate()

Source(“default..xml”)

$invoice := Navigate(“/”,invoice/row )

FOR($invoice/id)

Source(“default.xml”)

$itemized_call := Navigate(“/”, itemized_call/row)

Navigate($itemized_call, no/text())

Navigate($itemized_call, invoice_id)

Select(“$itemized_call/invoice_id”=“$invoice/id”)

Navigate(“$invoice”, id)

B5

Navigate($itemized_call, amount/text())

Page 32: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

32

3-Way Correlation

…2

Source(“invoice.xml”)

B4

FOR($invoice/id)

…1

B5B6

Page 33: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

33

3-Way Decorrelation

…2

Source(“default.xml”)

B4

JOIN($invoice/id)

…1

B5 with CartesianB6 with Cartesian

GB($invoice/id, …) GB($invoice/id, …)

…2

Source(“default.xml”)

Page 34: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

34

View XAT After Decorrelation

V4 := Tagger(<invoice><account_number>[$invoice/account_number/text()]</account_number><bill_period>[$invoice/bill_period/text()</bill_period>…[V3]<total>[$invoice/total/text()]</total></invoice>)

V3 := Tagger(<itemized_call no=[] date=[]number_called=[] time=[] rate=[] min=[] amount=[]/>

Aggregate()Groupby($invoice/id, Aggregate())

Source(“default..xml”)

$invoice := Navigate(“/”,invoice/row )

Join($invoice/id)

Source(“default.xml”)

$itemized_call := Navigate(“/”, itemized_call/row)

Navigate($itemized_call, no/text())

Navigate($itemized_call, invoice_id)

Join(“$itemized_call/invoice_id”=“$invoice/id”)

Navigate(“$invoice”, id) B5

Navigate($itemized_call, amount/text())

Groupby($invoice/id…)

Source(“default..xml”)

$invoice := Navigate(“/”,invoice/row )

Navigate(“$invoice”, id)

Page 35: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

35

View Composition Input:

User Query XAT + User View XAT Output:

Simplified composite XAT Approach:

XAT Cutting: Remove un-referenced columns and operators.

Pushdown Navigation By using the commutative rules

Cancel out the navigation operators By using the composition rules

Page 36: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

36

XAT Cutting Cut Query Blocks

User query only require itemized_call. B5 is cut, Invoice is cut

B4 is simplified. B6 is simplified.

Cut Columns User query only used

itemized_call@rate.

Page 37: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

37

View XAT After B5 is Cut.

V4 := Tagger(<invoice><account_number>[$invoice/account_number/text()]</account_number><bill_period>[$invoice/bill_period/text()</bill_period[V3]<total>[$invoice/total/text()]</total></invoice>)

V3 := Tagger(<itemized_call no=[] date=[]number_called=[] time=[] rate=[] min=[] amount=[]/>

Aggregate()Groupby($invoice/id, Aggregate())

Source(“default..xml”)

$invoice := Navigate(“/”,invoice/row )

Source(“default.xml”)

$itemized_call := Navigate(“/”, itemized_call/row)

Navigate($itemized_call, no/text())

Navigate($itemized_call, invoice_id)

Join(“$itemized_call/invoice_id”=“$invoice/id”)

Navigate(“$invoice”, id)

Navigate($itemized_call, amount/text())

Page 38: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

38

View After Columns are Cut.

V4 := Tagger(<invoice>[V3] </invoice>)

V3 := Tagger(<itemized_call number_called=[] rate=[] />

Aggregate()

Groupby($invoice/id, Aggregate())

Source(“default..xml”)

$invoice := Navigate(“/”,invoice/row )

Source(“default.xml”)

$itemized_call := Navigate(“/”, itemized_call/row)

Navigate($itemized_call, number_called/text())

Navigate($itemized_call, invoice_id)

Join(“$itemized_call/invoice_id”=“$invoice/id”)

Navigate(“$invoice”, id)

Navigate($itemized_call, rate/text())

Page 39: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

39

Navigation Cancel Out Navigation Pushdown

Based on some transformation rules. E.g. commutative of navigation and

other operators. Navigation + Tagger Cancel Out

Composition Rules. The cancellation result is “renaming”

Page 40: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

40

Query XAT Navi. Pushdown

Select(count(“$itemized_call”))

Navigate(“$itemized_call”, @number_called)

Select(“@number_called:$itemized_call” like ‘973%’)

Source(“invoice.xml”)

$itemized_call := Navigate(“/”, invoice/itemized_call)

Select(“@rate:$itemized_call” = “$rate”)

Navigate(“$itemized_call”, @rate)

B3V1:=Tagger(<rate>[$rate]</rate><number_of_calls>[count($itemized_call)]</number_of_calls>)

Select(count(“$itemized_call”))

Navigate(“$itemized_call”, @number_called)

Select(“@number_called:$itemized_call” like ‘973%’)

Source(“invoice.xml”)

$itemized_call := Navigate(“/”, invoice/itemized_call)

Select(“@rate:$itemized_call” = “$rate”)

Navigate(“$itemized_call”, @rate)

V1:=Tagger(<rate>[$rate]</rate><number_of_calls>[count($itemized_call)]</number_of_calls>)

Page 41: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

41

Navi. Tagger Cancel Out

Navigate(“$itemized_call”, @number_called)

Source(“invoice.xml”)

$itemized_call := Navigate(“/”, invoice/itemized_call)

Navigate(“$itemized_call”, @rate)

B3…1

V4 := Tagger(<invoice>[V3] </invoice>)

V3 := Tagger(<itemized_call number_called=[] rate=[] />

Aggregate()

Groupby($invoice/id, Aggregate())

Navigate($itemized_call, number_called/text())

Navigate($itemized_call, rate/text())

…2

Page 42: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

42

The Result of Cancel Out

…1

$itemized_call@rate := Navigate($itemized_call, rate/text())

$Itemized_call@number_called := Navigate($itemized_call, number_called/text())

…2

Page 43: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

43

Computation Pushdown Goal: XAT SQL operators + XML

operators Step 0: Navigation Pushdown. Step 1: XML Default View SQL

Operators Renaming columns

Step 2: SQL Computation Pushdown. By commutative and composition rules. E.g: predicates pushdown.

Page 44: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

44

Navigation Pushdown.

Source(“default..xml”)

$invoice := Navigate(“/”,invoice/row )Source(“default.xml”)

$itemized_call := Navigate(“/”, itemized_call/row)

Navigate($itemized_call, invoice_id)

Join(“$itemized_call/invoice_id”=“$invoice/id”)

Navigate(“$invoice”, id)

$itemized_call@rate := Navigate($itemized_call, rate/text())

$Itemized_call@number_called := Navigate($itemized_call, number_called/text())

Source(“default.xml”)

$itemized_call := Navigate(“/”, itemized_call/row)

$itemized_call@rate := Navigate($itemized_call, rate/text())

$Itemized_call@number_called := Navigate($itemized_call, number_called/text())

Join(“$itemized_call/invoice_id”=“$invoice/id”)

Page 45: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

45

XML Default View SQL

Source(“default.xml”)

$itemized_call := Navigate(“/”, itemized_call/row)

$itemized_call@rate := Navigate($itemized_call, rate/text())

$Itemized_call@number_called := Navigate($itemized_call, number_called/text())

Source(“itemized_call”)

Project(rate, number_called)

$itemized_call@rate := rate

$Itemized_call@number_called := number_called

Page 46: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

46

Computation Pushdown

A SQL Block

Select(count(“$itemized_call”))

Select(“@number_called:$itemized_call” like ‘973%’)

Select(“@rate:$itemized_call” = “$rate”)

V1:=Tagger(<rate>[$rate]</rate><number_of_calls>[count($itemized_call)]</number_of_calls>)

B3

Select(“@number_called:$itemized_call” like ‘973%’)

Select(count(“$itemized_call”))

Select(“@rate:$itemized_call” = “$rate”)

V1:=Tagger(<rate>[$rate]</rate><number_of_calls>[count($itemized_call)]</number_of_calls>)

A SQL Block

Page 47: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

47

Result of the Transformation

Tagger(<summary>[V1]</summary>)

V1 := Aggregate

Tagger(<rate>[rate]</rate><number_of_calls>[count(*)]</number_of_calls>)

SQL:SELECT rate, count(*)FROM itemized_call, invoiceWHERE number_called LIKE ‘973%’ AND invoice.id = itemized_call.invoice_idGROUPBY rate

Page 48: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

48

Optimization Efficient Publishing XML Views

Sorted Outer Union. Special Tagger implementation

A lot More!

Page 49: 1 XQuery to SQL by XAT Xin Zhang Thanks: Brian, Mukesh, Maged, Lily, Elke.

49

Summary XQuery XAT

Query Block Identification Query Decorrelation

View Composition XAT Cutting Navigation Pushdown Navigation Cancel Out

Computation Pushdown Navigation Pushdown XML Default View SQL Operators Computation Pushdown

Optimization