/**
  * Return the LIMIT clause ready for inserting into a query.
  *
  * @param SQLSelect $query The expression object to build from
  * @param array $parameters Out parameter for the resulting query parameters
  * @return string The finalised limit SQL fragment
  */
 public function buildLimitFragment(SQLSelect $query, array &$parameters)
 {
     $nl = $this->getSeparator();
     // Ensure limit is given
     $limit = $query->getLimit();
     if (empty($limit)) {
         return '';
     }
     // For literal values return this as the limit SQL
     if (!is_array($limit)) {
         return "{$nl}LIMIT {$limit}";
     }
     // Assert that the array version provides the 'limit' key
     if (!array_key_exists('limit', $limit) || $limit['limit'] !== null && !is_numeric($limit['limit'])) {
         throw new InvalidArgumentException('SQLite3QueryBuilder::buildLimitSQL(): Wrong format for $limit: ' . var_export($limit, true));
     }
     $clause = "{$nl}";
     if ($limit['limit'] !== null) {
         $clause .= "LIMIT {$limit['limit']} ";
     } else {
         $clause .= "LIMIT -1 ";
     }
     if (isset($limit['start']) && is_numeric($limit['start']) && $limit['start'] !== 0) {
         $clause .= "OFFSET {$limit['start']}";
     }
     return $clause;
 }
 /**
  * Test passing in a LIMIT with OFFSET clause string.
  */
 public function testLimitSetFromClauseString()
 {
     $query = new SQLSelect();
     $query->setSelect('*');
     $query->setFrom('"SQLSelectTest_DO"');
     $query->setLimit('20 OFFSET 10');
     $limit = $query->getLimit();
     $this->assertEquals(20, $limit['limit']);
     $this->assertEquals(10, $limit['start']);
 }
 /**
  * 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 SQLSelect $query
  */
 public function setPaginationFromQuery(SQLSelect $query)
 {
     if ($limit = $query->getLimit()) {
         $this->setPageLength($limit['limit']);
         $this->setPageStart($limit['start']);
         $this->setTotalItems($query->unlimitedRowCount());
     }
     return $this;
 }
 /**
  * Extracts the limit and offset from the limit clause
  * 
  * @param SQLSelect $query
  * @return array Two item array with $limit and $offset as values
  * @throws InvalidArgumentException
  */
 protected function parseLimit(SQLSelect $query)
 {
     $limit = '';
     $offset = '0';
     if (is_array($query->getLimit())) {
         $limitArr = $query->getLimit();
         if (isset($limitArr['limit'])) {
             $limit = $limitArr['limit'];
         }
         if (isset($limitArr['start'])) {
             $offset = $limitArr['start'];
         }
     } else {
         if (preg_match('/^([0-9]+) offset ([0-9]+)$/i', trim($query->getLimit()), $matches)) {
             $limit = $matches[1];
             $offset = $matches[2];
         } else {
             //could be a comma delimited string
             $bits = explode(',', $query->getLimit());
             if (sizeof($bits) > 1) {
                 list($offset, $limit) = $bits;
             } else {
                 $limit = $bits[0];
             }
         }
     }
     return array($limit, $offset);
 }