/** * Return relevant data set * * @param SMWQueryResult $res * @param $outputMode * * @return array */ protected function getResultData(SMWQueryResult $res, $outputMode) { // Init $properties = array(); $excludeProperties = explode($this->params['sep'], $this->params['exclude']); // Options used when retrieving data from the store $reqOptions = new SMWRequestOptions(); $reqOptions->sort = true; $reqOptions->limit = $this->params['limit']; foreach ($res->getResults() as $key => $page) { // Find properties assigned to selected subject page foreach ($res->getStore()->getInProperties($page, $reqOptions) as $property) { $propertyLabel = $property->getLabel(); // Exclude property from result set if (in_array($propertyLabel, $excludeProperties)) { continue; } // NOTE There could be thousands of incoming links for one property, // counting the length of an array is inefficient but we don't want // to implement any native db select outside of smw core and rather // would like to see a counting method available but to counter // any potential inefficiencies we curb the selection by using // SMWRequestOptions -> limit as boundary $count = count($res->getStore()->getPropertySubjects($property, $page, $reqOptions)); // Limit ouput by threshold if ($this->params['min'] <= $count) { $properties[$propertyLabel] = $count; } } } return $properties; }
private function getConceptDescription(DIWikiPage $concept) { $value = $this->queryResult->getStore()->getPropertyValues($concept, new DIProperty('_CONC')); if ($value === null || $value === array()) { return new ThingDescription(); } $value = end($value); return ApplicationFactory::getInstance()->newQueryParser()->getQueryDescription($value->getConceptQuery()); }
/** * Get the serialization for a SMWQueryResult object. * * @since 1.7 * * @param SMWQueryResult $result * * @return array */ public static function getSerializedQueryResult(SMWQueryResult $queryResult) { $results = array(); $printRequests = array(); foreach ($queryResult->getPrintRequests() as $printRequest) { $printRequests[] = array('label' => $printRequest->getLabel(), 'typeid' => $printRequest->getTypeID(), 'mode' => $printRequest->getMode()); } foreach ($queryResult->getResults() as $diWikiPage) { $result = array('printouts' => array()); foreach ($queryResult->getPrintRequests() as $printRequest) { $resultAarray = new SMWResultArray($diWikiPage, $printRequest, $queryResult->getStore()); if ($printRequest->getMode() === SMWPrintRequest::PRINT_THIS) { $dataItems = $resultAarray->getContent(); $result += self::getSerialization(array_shift($dataItems)); } else { $result['printouts'][$printRequest->getLabel()] = array_map(array(__CLASS__, 'getSerialization'), $resultAarray->getContent()); } } $results[$diWikiPage->getTitle()->getFullText()] = $result; } return array('printrequests' => $printRequests, 'results' => $results); }
protected function getResultText(SMWQueryResult $res, $outputmode) { global $wgContLang; // <H3> will generate TOC entries otherwise. Probably need another way // to accomplish this -- user might still want TOC for other page content. $result = '__NOTOC__'; $num = $res->getCount(); $prev_first_char = ""; $rows_per_column = ceil($num / $this->mNumColumns); // column width is a percentage $column_width = floor(100 / $this->mNumColumns); // Print all result rows: $rowindex = 0; $row = $res->getNext(); while ($row !== false) { $nextrow = $res->getNext(); // look ahead $content = $row[0]->getContent(); $cur_first_char = $wgContLang->firstChar($content[0]->getDIType() == SMWDataItem::TYPE_WIKIPAGE ? $res->getStore()->getWikiPageSortKey($content[0]) : $content[0]->getSortKey()); if ($rowindex % $rows_per_column == 0) { $result .= "\n\t\t\t<div style=\"float: left; width: {$column_width}%;\">\n"; if ($cur_first_char == $prev_first_char) { $result .= "\t\t\t\t<h3>{$cur_first_char} " . wfMessage('listingcontinuesabbrev')->text() . "</h3>\n\t\t\t\t<ul>\n"; } } // if we're at a new first letter, end // the last list and start a new one if ($cur_first_char != $prev_first_char) { if ($rowindex % $rows_per_column > 0) { $result .= "\t\t\t\t</ul>\n"; } $result .= "\t\t\t\t<h3>{$cur_first_char}</h3>\n\t\t\t\t<ul>\n"; } $prev_first_char = $cur_first_char; $result .= '<li>'; $first_col = true; if ($this->mTemplate !== '') { // build template code $this->hasTemplates = true; $wikitext = $this->mUserParam ? "|userparam={$this->mUserParam}" : ''; $i = 1; // explicitly number parameters for more robust parsing (values may contain "=") foreach ($row as $field) { $wikitext .= '|' . $i++ . '='; $first_value = true; while (($text = $field->getNextText(SMW_OUTPUT_WIKI, $this->getLinker($first_col))) !== false) { if ($first_value) { $first_value = false; } else { $wikitext .= $this->mDelim . ' '; } $wikitext .= $text; } $first_col = false; } $wikitext .= "|#={$rowindex}"; $result .= '{{' . $this->mTemplate . $wikitext . '}}'; // str_replace('|', '|', // encode '|' for use in templates (templates fail otherwise) -- this is not the place for doing this, since even DV-Wikitexts contain proper "|"! } else { // build simple list $first_col = true; $found_values = false; // has anything but the first column been printed? foreach ($row as $field) { $first_value = true; while (($text = $field->getNextText(SMW_OUTPUT_WIKI, $this->getLinker($first_col))) !== false) { if (!$first_col && !$found_values) { // first values after first column $result .= ' ('; $found_values = true; } elseif ($found_values || !$first_value) { // any value after '(' or non-first values on first column $result .= ', '; } if ($first_value) { // first value in any column, print header $first_value = false; if ($this->mShowHeaders && $field->getPrintRequest()->getLabel() !== '') { $result .= $field->getPrintRequest()->getText(SMW_OUTPUT_WIKI, $this->mLinker) . ' '; } } $result .= $text; // actual output value } $first_col = false; } if ($found_values) { $result .= ')'; } } $result .= '</li>'; $row = $nextrow; // end list if we're at the end of the column // or the page if (($rowindex + 1) % $rows_per_column == 0 && $rowindex + 1 < $num) { $result .= "\t\t\t\t</ul>\n\t\t\t</div> <!-- end column -->"; } $rowindex++; } // Make label for finding further results if ($this->linkFurtherResults($res)) { $result .= '<br /><li>' . $this->getLink($res, $outputmode)->getText(SMW_OUTPUT_WIKI, $this->mLinker) . '</li>'; } $result .= "\t\t\t\t</ul>\n\t\t\t</div> <!-- end column -->"; // clear all the CSS floats $result .= "\n" . '<br style="clear: both;"/>'; return $result; }
/** * Get the serialization for a SMWQueryResult object. * * @since 1.7 * * @param SMWQueryResult $result * * @return array */ public static function getSerializedQueryResult(QueryResult $queryResult) { $results = array(); $printRequests = array(); foreach ($queryResult->getPrintRequests() as $printRequest) { $printRequests[] = self::getSerializedPrintRequestFormat($printRequest); } /** * @var DIWikiPage $diWikiPage * @var PrintRequest $printRequest */ foreach ($queryResult->getResults() as $diWikiPage) { if (!$diWikiPage->getTitle() instanceof Title) { continue; } $result = array('printouts' => array()); foreach ($queryResult->getPrintRequests() as $printRequest) { $resultArray = new SMWResultArray($diWikiPage, $printRequest, $queryResult->getStore()); if ($printRequest->getMode() === PrintRequest::PRINT_THIS) { $dataItems = $resultArray->getContent(); $result += self::getSerialization(array_shift($dataItems), $printRequest); } elseif ($resultArray->getContent() !== array()) { $values = array(); foreach ($resultArray->getContent() as $dataItem) { $values[] = self::getSerialization($dataItem, $printRequest); } $result['printouts'][$printRequest->getLabel()] = $values; } else { // For those objects that are empty return an empty array // to keep the output consistent $result['printouts'][$printRequest->getLabel()] = array(); } } $results[$diWikiPage->getTitle()->getFullText()] = $result; } return array('printrequests' => $printRequests, 'results' => $results); }
/** * Return serialised results in specified format. */ protected function getResultText(SMWQueryResult $res, $outputmode) { if ($this->mTreeProp === null || $this->mTreeProp === '') { $res->addErrors(array(wfMessage('srf-noparentprop')->inContentLanguage()->text())); return ''; } $store = $res->getStore(); // first put everything in a list // elements appearing more than once will be inserted more than once, // but only one instance will be inserted with the hash // only this instance will be considered as a parent element in the tree $list = array(); while ($row = $res->getNext()) { $hash = $row[0]->getResultSubject()->getSerialization(); if (array_key_exists($hash, $list)) { $list[] = new SRFTreeElement($row); } else { $list[$hash] = new SRFTreeElement($row); } } // transfer the listelements into the tree // elements with more than one parent will be cloned for each parent $tree = array(); foreach ($list as $hash => $listElem) { $parents = $store->getPropertyValues($listElem->mRow[0]->getResultSubject(), SMWDIProperty::newFromUserLabel($this->mTreeProp)); // transfer element from list to tree foreach ($parents as $parent) { $parentPageHash = $parent->getSerialization(); if ($hash !== null) { if (array_key_exists($parentPageHash, $list)) { $listElem->mParent = $parentPageHash; } $tree[$hash] = $listElem; $hash = null; } else { $treeElem = clone $listElem; if (array_key_exists($parentPageHash, $list)) { $treeElem->mParent = $parentPageHash; } else { $treeElem->mParent = null; } $tree[] = $treeElem; } } } foreach ($tree as $hash => $value) { } // build pointers from parants to children foreach ($tree as $hash => $treeElem) { if ($treeElem->mParent != null) { $tree[$treeElem->mParent]->mChildren[] = $treeElem; } } // remove children from toplevel foreach ($tree as $hash => $treeElem) { if ($treeElem->mParent != null) { unset($tree[$hash]); } } $result = ''; $rownum = 0; foreach ($tree as $hash => $treeElem) { $this->printElement($result, $treeElem, $row); } return $result; }
/** * Return serialised results in specified format. */ protected function getResultText(SMWQueryResult $res, $outputmode) { if ($this->mTreeProp === '') { $res->addErrors(array(wfMessage('srf-noparentprop')->inContentLanguage()->text())); return ''; } $store = $res->getStore(); // put everything in a list and set parent hashes // elements appearing more than once will be inserted more than once and // elements with more than one parent will be cloned for each parent, // but only one instance will ever be inserted with the hash and // only this instance will later be considered as a parent element in the tree $tree = array(); while ($row = $res->getNext()) { $element = new SRFTreeElement($row); $hash = $row[0]->getResultSubject()->getSerialization(); if (array_key_exists($hash, $tree)) { $hash = null; } $parents = $store->getPropertyValues($element->mRow[0]->getResultSubject(), SMWDIProperty::newFromUserLabel($this->mTreeProp)); if (empty($parents)) { // no parents: copy into tree as root level item if ($hash !== null) { $tree[$hash] = $element; } else { $tree[] = $element; } } else { // one or more parents: copy one copy per parent into tree foreach ($parents as $parent) { if ($hash !== null) { $tree[$hash] = $element; $hash = null; } else { $element = clone $element; $tree[] = $element; } $element->mParent = $parent->getSerialization(); } } } $rootElements = array(); // build pointers from parents to children and remove pointers to parents that don't exist in the tree foreach ($tree as $hash => $element) { if ($element->mParent !== null) { if (array_key_exists($element->mParent, $tree)) { $tree[$element->mParent]->mChildren[] = $element; } else { $element->mParent = null; $rootElements[$hash] = $element; } } else { $rootElements[$hash] = $element; } } $result = ''; $rownum = 0; // if a specific page was specified as root element of the tree if ($this->mRoot !== '') { // get the title object of the root page $rootTitle = Title::newFromText($this->mRoot); if ($rootTitle === null) { $res->addErrors(array(wfMessage('srf-rootinvalid')->params($this->mRoot)->inContentLanguage()->text())); return ''; } $rootSerialization = SMWDIWikiPage::newFromTitle($rootTitle)->getSerialization(); // find the root page in the tree and print it and its subtree if (array_key_exists($rootSerialization, $tree)) { $this->printElement($result, $tree[$rootSerialization], $rownum, $this->mStartLevel); } } else { // iterate through all tree elements foreach ($rootElements as $hash => $element) { // print current root element and its subtree $this->printElement($result, $element, $rownum, $this->mStartLevel); } } return $result; }