private function makeQueryResultForInstance(FederateResultSet $federateResultSet, Query $query) { $resultDataItems = array(); foreach ($federateResultSet as $resultRow) { if (count($resultRow) > 0) { $dataItem = Exporter::findDataItemForExpElement($resultRow[0]); if (!is_null($dataItem)) { $resultDataItems[] = $dataItem; } } } if ($federateResultSet->numRows() > $query->getLimit()) { array_pop($resultDataItems); $hasFurtherResults = true; } else { $hasFurtherResults = false; } $result = new QueryResult($query->getDescription()->getPrintrequests(), $query, $resultDataItems, $this->store, $hasFurtherResults); switch ($federateResultSet->getErrorCode()) { case FederateResultSet::ERROR_NOERROR: break; case FederateResultSet::ERROR_INCOMPLETE: $result->addErrors(array(wfMessage('smw_db_sparqlqueryincomplete')->inContentLanguage()->text())); break; default: $result->addErrors(array(wfMessage('smw_db_sparqlqueryproblem')->inContentLanguage()->text())); break; } return $result; }
public function testSetGetLimitForUpperboundWhereLimitIsUnrestricted() { $description = $this->getMockForAbstractClass('\\SMW\\Query\\Language\\Description'); $instance = new Query($description, Query::INLINE_QUERY); $upperboundLimit = 999999999; $this->assertLessThan($upperboundLimit, $this->smwgQMaxLimit); $this->assertLessThan($upperboundLimit, $this->smwgQMaxInlineLimit); $instance->setUnboundLimit($upperboundLimit); $this->assertEquals($upperboundLimit, $instance->getLimit()); }
/** * @since 2.5 * * @param Query $query * * @return string */ public static function get(Query $query) { $serialized = array(); $serialized['conditions'] = $query->getQueryString(); $serialized['parameters'] = array('limit=' . $query->getLimit(), 'offset=' . $query->getOffset(), 'mainlabel=' . $query->getMainlabel()); if ($query->getQuerySource() !== null && $query->getQuerySource() !== '') { $serialized['parameters'] = array_merge($serialized['parameters'], array('source=' . $query->getQuerySource())); } list($serialized['sort'], $serialized['order']) = self::doSerializeSortKeys($query); $serialized['printouts'] = self::doSerializePrintouts($query); $encoded = $serialized['conditions'] . '|' . ($serialized['printouts'] !== array() ? implode('|', $serialized['printouts']) . '|' : '') . implode('|', $serialized['parameters']) . ($serialized['sort'] !== array() ? '|sort=' . implode(',', $serialized['sort']) : '') . ($serialized['order'] !== array() ? '|order=' . implode(',', $serialized['order']) : ''); return $encoded; }
/** * Create an SMWInfolink object representing a link to further query results. * This link can then be serialised or extended by further params first. * The optional $caption can be used to set the caption of the link (though this * can also be changed afterwards with SMWInfolink::setCaption()). If empty, the * message 'smw_iq_moreresults' is used as a caption. * * @deprecated since SMW 1.8 * * @param string|false $caption * * @return SMWInfolink */ public function getQueryLink($caption = false) { $link = $this->getLink(); if ($caption === false) { // The space is right here, not in the QPs! $caption = ' ' . wfMessage('smw_iq_moreresults')->inContentLanguage()->text(); } $link->setCaption($caption); $params = array(trim($this->mQuery->getQueryString())); foreach ($this->mQuery->getExtraPrintouts() as $printout) { $serialization = $printout->getSerialisation(); // TODO: this is a hack to get rid of the mainlabel param in case it was automatically added // by SMWQueryProcessor::addThisPrintout. Should be done nicer when this link creation gets redone. if ($serialization !== '?#') { $params[] = $serialization; } } if ($this->mQuery->getMainLabel() !== false) { $params['mainlabel'] = $this->mQuery->getMainLabel(); } $params['offset'] = $this->mQuery->getOffset() + count($this->mResults); if ($params['offset'] === 0) { unset($params['offset']); } if ($this->mQuery->getLimit() > 0) { $params['limit'] = $this->mQuery->getLimit(); } if (count($this->mQuery->sortkeys) > 0) { $order = implode(',', $this->mQuery->sortkeys); $sort = implode(',', array_keys($this->mQuery->sortkeys)); if ($sort !== '' || $order != 'ASC') { $params['order'] = $order; $params['sort'] = $sort; } } foreach ($params as $key => $param) { $link->setParameter($param, is_string($key) ? $key : false); } return $link; }
/** * Create an SMWInfolink object representing a link to further query results. * This link can then be serialised or extended by further params first. * The optional $caption can be used to set the caption of the link (though this * can also be changed afterwards with SMWInfolink::setCaption()). If empty, the * message 'smw_iq_moreresults' is used as a caption. * * TODO: have this work for all params without manually overriding and adding everything * (this is possible since the param handling changes in 1.7) * * @param string|false $caption * * @return SMWInfolink */ public function getQueryLink($caption = false) { $params = array(trim($this->mQuery->getQueryString())); foreach ($this->mQuery->getExtraPrintouts() as $printout) { $serialization = $printout->getSerialisation(); // TODO: this is a hack to get rid of the mainlabel param in case it was automatically added // by SMWQueryProcessor::addThisPrintout. Should be done nicer when this link creation gets redone. if ($serialization !== '?#') { $params[] = $serialization; } } if ($this->mQuery->getMainLabel() !== false) { $params['mainlabel'] = $this->mQuery->getMainLabel(); } $params['offset'] = $this->mQuery->getOffset() + count($this->mResults); if ($params['offset'] === 0) { unset($params['offset']); } if ($this->mQuery->getLimit() > 0) { $params['limit'] = $this->mQuery->getLimit(); } if (count($this->mQuery->sortkeys) > 0) { $order = implode(',', $this->mQuery->sortkeys); $sort = implode(',', array_keys($this->mQuery->sortkeys)); if ($sort !== '' || $order != 'ASC') { $params['order'] = $order; $params['sort'] = $sort; } } if ($caption == false) { $caption = ' ' . wfMsgForContent('smw_iq_moreresults'); // The space is right here, not in the QPs! } // Note: the initial : prevents SMW from reparsing :: in the query string. $result = SMWInfolink::newInternalLink($caption, ':Special:Ask', false, $params); return $result; }
/** * Get a SPARQL option array for the given query. * * @param SMWQuery $query * @param SMWSparqlCondition $sparqlCondition (storing order by variable names) * @return array */ protected function getSparqlOptions(SMWQuery $query, SMWSparqlCondition $sparqlCondition) { global $smwgQSortingSupport, $smwgQRandSortingSupport; $result = array('LIMIT' => $query->getLimit() + 1, 'OFFSET' => $query->getOffset()); // Build ORDER BY options using discovered sorting fields. if ($smwgQSortingSupport) { $orderByString = ''; foreach ($this->m_sortkeys as $propkey => $order) { if ($order != 'RANDOM' && array_key_exists($propkey, $sparqlCondition->orderVariables)) { $orderByString .= "{$order}(?" . $sparqlCondition->orderVariables[$propkey] . ") "; } elseif ($order == 'RANDOM' && $smwgQRandSortingSupport) { // not supported in SPARQL; might be possible via function calls in some stores } } if ($orderByString !== '') { $result['ORDER BY'] = $orderByString; } } return $result; }
/** * Get a SQL option array for the given query and preprocessed query object at given id. * * @param SMWQuery $query * @param integer $rootid */ protected function getSQLOptions(SMWQuery $query, $rootid) { global $smwgQSortingSupport, $smwgQRandSortingSupport; $result = array('LIMIT' => $query->getLimit() + 1, 'OFFSET' => $query->getOffset()); // Build ORDER BY options using discovered sorting fields. if ($smwgQSortingSupport) { $qobj = $this->m_queries[$rootid]; foreach ($this->m_sortkeys as $propkey => $order) { if ($order != 'RANDOM' && array_key_exists($propkey, $qobj->sortfields)) { // Field was successfully added. $result['ORDER BY'] = (array_key_exists('ORDER BY', $result) ? $result['ORDER BY'] . ', ' : '') . $qobj->sortfields[$propkey] . " {$order} "; } elseif ($order == 'RANDOM' && $smwgQRandSortingSupport) { $result['ORDER BY'] = (array_key_exists('ORDER BY', $result) ? $result['ORDER BY'] . ', ' : '') . ' RAND() '; } } } return $result; }
/** * Get a SQL option array for the given query and preprocessed query object at given id. * * @param Query $query * @param integer $rootId * * @return array */ private function getSQLOptions(Query $query, $rootId) { $result = array('LIMIT' => $query->getLimit() + 5, 'OFFSET' => $query->getOffset()); // Build ORDER BY options using discovered sorting fields. if ($this->engineOptions->get('smwgQSortingSupport')) { $qobj = $this->querySegments[$rootId]; foreach ($this->sortKeys as $propkey => $order) { if (!is_string($propkey)) { throw new RuntimeException("Expected a string value as sortkey"); } // #835 // SELECT DISTINCT and ORDER BY RANDOM causes an issue for postgres // Disable RANDOM support for postgres if ($this->store->getConnection()->getType() === 'postgres') { $this->engineOptions->set('smwgQRandSortingSupport', false); } if ($order != 'RANDOM' && array_key_exists($propkey, $qobj->sortfields)) { // Field was successfully added. $result['ORDER BY'] = (array_key_exists('ORDER BY', $result) ? $result['ORDER BY'] . ', ' : '') . $qobj->sortfields[$propkey] . " {$order} "; } elseif ($order == 'RANDOM' && $this->engineOptions->get('smwgQRandSortingSupport')) { $result['ORDER BY'] = (array_key_exists('ORDER BY', $result) ? $result['ORDER BY'] . ', ' : '') . ' RAND() '; } } } return $result; }
/** * Get a SPARQL option array for the given query. * * @param Query $query * @param Condition $compoundCondition (storing order by variable names) * * @return array */ protected function getOptions(Query $query, Condition $compoundCondition) { $result = array('LIMIT' => $query->getLimit() + 1, 'OFFSET' => $query->getOffset()); // Build ORDER BY options using discovered sorting fields. if ($this->engineOptions->get('smwgQSortingSupport')) { $orderByString = ''; foreach ($query->sortkeys as $propkey => $order) { if (!is_string($propkey)) { throw new RuntimeException("Expected a string value as sortkey"); } if ($order != 'RANDOM' && array_key_exists($propkey, $compoundCondition->orderVariables)) { $orderByString .= "{$order}(?" . $compoundCondition->orderVariables[$propkey] . ") "; } elseif ($order == 'RANDOM' && $this->engineOptions->get('smwgQRandSortingSupport')) { // not supported in SPARQL; might be possible via function calls in some stores } } if ($orderByString !== '') { $result['ORDER BY'] = $orderByString; } } return $result; }
/** * Serializes parameters and extraprintouts of SMWQuery. * These informations are needed to generate a correct SPARQL query. * * @param SMWQuery $query * @return string */ protected function serializeParams($query) { $result = ""; $first = true; foreach ($query->getExtraPrintouts() as $printout) { if (!$first) { $result .= "|"; } if ($printout->getData() == NULL) { $result .= "?=" . $printout->getLabel(); } else { if ($printout->getData() instanceof Title) { $outputFormat = $printout->getOutputFormat() !== NULL ? "#" . $printout->getOutputFormat() : ""; $result .= "?" . $printout->getData()->getDBkey() . $outputFormat . "=" . $printout->getLabel(); } else { if ($printout->getData() instanceof SMWPropertyValue) { $outputFormat = $printout->getOutputFormat() !== NULL ? "#" . $printout->getOutputFormat() : ""; $result .= "?" . array_shift($printout->getData()->getDBkeys()) . $outputFormat . "=" . $printout->getLabel(); } } } $first = false; } if ($query->getLimit() != NULL) { if (!$first) { $result .= "|"; } $result .= "limit=" . $query->getLimit(); $first = false; } if ($query->getOffset() != NULL) { if (!$first) { $result .= "|"; } $result .= "offset=" . $query->getOffset(); $first = false; } if ($query->sort) { if (!$first) { $result .= "|"; } $first = false; $sort = "sort="; $order = "order="; $firstsort = true; foreach ($query->sortkeys as $sortkey => $orderkey) { if (!$firstsort) { $sort .= ","; $order .= ","; } $sort .= $sortkey; $order .= $orderkey; $firstsort = false; } $result .= $sort . "|" . $order; } if ($query->mergeResults === false) { if (!$first) { $result .= "|"; } $result .= 'merge=false'; $first = false; } if (isset($query->params) && isset($query->params['dataspace'])) { if (!$first) { $result .= "|"; } $result .= 'dataspace=' . trim($query->params['dataspace']); $first = false; } return $result; }