YQL两个请求分页/限制

时间:2012-11-29 14:49:31

标签: yql

我正在使用XML API,搜索不支持分页/限制。推荐的方法是只请求所有ID,然后在第二个请求中获取数据并自己处理分页。

第一次请求:

http://example.com?search=foobar&columns=ID

<results>
  <item><id>1</id></item>
  <item><id>2</id></item>
  <item><id>3</id></item>
  <item><id>4</id></item>
  <item><id>5</id></item>
  <item><id>6</id></item>
  <item><id>7</id></item>
  <item><id>8</id></item>
  <item><id>9</id></item>
  <item><id>10</id></item>
</results>

第二次请求:

http://example.com?search=1,2,3,4,5&columns=ID,title,description

<results>
  <item><id>1</id><title>foobar</title><description /></item>
  <item><id>2</id><title>foobar</title><description /></item>
  <item><id>3</id><title>foobar</title><description /></item>
  <item><id>4</id><title>foobar</title><description /></item>
  <item><id>5</id><title>foobar</title><description /></item>
</results>

是否可以将YQL与搜索结果计数和分页支持的单个请求结合使用?

2 个答案:

答案 0 :(得分:0)

我没有直接的文档,但你可以这样做:

1)创建一个查询http://example.com?search=foobar&columns=ID的YQL表A. 2)创建一个查询http://example.com?search=1,2,3,4,5&columns=ID,title,description的YQL表B. 3)现在,创建一个YQL表C,它在A和B的连接上执行y.query,如下所示:

  

从B中选择*进行搜索(从A中选择ID,其中search =“foobar”)

当然,查询语法将根据其中定义的表名和键进行更改。有关YQL join的更多信息,请参阅here

希望这很清楚,如果你在这种情况下找到更好的东西,请告诉我:)

答案 1 :(得分:0)

使用分页创建一个YQL表:

<paging model="offset" matrix="true">  
    <start id="internalIndex" default="0" />  
    <pagesize id="internalPerPage" max="250" />
</paging>

使用Javascript处理两次提取和分页:

var internalIndex = parseInt( request.matrixParams['internalIndex'] );
var internalPerPage = parseInt( request.matrixParams['internalPerPage'] );

var interimURL = 'http://example.com?columns=ID';
interimURL += '&search=' + request.queryParams['search'];
var interimQueryParameter = {url:interimURL};
var interimQuery = y.query("SELECT * FROM xml WHERE url=@url", interimQueryParameter);

var rows = interimQuery.results.*;

// get subset
var xml    = rows;//this.copy(); // clone XML
var from = internalIndex;
var to = ((from + internalPerPage) < xml.length()) ? (from + internalPerPage) : xml.length();
var sliced = [];
for (; from < to; from++) {
    sliced.push(xml[from].@["ID"]);
}

var finalURL = 'http://example.com?';
finalURL += '&search=' + sliced.join(",");
finalURL += "&columns=ID,title,description"
var finalQueryParameter = {url:finalURL};
var finalQuery = y.query("SELECT * FROM xml WHERE url=@url", finalQueryParameter);

var finalResults = finalQuery.results.response;
finalResults.node += <internalCurserPositon>{internalIndex}</internalCurserPositon>
finalResults.node += <internalCount>{rows.length()}</internalCount>

response.object = finalResults;