cutting edge data processing with php & xquery

49
Cutting Edge Data Processing with PHP & XQuery William Candillon { [email protected] } PHP Tour Lille 2011 28 msec

Upload: william-candillon

Post on 16-Jan-2015

11.763 views

Category:

Technology


4 download

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

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

A Rich Ecosystem

Platforms Frameworks Libraries

Code

Data

? ? ?Relational XML JSON Text

PDOPHP Data Objects

Page 3: Cutting Edge Data Processing with PHP & XQuery

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

Our Goal

Contribute the features from relational APIs to unstructured data

Page 5: Cutting Edge Data Processing with PHP & XQuery

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

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

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

Zorba

Page 9: Cutting Edge Data Processing with PHP & XQuery

<?phprequire_once ‘ZorbaXQueryProcessor.php’;

$xquery = new XQueryProcessor();

$xquery->importQuery(‘1+1’);

echo $xquery->execute();?>

Page 10: Cutting Edge Data Processing with PHP & XQuery

<?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

<?phprequire_once ‘ZorbaXQueryProcessor.php’;

$xquery = new XQueryProcessor();

$xquery->importQueryFromURI(‘hello.xq’);

echo $xquery->execute();?>

Page 12: Cutting Edge Data Processing with PHP & XQuery

<?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

$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

Queries

Updates

Full-Text

Streaming

Page 15: Cutting Edge Data Processing with PHP & XQuery

Queries

Updates

Full-Text

Streaming

Page 16: Cutting Edge Data Processing with PHP & XQuery

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

<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

<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

Queries

Updates

Full-Text

Streaming

Page 20: Cutting Edge Data Processing with PHP & XQuery

insert node $bios[@id=”wcandilllon”] into $sessions[@id=”xquery”]

Page 21: Cutting Edge Data Processing with PHP & XQuery

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

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

Queries

Updates

Full-Text

Streaming

Page 24: Cutting Edge Data Processing with PHP & XQuery

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

let $x := <msg>breakfast of champions</msg>return $x contains text "meal"

Page 26: Cutting Edge Data Processing with PHP & XQuery

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

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

Demo

Page 29: Cutting Edge Data Processing with PHP & XQuery

Queries

Updates

Full-Text

Streaming

Page 30: Cutting Edge Data Processing with PHP & XQuery

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

<?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

<?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

<?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

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

Demo

Page 36: Cutting Edge Data Processing with PHP & XQuery

Results

SimpleXML XMLReader XQuery

Streaming X ✔ ✔

Productivity ✔ X ✔

Page 37: Cutting Edge Data Processing with PHP & XQuery

Pubzone (2009)

Java XQuery

1210900

1830

4100

450

3100

Line

s of

cod

eModel ViewControler

Page 38: Cutting Edge Data Processing with PHP & XQuery

AWS Libraries

S3 SimpleDB SNS

455572

1469

23092905

8589

Line

s of

cod

eJava XQuery

Page 39: Cutting Edge Data Processing with PHP & XQuery

AWS Libraries

AWS

2496

13803

Line

s of

cod

eJava XQuery

Lines of Codes- 80%

Page 40: Cutting Edge Data Processing with PHP & XQuery

<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

<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 43: Cutting Edge Data Processing with PHP & XQuery

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

! <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

<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

Demo

Page 47: Cutting Edge Data Processing with PHP & XQuery

Wrap-Up Clip

http://www.youtube.com/watch?v=6oY5ctVHEck

Page 48: Cutting Edge Data Processing with PHP & XQuery
Page 49: Cutting Edge Data Processing with PHP & XQuery

Thank you!28 msec