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']); }