690
 

YAHOO Query Language

YQL

В последнее время мне все больше нравятся различные новинки от YAHOO и в частности то, что предназначено для разработчиков веб приложений. Одной из таких полезных новинок является YQL – YAHOO Query Language, такой себе аналог языка SQL. По сути он выполняет ту же задачу, что и SQL, однако источником данных являются не обычные базы данных, а различные ресурсы интернета. Например, можно получить последние новости из разных источников, ссылки из delicious, записи из twitter-а, выполнить поиск по изображениям на Flickr и многое другое. Кроме того с недавнего времени YQL позволяет не только делать выборки данных, но также и выполнять добавление, удаление и обновление (CRUD).

Чтобы вам было более понятно, с чем мы имеем дело, покажу некоторые примеры запросов.

Получение последних записей из твиттера

Этот запрос просто выбирает последние записи пользователя, id которого указывается в условии where (в данном случае аккаунт твиттера мой – http://twitter.com/ischenko ;) ):

select * from twitter.user.timeline where id='ischenko'

Пост в твиттер

В начале запроса мы подключаем таблицу twitter.status.xml, которая позволяет добавлять записи в твиттер – это так называемая Открытая таблица данных (Open Data Table). Кроме того для выполнения запросов CRUD нужно использовать защищенное соединение (https):

use 'http://www.yqlblog.net/samples/twitter.status.xml';
insert into twitter.status (status,username,password) values ("Playing with INSERT UPDATE and DELETE in YQL", "ischenko","****************")

Поиск в Flickr изображений, содержащих в названии "Cat"

select * from flickr.photos.search where text="Cat" limit 10

Выборка пяти последних новостей BBC

Здесь нужные данные выбираются при помощи xpath из веб страницы с указанным url (в данном случае это news.bbc.co.uk). Количество возвращаемых данных ограничиваем при помощи команды LIMIT:

SELECT * FROM html WHERE url='http://news.bbc.co.uk' AND xpath="//*[@id='livestats200']//ul[contains(@class,'popstoryList')]/li/a" LIMIT 5


Теперь о том, где и как эти запросы выполнить и как получать результат. Выполнить запрос можно по следующему адресу: http://query.yahooapis.com/v1/public/yql. В качестве параметров нужно указать следующее: q – запрос, format – тип возвращаемых данных – XML, JSON, JSONP, callback – функция, в которую будут “обернуты” возвращаемые данные (для работы с JavaScript), причем это касается не только JSON, но и XML. Также для некоторых таблиц необходимо указывать параметр env (в том случае, если вы явно не используете директиву USE) – в этом параметре указвыется среда выполнения, например: env=http://datatables.org/alltables.env.

Пример запроса, который выполняет выборку из Delicious последних записей с тегом JavaScript:
http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20delicious.feeds.popular%20where%20tag%3D%27javascript%27&format=xml&env=http%3A%2F%2Fdatatables.org%2Falltables.env.

Также запросы можно выполнять в специальной консоли. В ней очень удобно проверять выполнение запросов, также там содержится множество примеров и большой список доступных таблиц данных.

Теперь остановимся на вопросе использования YQL из JavaScript. Мне кажется, что самый простой вариант это использование JSONP, ибо, как я уже писал выше, YQL запрос поддерживает параметр callback, в который вставляется результат. Реализацию такого подхода я нашел на сайте Джеймса Пэдолси:

// YQL serves JSONP (with a callback) so all we have to do
// is create a script element with the right 'src':
function YQLQuery(query, callback) {
    this.query = query;
    this.callback = callback || function(){};
    this.fetch = function() {

        if (!this.query || !this.callback) {
            throw new Error('YQLQuery.fetch(): Parameters may be undefined');
        }

        var scriptEl = document.createElement('script'),
            uid = 'yql' + +new Date(),
            encodedQuery = encodeURIComponent(this.query.toLowerCase()),
            instance = this;

        YQLQuery[uid] = function(json) {
            instance.callback(json);
            delete YQLQuery[uid];
            document.body.removeChild(scriptEl);
        };

        scriptEl.src = 'http://query.yahooapis.com/v1/public/yql?q='
                     + encodedQuery + '&format=json&callback=YQLQuery.' + uid;
        document.body.appendChild(scriptEl);

    };
}

Используйте его так:

// Составлям запрос
var query = "select * from rss where url='feeds2.feedburner.com/ajaxian' limit 1";

// Создаем обработчик
var callback = function(data) {
    var post = data.query.results.item;
    alert(post.title);
};

// Создаем экземпляр класса
var ajaxianPosts = new YQLQuery(query, callback);

// Выполняем запрос
ajaxianPosts.fetch();

Если вы любите работать с jQuery, то можете воспользоваться следующим простым плагином:

$.YQL = function(query, callback) {

    if (!query || !callback) {
        throw new Error('$.YQL(): Parameters may be undefined');
    }

    var encodedQuery = encodeURIComponent(query.toLowerCase()),
        url = 'http://query.yahooapis.com/v1/public/yql?q='
            + encodedQuery + '&format=json&callback=?';

    $.getJSON(url, callback);
};

// Использование
$.YQL("select * from rss where url='feeds2.feedburner.com/ajaxian' limit 1", function(data) {
    var post = data.query.results.item;
    alert(post.title);
});

Ну и как обычно, напоследок демо пример, в котором я использую показанный выше плагин для получения и обработки RSS потока сайта Ajaxian. Надеюсь вам понравится такой способ работы с данными :)

Добавить в закладки:
Maklay.com - Большой каталог товаров для спорта и активного отдыха

Комментарии на “YAHOO Query Language”

  1. Оригинально!
    Спасибо за новость.
    Для новостей, это то что надо!

Оставить комментарий

JSToolbox создан на основе WordPress