0

検索でページング/制限がサポートされていない XML API をいじっています。推奨される方法は、すべての ID を要求してから、2 番目の要求でデータを取得し、自分でページングを処理することです。

最初のリクエスト:

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 を使用して、検索結果のカウントとページングのサポートを使用して、これを単一のリクエストに結合することは可能ですか?

4

2 に答える 2

0

ページングを使用してYQLテーブルを作成します。

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

Javascriptを使用して、2つのフェッチとページングを処理します。

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;
于 2012-12-05T20:53:41.820 に答える
0

ドキュメントからの直接的な方法はありませんが、これを行うことができます:

1) http://example.com?search=foobar&columns=ID をクエリする YQL テーブル A を作成します 2) http://example.com?search=1,2,3,4,5&columns をクエリする YQL テーブル B を作成します=ID,title,description 3) 次に、A と B の結合で y.query を実行する YQL テーブル C を次のように作成します。

select * from B where search in (select ids from A where search="foobar")

もちろん、クエリ構文は、テーブル名とそれに定義されているキーに基づいて変更されます。YQL 結合の詳細については、こちらを参照してください

これが明確であることを願っています。この場合により良いものを見つけた場合は、お知らせください:)

于 2012-11-29T18:27:33.997 に答える