예제 #1
0
	/**
	 * Use the limit from the given query to add prev/next buttons to this DataObjectSet.
	 * @param SQLQuery $query The query used to generate this DataObjectSet
	 */
	public function parseQueryLimit(SQLQuery $query) {
		if($query->limit) {
			if(stripos($query->limit, 'OFFSET')) {
				list($length, $start) = split(" +OFFSET +", trim($query->limit));
			} else {
				$result = split(" *, *", trim($query->limit));
				$start = $result[0];
				$length = isset($result[1]) ? $result[1] : null;
			}
			
			if(!$length) { 
				$length = $start;
				$start = 0;
			}	
			$this->setPageLimits($start, $length, $query->unlimitedRowCount());
		}
	}
 /**
  * Use the limit from the given query to add prev/next buttons to this DataObjectSet.
  * @param SQLQuery $query The query used to generate this DataObjectSet
  */
 public function parseQueryLimit(SQLQuery $query)
 {
     if ($query->limit) {
         if (is_array($query->limit)) {
             $length = $query->limit['limit'];
             $start = $query->limit['start'];
         } else {
             if (stripos($query->limit, 'OFFSET')) {
                 list($length, $start) = preg_split("/ +OFFSET +/i", trim($query->limit));
             } else {
                 $result = preg_split("/ *, */", trim($query->limit));
                 $start = $result[0];
                 $length = isset($result[1]) ? $result[1] : null;
             }
         }
         if (!$length) {
             $length = $start;
             $start = 0;
         }
         $this->setPageLimits($start, $length, $query->unlimitedRowCount());
     }
 }
 /**
  * Perform a search against the data table.
  *
  * @param array $where Array of strings to add into the WHERE clause
  * @param array $orderby Array of column as key, to direction as value to add into the ORDER BY clause
  * @param string|int $start Record to start at (for paging)
  * @param string|int $pageLength Number of results per page (for paging)
  * @param boolean $paged Paged results or not?
  * @return ArrayList|PaginatedList
  */
 protected function queryList($where = array(), $orderby = array(), $start, $pageLength, $paged = true)
 {
     $dataClass = $this->dataRecord->getDataClass();
     if (!$dataClass) {
         return new PaginatedList(new ArrayList());
     }
     $resultColumns = $this->dataRecord->getDataSingleton()->summaryFields();
     $resultColumns['ID'] = 'ID';
     $results = new ArrayList();
     $query = new SQLQuery();
     $query->setSelect($this->escapeSelect(array_keys($resultColumns)))->setFrom("\"{$dataClass}\"");
     $query->addWhere($where);
     $query->addOrderBy($orderby);
     $query->setConnective('AND');
     if ($paged) {
         $query->setLimit($pageLength, $start);
     }
     foreach ($query->execute() as $record) {
         $result = new $dataClass($record);
         $result->Columns = $this->Columns($result);
         // we attach Columns here so the template can loop through them on each result
         $results->push($result);
     }
     if ($paged) {
         $list = new PaginatedList($results);
         $list->setPageStart($start);
         $list->setPageLength($pageLength);
         $list->setTotalItems($query->unlimitedRowCount());
         $list->setLimitItems(false);
     } else {
         $list = $results;
     }
     return $list;
 }
예제 #4
0
 /**
  * Sets the page length, page start and total items from a query object's
  * limit, offset and unlimited count. The query MUST have a limit clause.
  *
  * @param SQLQuery $query
  */
 public function setPaginationFromQuery(SQLQuery $query)
 {
     if ($limit = $query->getLimit()) {
         $this->setPageLength($limit['limit']);
         $this->setPageStart($limit['start']);
         $this->setTotalItems($query->unlimitedRowCount());
     }
     return $this;
 }
 /**
  * Test {@link DataObjectSet->parseQueryLimit()}
  */
 function testParseQueryLimit()
 {
     // Create empty objects, because they don't need to have contents
     $sql = new SQLQuery('*', '"Member"');
     $max = $sql->unlimitedRowCount();
     $set = new DataObjectSet();
     // Test handling an array
     $set->parseQueryLimit($sql->limit(array('limit' => 5, 'start' => 2)));
     $expected = array('pageStart' => 2, 'pageLength' => 5, 'totalSize' => $max);
     $this->assertEquals($expected, $set->getPageLimits(), 'The page limits match expected values.');
     // Test handling OFFSET string
     // uppercase
     $set->parseQueryLimit($sql->limit('3 OFFSET   1'));
     $expected = array('pageStart' => 1, 'pageLength' => 3, 'totalSize' => $max);
     $this->assertEquals($expected, $set->getPageLimits(), 'The page limits match expected values.');
     // and lowercase
     $set->parseQueryLimit($sql->limit('32   offset   3'));
     $expected = array('pageStart' => 3, 'pageLength' => 32, 'totalSize' => $max);
     $this->assertEquals($expected, $set->getPageLimits(), 'The page limits match expected values.');
     // Finally check MySQL LIMIT syntax
     $set->parseQueryLimit($sql->limit('7, 7'));
     $expected = array('pageStart' => 7, 'pageLength' => 7, 'totalSize' => $max);
     $this->assertEquals($expected, $set->getPageLimits(), 'The page limits match expected values.');
 }