public static function getInstance()
 {
     if (is_null(self::$instance)) {
         self::$instance = new self();
     }
     return self::$instance;
 }
 public function getQueryResult(SMWQuery $query, $force = false, $cacheThis = true)
 {
     //get title of article in which query was executed
     //or set title to false if query was executed somehow else
     global $wgParser;
     $title = false;
     if ($wgParser && $wgParser->getTitle()) {
         $title = $wgParser->getTitle();
     }
     $defaultStore = smwfGetStore();
     // update the semdata object for this title, respectively
     // the query management annotations
     if ($title !== false && $cacheThis) {
         SMWQRCQueryManagementHandler::getInstance()->storeQueryMetadata($title, $query);
     }
     //delegate query processing to the responsible store
     if ($query instanceof SMWSPARQLQuery) {
         $store = $defaultStore;
     } else {
         global $smwgBaseStore;
         $store = new $smwgBaseStore();
     }
     $queryData = $this->getQueryData($query);
     // execute the query if no valid cache entry is available, if force was
     // set to true (e.g. by the update process) or if the query is executed because
     // of an edit or a purge action
     if ($force || !$this->isReadAccess() || !$this->hasValidCacheEntry($queryData)) {
         $queryResult = $store->doGetQueryResult($query);
         if ($cacheThis) {
             //add the serialized query result to the database
             $qrcStore = SMWQRCStore::getInstance()->getDB();
             $queryId = SMWQRCQueryManagementHandler::getInstance()->getQueryId($query);
             $lastUpdate = time();
             $dirty = false;
             if ($queryData) {
                 //results for this query already have been stored in the cache
                 if ($force) {
                     //this query result update was not triggered by a Wiki user action
                     $accessFrequency = SMWQRCPriorityCalculator::getInstance()->computeNewAccessFrequency($queryData['accessFrequency']);
                     $invalidationFrequency = SMWQRCPriorityCalculator::getInstance()->computeNewInvalidationFrequency($queryData['invalidationFrequency']);
                 } else {
                     $accessFrequency = $queryData['accessFrequency'] + 1;
                     $invalidationFrequency = $queryData['invalidationFrequency'] + 1;
                 }
                 $priority = 0;
                 $qrcStore->updateQueryData($queryId, serialize($queryResult), $lastUpdate, $accessFrequency, $invalidationFrequency, $dirty, $priority);
             } else {
                 $priority = 0;
                 $qrcStore->addQueryData($queryId, serialize($queryResult), $lastUpdate, 1, 0, $dirty, $priority);
             }
         }
     } else {
         $qrcStore = SMWQRCStore::getInstance()->getDB();
         $queryResult = unserialize($queryData['queryResult']);
         //update access frequency and query priority
         $priority = 0;
         $qrcStore->updateQueryData($queryData['queryId'], $queryData['queryResult'], $queryData['lastUpdate'], $queryData['accessFrequency'] + 1, $queryData['invalidationFrequency'], $queryData['dirty'], $priority);
         if ($query instanceof SMWQueryResult) {
             $query->addErrors($queryResult->getErrors());
             $queryResult = new SMWQueryResult($query->getDescription()->getPrintRequests(), $query, $queryResult->getResults(), $store, $queryResult->hasFurtherResults());
         }
     }
     return $queryResult;
 }
 public function doNotTestPriorityComputation()
 {
     smwf_om_EditArticle('QRCQueryArticle1', 'PHPUnit', $this->queryArticle1Version2, '');
     $request = json_encode(array('debug' => true));
     $response = smwf_qc_getQueryIds($request);
     $response = json_decode($response);
     $qrcStore = SMWQRCStore::getInstance()->getDB();
     $qId = $response->queryIds[0];
     $queryData = $qrcStore->getQueryData($qId);
     $this->assertEquals($queryData['priority'], SMWQRCPriorityCalculator::getInstance()->computeQueryUpdatePriority($queryData['lastUpdate'], $queryData['accessFrequency'], $queryData['invalidationFrequency']));
     $rememberedPriority = $queryData['priority'];
     $article = Article::newFromID(Title::newFromText('QRCQueryArticle1')->getArticleID());
     $content = $article->getContent();
     global $wgParser;
     $pOpts = new ParserOptions();
     $result = $wgParser->parse($content, Title::newFromText('QRCQueryArticle1'), $pOpts)->getText();
     $queryData = $qrcStore->getQueryData($qId);
     $this->assertEquals($queryData['priority'], SMWQRCPriorityCalculator::getInstance()->computeQueryUpdatePriority($queryData['lastUpdate'], $queryData['accessFrequency'], $queryData['invalidationFrequency']));
     $this->assertNotEquals($rememberedPriority, $queryData['priority']);
     $rememberedPriority = $queryData['priority'];
     global $wgTitle;
     $wgTitle = Title::newFromText('QRCDataArticle1');
     smwf_om_EditArticle('QRCDataArticle1', 'PHPUnit', '', '');
     $queryData = $qrcStore->getQueryData($qId);
     $this->assertEquals($queryData['priority'], SMWQRCPriorityCalculator::getInstance()->computeQueryUpdatePriority($queryData['lastUpdate'], $queryData['accessFrequency'], $queryData['invalidationFrequency']));
     $this->assertNotEquals($rememberedPriority, $queryData['priority']);
     $request = json_encode(array('debug' => true, 'queryId' => $qId));
     $response = smwf_qc_updateQuery($request);
     $response = json_decode($response);
     $queryData = $qrcStore->getQueryData($qId);
     $this->assertEquals($queryData['priority'], SMWQRCPriorityCalculator::getInstance()->computeQueryUpdatePriority($queryData['lastUpdate'], $queryData['accessFrequency'], $queryData['invalidationFrequency']));
     $this->assertNotEquals($rememberedPriority, $queryData['priority']);
 }