This project aims to bring SQL and HTTP world together.
-
Internet is a big database that contains lots of pages
-
Web-server is nothing more than interpretator that accepts http protocol as a language and produces a web page
So by concluding these two facts it occurs that sql language can be used to model web-client collaboration on top of http.
Let's see some examples how SQL could be used(further on this customized SQL is called httpQL):
HTTP | httpQL |
---|---|
GET /index.html HTTP/1.1 | select * from index.html |
PUT /index.html HTTP/1.1 "File contents" |
insert into index.html values("File contents") |
POST /index.html HTTP/1.1 "param1=value1¶m2=value2" |
update index.html set param1 = value1 and param2 = value2 |
DELETE /index.html HTTP/1.1 | delete * from index.html |
Select queries can be used to combine http GET request and xpath together. Let's see examples(GET requests in http column are omitted):
XPATH | httpQL |
---|---|
//book | select book from index.html |
/bookstore | select .bookstore from index.html |
//bookstore/book | select bookstore.book from index.html |
//bookstore//book | select bookstore..book from index.html |
//bookstore/book[1] | select bookstore.book from index.html where limit book by 1 |
//bookstore/book[@position < 3] | select bookstore.book from index.html where book@position < 3 |
//bookstore/book[@position=@last()] | select bookstore.book from index.html where book@position = @last() |
//title[@lang] | select title from index.html where title@lang=* |
//title[@lang='eng'] | select title from index.html where title@lang='eng' |
//bookstore/book[@price > 35] | select bookstore.book from index.html where book@price > 35 |
//bookstore/book[@price > 35]/title | select bookstore.book.title from index.html where book@price > 35 |
//bookstore/book/title | select bookstore.book.title from index.html |
//bookstore/book/price/text() | select bookstore.book.price@text from index.html |
//host/service[text='DNS'] | select host.service from index.html where service@text() = 'DNS' |
//network/host[2]/interface/arec/text() | select network.host.interface.arec@text() from index.html limit host by 2 |
//*[@speciality] | select * from index.html where *@speciality=* |
//degree[@from='Harvard'] | select degree from index.html where degree@from='Harvard' |
//author[text()='Bob Martin'] | select author from index.html where author@text() = 'Bob Martin' |
//author[@firstname='Bob' and @lastname='Martin'] | select author from index.html where author@firstname='Bob' and author@lastname='Martin' |
//*[id='w3c_home_upcoming_events']/ul/li[1]/div[2]/p[1]/a | select *.ul.li.div.p.a from index.html where *@id='w3c_home_upcoming_events' and limit li by 1 and limit div by 2 and limit p by 1 |
//ul[1]//ul[2] | select ul..ul from index.html where limit ul#1 by 1 and limit ul#2 by 2 |
Tables give impression that XPATH is simpler and it really is, httpQL contains some artifacts(such #) and less readible. Seperation of concerns did a great job for HTTP and XPath world.