/**
  * @since 2.2
  *
  * @return ConceptCache
  */
 public function newMasterConceptCache()
 {
     $conceptQueryResolver = new ConceptQueryResolver($this->newMasterQueryEngine());
     $conceptQueryResolver->setConceptFeatures($GLOBALS['smwgQConceptFeatures']);
     $conceptCache = new ConceptCache($this->store, $conceptQueryResolver);
     $conceptCache->setUpperLimit($GLOBALS['smwgQMaxLimit']);
     return $conceptCache;
 }
 public function testPrepareQuerySegmentForNull()
 {
     $querySegmentListBuilder = $this->getMockBuilder('\\SMW\\SQLStore\\QueryEngine\\QuerySegmentListBuilder')->disableOriginalConstructor()->getMock();
     $querySegmentListProcessor = $this->getMockBuilder('\\SMW\\SQLStore\\QueryEngine\\QuerySegmentListProcessor')->disableOriginalConstructor()->getMock();
     $queryEngine = $this->getMockBuilder('\\SMW\\SQLStore\\QueryEngine\\QueryEngine')->disableOriginalConstructor()->getMock();
     $queryEngine->expects($this->any())->method('getQuerySegmentListBuilder')->will($this->returnValue($querySegmentListBuilder));
     $queryEngine->expects($this->any())->method('getQuerySegmentListProcessor')->will($this->returnValue($querySegmentListProcessor));
     $instance = new ConceptQueryResolver($queryEngine);
     $this->assertNull($instance->prepareQuerySegmentFor('[[Foo]]'));
 }
 /**
  * @param Title $concept
  *
  * @return string[] array with error messages
  */
 public function refresh(Title $concept)
 {
     global $wgDBtype;
     $db = $this->store->getConnection();
     $cid = $this->store->smwIds->getSMWPageID($concept->getDBkey(), SMW_NS_CONCEPT, '', '');
     $cid_c = $this->getIdOfConcept($concept);
     if ($cid !== $cid_c) {
         return array("Skipping redirect concept.");
     }
     $conceptQueryText = $this->getConceptCacheText($concept);
     if ($conceptQueryText === false) {
         $this->deleteConceptById($cid);
         return array("No concept description found.");
     }
     // Pre-process query:
     $querySegment = $this->conceptQueryResolver->prepareQuerySegmentFor($conceptQueryText);
     if ($querySegment === null || $querySegment->joinfield === '' || $querySegment->joinTable === '') {
         return array();
     }
     // TODO: catch db exception
     $db->delete(SMWSQLStore3::CONCEPT_CACHE_TABLE, array('o_id' => $cid), __METHOD__);
     $concCacheTableName = $db->tablename(SMWSQLStore3::CONCEPT_CACHE_TABLE);
     if ($wgDBtype == 'postgres') {
         // PostgresQL: no INSERT IGNORE, check for duplicates explicitly
         $where = $querySegment->where . ($querySegment->where ? ' AND ' : '') . "NOT EXISTS (SELECT NULL FROM {$concCacheTableName}" . " WHERE {$concCacheTableName}.s_id = {$querySegment->alias}.s_id " . " AND  {$concCacheTableName}.o_id = {$querySegment->alias}.o_id )";
     } else {
         // MySQL just uses INSERT IGNORE, no extra conditions
         $where = $querySegment->where;
     }
     // TODO: catch db exception
     $db->query("INSERT " . ($wgDBtype == 'postgres' ? '' : 'IGNORE ') . "INTO {$concCacheTableName}" . " SELECT DISTINCT {$querySegment->joinfield} AS s_id, {$cid} AS o_id FROM " . $db->tableName($querySegment->joinTable) . " AS {$querySegment->alias}" . $querySegment->from . ($where ? ' WHERE ' : '') . $where . " LIMIT " . $this->upperLimit, __METHOD__);
     $db->update('smw_fpt_conc', array('cache_date' => strtotime("now"), 'cache_count' => $db->affectedRows()), array('s_id' => $cid), __METHOD__);
     return array();
 }
 /**
  * @param Title $concept
  *
  * @return string[] array with error messages
  */
 public function refresh(Title $concept)
 {
     global $wgDBtype;
     $db = $this->store->getConnection();
     $cid = $this->store->smwIds->getSMWPageID($concept->getDBkey(), SMW_NS_CONCEPT, '', '');
     $cid_c = $this->getIdOfConcept($concept);
     if ($cid !== $cid_c) {
         return array("Skipping redirect concept.");
     }
     $conceptQueryText = $this->getConceptCacheText($concept);
     if ($conceptQueryText === false) {
         $this->deleteConceptById($cid);
         return array("No concept description found.");
     }
     // Pre-process query:
     $querySegment = $this->conceptQueryResolver->prepareQuerySegmentFor($conceptQueryText);
     if ($querySegment === null || $querySegment->joinfield === '' || $querySegment->joinTable === '') {
         return array();
     }
     // TODO: catch db exception
     $db->delete(SMWSQLStore3::CONCEPT_CACHE_TABLE, array('o_id' => $cid), __METHOD__);
     $concCacheTableName = $db->tablename(SMWSQLStore3::CONCEPT_CACHE_TABLE);
     // MySQL just uses INSERT IGNORE, no extra conditions
     $where = $querySegment->where;
     if ($wgDBtype == 'postgres') {
         // PostgresQL: no INSERT IGNORE, check for duplicates explicitly
         // This code doesn't work and has created all sorts of issues therefore use LEFT JOIN instead
         // http://people.planetpostgresql.org/dfetter/index.php?/archives/48-Adding-Only-New-Rows-INSERT-IGNORE,-Done-Right.html
         //	$where = $querySegment->where . ( $querySegment->where ? ' AND ' : '' ) .
         //		"NOT EXISTS (SELECT NULL FROM $concCacheTableName" .
         //		" WHERE {$concCacheTableName}.s_id = {$querySegment->alias}.s_id " .
         //		" AND  {$concCacheTableName}.o_id = {$querySegment->alias}.o_id )";
         $querySegment->from = str_replace('INNER JOIN', 'LEFT JOIN', $querySegment->from);
     }
     $db->query("INSERT " . ($wgDBtype == 'postgres' ? '' : 'IGNORE ') . "INTO {$concCacheTableName}" . " SELECT DISTINCT {$querySegment->joinfield} AS s_id, {$cid} AS o_id FROM " . $db->tableName($querySegment->joinTable) . " AS {$querySegment->alias}" . $querySegment->from . ($where ? ' WHERE ' : '') . $where . " LIMIT " . $this->upperLimit, __METHOD__);
     $db->update('smw_fpt_conc', array('cache_date' => strtotime("now"), 'cache_count' => $db->affectedRows()), array('s_id' => $cid), __METHOD__);
     return array();
 }