2016-03-27 44 views
0

BigQueryを使用して簡単なページネーションメカニズムを実装しようとしています。それが働いているようBigQuery +トークンによるページ分割+ PHPクライアントが動作しない

function query($sql, $max_results = null, $page_token = null) { 
    $request = new Google_Service_Bigquery_QueryRequest(); 
    $request->setQuery($sql); 
    $response = $this->service->jobs->query(PROJECT_ID, $request); 
    $job_id = $response->getJobReference()->getJobId(); 

    $optParams = ($max_results) ? array(
     'pageToken' => $page_token, 
     'maxResults' => $max_results, 
    ) : array(); 
    $response = $this->service->jobs->getQueryResults(PROJECT_ID, $job_id, $optParams); 
    if (!$response->getJobComplete()) { 
     return null; 
    } 
    $rowsJson = $this->rowsJson($response->getRows()); 
    if ($max_results) { 
     return array(
      "rows" => $rowsJson, 
      "token" => $response->getPageToken() 
     ); 
    } 
    return $rowsJson; 
} 

query("select url, CEIL(AVG(total)) as avg, count(id) as count from $table_id " . 
     "where created > $date_start and created < $date_end group by url order by $order_by desc", 
     10, $page_token 
); 

最初のクエリは思わ:

は、これが私のクエリ機能です。 10の結果とトークンしか返しません(10以上の結果があります)。しかし、私が得たトークンで後で関数を呼び出すと、結果は空になります...なぜ私にはわかりません。私はあなたがstartIndex代わりのトークンを使用して、それを解決し、この

答えて

1

  1. は、クエリジョブ
  2. は、そのジョブIDとgetQueryResultsを実行するジョブID
  3. を取得し実行し、結果とpage_tokenを取得する
  4. もしあなたが完了した場合は、次のステップに進みます。
  5. getQueryResults(still with jobid from #2)を実行し、resu全く条件が(#5で強調表示壊れた - LTと今#4

をステップ

  • ジャンプをpage_token、あなたが最も可能性の高いあなたのコードがこれを従わないと、毎回、新しいジョブとしてクエリを実行していることがわかりますstill with jobid from #2)。

    それが結果を返す最初の時間は最初の呼び出しは、実際に上記のステップを満たしていますが、consequitive呼び出しにあなたが実際にも
    とpage_token(将来その新しいジョブから)、いくつかの任意で新しいジョブのpage_tokenと力、実行を渡すことである理由あなたの現在のコードは、startIndexの

    で動作する理由、これは説明して上記の手順を従ってあなたのコードを書き換えるようにしてください、それは、また、
    PSを

    を動作するはずですpage_tokenは生きていて、あなたの結果を保持する基になる一時テーブルが生きている限り(約24時間です)

  • +0

    ありがとう! –

    -2
    function get_quote($page = 1){ 
    global $database_connection; 
        $start = 0; 
        $limit = 5; 
        $start = ($page - 1) * $limit; 
    
        //select from database with limit $start, $limit 
        //display results 
    
        $sql_get_quote = "SELECT * FROM quote_table ORDER BY date_added ASC LIMIT $start, $limit"; 
        $query_get_quote = mysqli_query($database_connection, $sql_get_quote); 
        while($fetch_quote = mysqli_fetch_array($query_get_quote)){ 
         echo "<br> 
         <div class='w3-container w3-pale-green w3-bottombar w3-border-green w3-border'> 
         <p>".$fetch_quote['quote']."</p><hr><p class='w3-left-align'>".$fetch_quote['quote_by']."</p> 
         </div>"; 
        } 
    
        //do another query, get the num_rows 
        $quote_rows= mysqli_num_rows (mysqli_query($database_connection ,"SELECT * FROM quote_table")); 
        $total = ceil($quote_rows/$limit); 
    if (isset($page)){ 
        echo "<div class='w3-container'>"; 
        echo "<ul class='pager'>"; 
        if($page > 1) { 
         echo "<a href='?page=".($page - 1)."' style='float: left;' class=' w3-sand w3-btn w3-margin w3-round'>Previous</a>"; 
        } 
        for($i = 1; $i <= $total; $i++) { 
         if($i == $page) { echo "<li class='active current'>".$i."</li>"; } 
    
         else { echo "<li><a href='?page=".$i."'>".$i."</a></li>"; } 
        } 
        if($page != $total) { 
         echo "<a href='?page=".($page + 1)."' class='w3-btn w3-margin w3-sand w3-round'>Next</a>"; 
        } 
        echo "</ul></div>"; 
    } 
    

    }

    ...ログか何かでエラーメッセージを見ません。

    トークンが短命で、4〜5秒の遅延で生き残っていない可能性があります。私は本当にわかりません。あなたが手順(簡略化されますが、この答えのための十分な)の下に従わSHOLD仕事をするBigQueryの「改ページ」ためには

    +0

    私の質問はgoogle BigQueryについてです。あなたのコードはMySQL用です –

    0

    周りを構築することを願って...これは私の作品

    +0

    page_tokenは生きていて、潜在的な一時テーブル(あなたの結果を保持する)が生きている限り、再利用可能である必要があります - 約24時間です –

    0

    ページトークンを使用することをお勧めします。テーブルが最初に検索されます。 startIndexを使用するだけで、テーブルが変更される可能性があるため、異なる結果が表示されることがあります。

    応答の大きさは、あなたがmaxResults未満得る可能性がありものです。私たちはあるサイズの結果を返すようにApiaryによって制限されています。 https://cloud.google.com/bigquery/docs/data#paging また、最大フィールド数がコールごとに350,000未満に制限されています。

    戻ってきたページトークンを使用して次の結果を取得するようにしてください。

    関連する問題