cutting edge data processing with php & xquery
DESCRIPTION
The goal of this talk is to explore the gain of functionality and productivity that can be achieved by introducing XQuery into PHP applications.TRANSCRIPT
![Page 1: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/1.jpg)
Cutting Edge Data Processingwith PHP & XQuery
William Candillon {[email protected]}PHP Tour Lille 2011
28 msec
![Page 2: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/2.jpg)
A Rich Ecosystem
Platforms Frameworks Libraries
Code
Data
? ? ?Relational XML JSON Text
PDOPHP Data Objects
![Page 3: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/3.jpg)
A Rich Ecosystem
Platforms Frameworks Libraries
Code
Data
Relational XML JSON Text
PDOPHP Data Objects
QueryX
![Page 4: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/4.jpg)
Our Goal
Contribute the features from relational APIs to unstructured data
![Page 5: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/5.jpg)
Data APIs
PDO SimpleXML Zend JSON XQuery
Data Relational XML JSON XML/JSON
Queries ✔ XPath X ✔
Updates ✔ X X ✔
Streaming ✔ X X ✔
Full-Text ✔ X X ✔
![Page 6: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/6.jpg)
Meet XQuery
• Family of specifications from W3C
- XQuery 3.0
- Update Facility
- Scripting Extension
- Full-Text
• EXPath: de-facto standard libraries
![Page 7: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/7.jpg)
Meet Zorba
Open Source XQuery Processor
Contributors: Oracle, 28msec, FLWOR
All Flavors Available Runs Everywhere
Rich Module Libraries Developer Tools
Pluggable Store Fun & Productive
![Page 8: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/8.jpg)
Zorba
![Page 9: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/9.jpg)
<?phprequire_once ‘ZorbaXQueryProcessor.php’;
$xquery = new XQueryProcessor();
$xquery->importQuery(‘1+1’);
echo $xquery->execute();?>
![Page 10: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/10.jpg)
<?phprequire_once ‘ZorbaXQueryProcessor.php’;
$xquery = new XQueryProcessor();
$query = <<<‘XQ’ let $world := ‘World’ return <h1>Hello {$world}</h1>XQ;
$xquery->importQuery($query);
echo $xquery->execute();?>
![Page 11: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/11.jpg)
<?phprequire_once ‘ZorbaXQueryProcessor.php’;
$xquery = new XQueryProcessor();
$xquery->importQueryFromURI(‘hello.xq’);
echo $xquery->execute();?>
![Page 12: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/12.jpg)
<?phprequire_once ‘ZorbaXQueryProcessor.php’;
$xquery = new XQueryProcessor();
$query = <<<‘XQ’ declare variable $world external;
<h1>Hello {$world}</h1>XQ;
$xquery->importQuery($query);
$xquery->setVariable(‘world’, ‘World!’);
echo $xquery->execute();?>
![Page 13: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/13.jpg)
$xquery = new XQueryProcessor();
$query = <<<‘XQ’declare variable $foo as xs:string external;declare variable $bar as xs:integer external;declare variable $doc1 as document-node() external;declare variable $doc2 as document-node() external;
$foo, $bar, $doc1, $doc2XQ;
$xquery->importQuery($query);
$xquery->setVariable(‘foo’, ‘bar’);$xquery->setVariable(‘bar’, 3);
$doc = simplexml_load_file ('data/sessions.xml');$xquery->setVariable("doc1", $doc);
$doc = $xquery->parseXML ("<root />");$xquery->setVariable("doc2", $doc);
echo $xquery->execute();
![Page 14: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/14.jpg)
Queries
Updates
Full-Text
Streaming
![Page 15: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/15.jpg)
Queries
Updates
Full-Text
Streaming
![Page 16: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/16.jpg)
import module namespace functx = "http://www.functx.com/";import module namespace html = "http://example.com/html";
declare variable $sessions external;
<html lang="en"> <body> {$html:header}
<div id="main">{ html:sessions($sessions/*) }</div>
{$html:footer}</body></html>
![Page 17: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/17.jpg)
<div id=”sessions”>{ for $session in $sessions let $title := string($session/@title) where $session/@conf = “PHP Tour Lille” order by $session/@starts ascending return <div> <h1>{$title}</h1> </div>}</div>
![Page 18: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/18.jpg)
<div id=”sessions”>{for $day-sessions in $sessionslet $starts := dateTime($day-sessions/@starts)let $day := xs:day($starts)group by $dayorder by $starts ascendingreturn <div> <h1>{$day}</h1> { for $session in $day-sessions return <h2>{string($session/@title)}</h2> } </div>}</div>
![Page 19: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/19.jpg)
Queries
Updates
Full-Text
Streaming
![Page 20: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/20.jpg)
insert node $bios[@id=”wcandilllon”] into $sessions[@id=”xquery”]
![Page 21: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/21.jpg)
replace value of node $session/@starts with “2011-11-24T10:15:00”
replace value of node $session/@ends with “2011-11-24T10:15:00”
![Page 22: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/22.jpg)
let $session := $sessions[id="XQuery"]return if ($session/rating) then replace value of node $session/rating with "B" else insert node <rating>B</rating> into $session
![Page 23: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/23.jpg)
Queries
Updates
Full-Text
Streaming
![Page 24: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/24.jpg)
let $sessions := $sessions/session[ . contains text {$search-term} all words distance at most 8 words]return if(empty($sessions)) then <h1>No Results found</h1> else html:sessions($sessions)
![Page 25: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/25.jpg)
let $x := <msg>breakfast of champions</msg>return $x contains text "meal"
![Page 26: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/26.jpg)
let $x := <msg>breakfast of champions</msg>return $x contains text "meal" using thesaurus at "http://wordnet.princeton.edu" relationship "narrower term"
![Page 27: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/27.jpg)
let $doc := doc(“doc.xml”)for $token in ft:tokenize($doc)return concat($token/@value, “ at ”, $token/@paragraph, $token/@sentence )
![Page 28: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/28.jpg)
Demo
![Page 29: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/29.jpg)
Queries
Updates
Full-Text
Streaming
![Page 30: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/30.jpg)
Forecast Data
- 1 Day of Forecast data: 727MB
- Get data for a specific site
- Send selected temperatures to clients
- Display chart
![Page 31: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/31.jpg)
<?php$siteId = 3;$forecasts = simplexml_load_file('forecasts.xml');$forecasts = $forecasts->xpath( "/forecast-list/forecast[@site-id='$siteId']");
foreach($forecasts as $forecast) { $time = $forecast->xpath("@time-step"); $value = $forecast->xpath( "//weather-elements/weather-element" ."[@name = 'ScreenTemperature']/text()");
! echo "<temperature time='" .$time[0] ."'value='" .$value[0]."' />\n";}?>
![Page 32: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/32.jpg)
<?php$siteId = 3;$forecasts = simplexml_load_file('forecasts.xml');$forecasts = $forecasts->xpath( "/forecast-list/forecast[@site-id='$siteId']");
foreach($forecasts as $forecast) { $time = $forecast->xpath("@time-step"); $value = $forecast->xpath( "//weather-elements/weather-element" ."[@name = 'ScreenTemperature']/text()");
! echo "<temperature time='" .$time[0] ."'value='" .$value[0]."' />\n";}?>
Oups ?!?
![Page 33: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/33.jpg)
<?php$siteId = 3;$forecasts = simplexml_load_file('forecasts.xml');$forecasts = $forecasts->xpath( "/forecast-list/forecast[@site-id='$siteId']");
foreach($forecasts as $forecast) { $time = $forecast->xpath("@time-step"); $value = $forecast->xpath( "//weather-elements/weather-element" ."[@name = 'ScreenTemperature']/text()");
! echo "<temperature time='" .$time[0] ."'value='" .$value[0]."' />\n";}?>
Memory Footprint: 9GB
![Page 34: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/34.jpg)
for $forecast in z:parse-xml(file:read-text("forecasts.xml"), <opt:options> <opt:parseExternalParsedEntity opt:skipRootNodes="1"/> </opt:options>)where $forecast/@site-id = "3"let $time := string($forecast/@time-step)let $value := $forecast/weather-elements/weather-element [@name = 'ScreenTemperature']/text()return <temperature time="{$time}" value="{$value}" />
Memory Footprint: 19MB
![Page 35: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/35.jpg)
Demo
![Page 36: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/36.jpg)
Results
SimpleXML XMLReader XQuery
Streaming X ✔ ✔
Productivity ✔ X ✔
![Page 37: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/37.jpg)
Pubzone (2009)
Java XQuery
1210900
1830
4100
450
3100
Line
s of
cod
eModel ViewControler
![Page 38: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/38.jpg)
AWS Libraries
S3 SimpleDB SNS
455572
1469
23092905
8589
Line
s of
cod
eJava XQuery
![Page 39: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/39.jpg)
AWS Libraries
AWS
2496
13803
Line
s of
cod
eJava XQuery
Lines of Codes- 80%
![Page 40: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/40.jpg)
<html> <head> <script type='text/javascript'> function buy(e) { newElement = document.createElement("p"); elementText = document.createTextNode (e.target.getAttribute(id)); newElement.appendChild(elementText); var res = document.evaluate( "//div[@id='shoppingcart']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); res.snapshotItem(0).appendChild("newElement");} </script> </head> <body> <div>Shopping cart</div> <div id="shoppingcart"></div> <% // Code establishing connection ResultSet results = statement.executeQuery ("SELECT * FROM PRODUCTS"); while (results.next()) { out.println("<div>"); String prodName = results.getString(1); out.println(prodName); out.println("<input type='button' value='Buy'"); out.println("id='"+prodName+"'"); out.println("onclick='buy(event)'/>"). out.println("</div>"); } results.close(); // Code closing connection %> </body></html>
HTMLJavaScript
XPath
Java
SQL
![Page 41: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/41.jpg)
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <script type='application/xquery'>declare updating function local:buy($evt, $obj) { insert node <p>{$obj/@id}</p> as first into //div[@id="shoppingcart"]};b:addEventListener(b:dom()//input, "onclick", xs:Qname("local:buy"));</script> </head> <body> <div>Shopping cart</div> <div id="shoppingcart">{ for $p in doc("products.xml")//*:product return <div> {$p/*:name} <input type='button' value='Buy' id='{$p/*:name}'/> </div> }</div> </body></html>
XQuery Everywhere
![Page 42: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/42.jpg)
http://www.youtube.com/watch?v=ql2TLTsilo8
![Page 43: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/43.jpg)
XQuery in the Browser
• Open Source Project from ETH
• http://xqib.org
• XQuery in the browser without a plug-in
• Processor compiled to JavaScript
• DOM as the processor store
![Page 44: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/44.jpg)
! <script type="application/xquery">! declare updating function local:onclick( $loc, $evtObj ) {! insert node <hr color="red"/>! as last into b:dom()//body! };
b:addEventListener( b:dom()//input, "onclick", local:onclick#2 )! </script>
![Page 45: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/45.jpg)
<script type="text/javascript">foo = function (arg){ return 'the text was '+ arg;};</script>
<script type="application/xquery">! let $x := b:js-call('window.foo', “Foo”)! return b:alert($x)</script>
![Page 46: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/46.jpg)
Demo
![Page 47: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/47.jpg)
Wrap-Up Clip
http://www.youtube.com/watch?v=6oY5ctVHEck
![Page 48: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/48.jpg)
![Page 49: Cutting Edge Data Processing with PHP & XQuery](https://reader033.vdocuments.mx/reader033/viewer/2022042813/54b882294a7959730e8b4871/html5/thumbnails/49.jpg)
Thank you!28 msec