/** * 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); }