/** * @since 2.2 * * @param Description $description * * @return QuerySegment */ public function interpretDescription(Description $description) { $query = new QuerySegment(); $conceptId = $this->queryBuilder->getStore()->getObjectIds()->getSMWPageID($description->getConcept()->getDBkey(), SMW_NS_CONCEPT, '', ''); $hash = 'concept-' . $conceptId; $this->queryBuilder->getCircularReferenceGuard()->mark($hash); if ($this->queryBuilder->getCircularReferenceGuard()->isCircularByRecursionFor($hash)) { $this->queryBuilder->addError(wfMessage('smw-query-condition-circular', $description->getQueryString())->text()); return $query; } $row = $this->getConceptForId($conceptId); // No description found, concept does not exist. if ($row === false) { $this->queryBuilder->getCircularReferenceGuard()->unmark('concept-' . $conceptId); // keep the above query object, it yields an empty result // TODO: announce an error here? (maybe not, since the query processor can check for // non-existing concept pages which is probably the main reason for finding nothing here) return $query; } global $smwgQConceptCaching, $smwgQMaxSize, $smwgQMaxDepth, $smwgQFeatures, $smwgQConceptCacheLifetime; $may_be_computed = $smwgQConceptCaching == CONCEPT_CACHE_NONE || $smwgQConceptCaching == CONCEPT_CACHE_HARD && ~(~($row->concept_features + 0) | $smwgQFeatures) == 0 && $smwgQMaxSize >= $row->concept_size && $smwgQMaxDepth >= $row->concept_depth; if ($row->cache_date && ($row->cache_date > strtotime("now") - $smwgQConceptCacheLifetime * 60 || !$may_be_computed)) { // Cached concept, use cache unless it is dead and can be revived. $query->joinTable = SMWSQLStore3::CONCEPT_CACHE_TABLE; $query->joinfield = "{$query->alias}.s_id"; $query->where = "{$query->alias}.o_id=" . $this->queryBuilder->getStore()->getConnection('mw.db')->addQuotes($conceptId); } elseif ($row->concept_txt) { // Parse description and process it recursively. if ($may_be_computed) { $qid = $this->queryBuilder->buildQuerySegmentFor($this->getConceptQueryDescription($row->concept_txt)); if ($qid != -1) { $query = $this->queryBuilder->findQuerySegment($qid); } else { // somehow the concept query is no longer valid; maybe some syntax changed (upgrade) or global settings were modified since storing it $this->queryBuilder->addError(wfMessage('smw_emptysubquery')->text()); // not the right message, but this case is very rare; let us not make detailed messages for this } } else { $this->queryBuilder->addError(wfMessage('smw_concept_cache_miss', $description->getConcept()->getTitle()->getText())->text()); } } // else: no cache, no description (this may happen); treat like empty concept $this->queryBuilder->getCircularReferenceGuard()->unmark($hash); return $query; }