/**
  * Handles search requests
  */
 public function searchAction()
 {
     $title = $this->_owApp->translate->_('Resource Search');
     $this->view->placeholder('main.window.title')->set($title);
     OntoWiki::getInstance()->getNavigation()->disableNavigation();
     $store = $this->_erfurt->getStore();
     if (isset($this->_owApp->selectedModel) && null !== $this->_owApp->selectedModel) {
         $modelUri = $this->_owApp->selectedModel->getModelIri();
     } else {
         $modelUri = null;
     }
     if ($this->_request->getParam('searchtext-input') !== null) {
         $searchText = trim($this->getParam('searchtext-input'));
     }
     $error = false;
     $errorMsg = '';
     // check if search is already errorenous
     if (!$error) {
         // try sparql query pre search check (with limit to 1)
         $elements = $store->getSearchPattern($searchText, $modelUri);
         $query = new Erfurt_Sparql_Query2();
         $query->addElements($elements);
         $query->setLimit(1);
         $query->addFrom($modelUri);
         try {
             $store->sparqlQuery($query);
         } catch (Exception $e) {
             // build error message
             $this->_owApp->appendMessage(new OntoWiki_Message($this->_owApp->translate->_('search failed'), OntoWiki_Message::ERROR));
             $error = true;
             $errorMsg .= 'Message details: ';
             $errorMsg .= str_replace('LIMIT 1', '', $e->getMessage());
         }
     }
     // if error occured set output for error page
     if ($error) {
         $this->view->errorMsg = $errorMsg;
     } else {
         // set redirect to effective search controller
         $url = new OntoWiki_Url(array('controller' => 'list'), array());
         $url->setParam('s', $searchText);
         $url->setParam('init', '1');
         $this->_redirect($url);
     }
 }
 protected function _buildQuery($setup, $forImplicit = false)
 {
     if (isset($setup->config->query->deeper) && isset($setup->state->parent)) {
         //$replace = ;
         $queryString = str_replace("%resource%", $setup->state->parent, $setup->config->query->deeper);
         $query = Erfurt_Sparql_SimpleQuery::initWithString($queryString);
     } else {
         $query = new Erfurt_Sparql_Query2();
         $query->addElements(NavigationHelper::getSearchTriples($setup, $forImplicit, $this->_config->store->backend));
         //$query->setCountStar(true);
         $query->setDistinct(true);
         $query->addProjectionVar(new Erfurt_Sparql_Query2_Var('resourceUri'));
         //$query->addProjectionVar(new Erfurt_Sparql_Query2_Var('subResourceUri'));
         // set to _limit+1, so we can see if there are more than $_limit entries
         //$query->setLimit($this->_limit + 1);
     }
     // sorting
     if (isset($setup->state->sorting)) {
         $query->getOrder()->add(new Erfurt_Sparql_Query2_Var('sortRes'), "ASC");
     } elseif (isset($setup->config->ordering->relation)) {
         // set ordering
         $orderVar = new Erfurt_Sparql_Query2_Var('order');
         $query->getWhere()->addElement(new Erfurt_Sparql_Query2_OptionalGraphPattern(array(new Erfurt_Sparql_Query2_Triple(new Erfurt_Sparql_Query2_Var('resourceUri'), new Erfurt_Sparql_Query2_IriRef($setup->config->ordering->relation), $orderVar))));
         $query->getOrder()->add($orderVar, $setup->config->ordering->modifier);
     }
     // set offset
     if (isset($setup->state->offset) && $setup->state->lastEvent == 'more') {
         $query->setLimit($this->_limit + $setup->state->offset + 1);
     } else {
         $query->setLimit($this->_limit + 1);
     }
     return $query;
 }
 /**
  *
  * Enter description here ...
  *
  * @param   $uri         string to convert to nice uri
  * @param   $titleHelper TitleHelper instance to use to get titles for URIs
  */
 private function generateUriFromSparql($uri, $titleHelper)
 {
     $schema = $this->loadNamingSchema($uri);
     $properties = array();
     foreach ($schema as $element) {
         if (is_string($this->_config->property->{$element})) {
             $properties[$this->_config->property->{$element}] = array('element' => $element, 'rank' => '1');
         } elseif (is_array($this->_config->property->{$element}->toArray())) {
             $countDeep = 0;
             foreach ($this->_config->property->{$element}->toArray() as $elementDeep) {
                 $properties[(string) $elementDeep] = array('element' => $element, 'rank' => $countDeep++);
             }
         }
     }
     $query = new Erfurt_Sparql_Query2();
     $sRef = new Erfurt_Sparql_Query2_IriRef($uri);
     $pVar = new Erfurt_Sparql_Query2_Var('p');
     $oVar = new Erfurt_Sparql_Query2_Var('o');
     $query->addProjectionVar($pVar);
     $query->addProjectionVar($oVar);
     $query->addTriple($sRef, $pVar, $oVar);
     $query->addFrom((string) $this->_model);
     $query->setLimit(100);
     $query->setDistinct(true);
     $container = new Erfurt_Sparql_Query2_ConditionalOrExpression();
     foreach ($properties as $filterProp => $element) {
         $sameTerm = new Erfurt_Sparql_Query2_sameTerm($pVar, new Erfurt_Sparql_Query2_IriRef($filterProp));
         //$filter = new Erfurt_Sparql_Query2_Filter($sameTerm);
         $container->addElement($sameTerm);
     }
     $query->addFilter($container);
     $result = $this->_owApp->erfurt->getStore()->sparqlQuery($query, array('withImports' => true));
     $replacements = array();
     foreach ($result as $row) {
         if (array_key_exists($row['p'], $properties)) {
             $titleHelper->addResource($row['p']);
             if (Erfurt_Uri::check($row['o'])) {
                 $titleHelper->addResource($row['o']);
             }
             if (array_key_exists($properties[$row['p']]['element'], $replacements)) {
                 $newRank = (int) $properties[$row['p']]['rank'];
                 $minRank = $replacements[$properties[$row['p']]['element']]['rank'];
                 if ($newRank < $minRank) {
                     $replacements[$properties[$row['p']]['element']] = array('rank' => $newRank, 'value' => $row['o'], 'key' => $row['p']);
                 }
             } else {
                 $replacements[$properties[$row['p']]['element']] = array('rank' => $properties[$row['p']]['rank'], 'value' => $row['o'], 'key' => $row['p']);
             }
         }
     }
     $localName = '';
     foreach ($schema as $element) {
         if (array_key_exists($element, $replacements)) {
             if (Erfurt_Uri::check($replacements[$element]['value'])) {
                 $val = $titleHelper->getTitle($replacements[$element]['value']);
             } else {
                 $val = $replacements[$element]['value'];
             }
             $val = $this->convertChars($val);
             $key = $this->convertChars($titleHelper->getTitle($replacements[$element]['key']));
             $localName .= $key . '/' . $val . '/';
         }
     }
     // no meaningful localname created falback to old uri (TODO or md5 a new one?)
     if ($localName === '') {
         return $uri;
         //$localName = 'resource/' . md5($uri . time());
     }
     $base = '';
     if ($this->_model !== null && $this->_model->getBaseIri() !== '') {
         $base = $this->_model->getBaseIri();
         if ($base[strlen($base) - 1] !== '#' && $base[strlen($base) - 1] !== '/') {
             $base .= '/';
         }
     } else {
         $count = 0;
         foreach (explode('/', $uri) as $element) {
             if ($count > 2) {
                 break;
             } else {
                 $count++;
                 $base .= $element . '/';
             }
         }
     }
     return $base . $localName;
 }
 /**
  * Searches the local database for URIs. If mode is set to properties only,
  * only defined properties and URIs that are used at least once as a
  * property are returned.
  *
  * the classes array is used for class restrictions
  *
  * @param array  $termsArray
  * @param string $modelUri
  * @param int    $mode
  * @param int    $limit
  * @param array  $classes
  *
  * @return array
  */
 private function _searchLocal(array $termsArray, $modelUri, $mode, $limit, $classes = array())
 {
     if ($mode === self::SEARCH_MODE_PROPERTIES) {
         return $this->_searchLocalPropertiesOnly($termsArray, $modelUri, $limit);
     }
     $store = Erfurt_App::getInstance()->getStore();
     // get a store specific text-search query2 object
     $searchPattern = $store->getSearchPattern(implode(" ", $termsArray), $modelUri);
     $query = new Erfurt_Sparql_Query2();
     $query->addElements($searchPattern);
     $projVar = new Erfurt_Sparql_Query2_Var('resourceUri');
     $query->addProjectionVar($projVar);
     // add class restriction patterns for each class
     foreach ($classes as $class) {
         $classPattern = new Erfurt_Sparql_Query2_GroupGraphPattern();
         $classPattern->addTriple($projVar, new Erfurt_Sparql_Query2_IriRef(EF_RDF_TYPE), new Erfurt_Sparql_Query2_IriRef($class));
         $query->addElement($classPattern);
     }
     $query->setLimit(20);
     $query->setDistinct(true);
     $queryResult = $store->sparqlQuery($query, array('result_format' => 'extended'));
     $tempResult = array();
     foreach ($queryResult['results']['bindings'] as $row) {
         $object = isset($row['o']) ? $row['o']['value'] : null;
         $weight = $this->_getWeight($termsArray, $row['resourceUri']['value'], $object);
         if (isset($tempResult[$row['resourceUri']['value']])) {
             if ($weight > $tempResult[$row['resourceUri']['value']]) {
                 $tempResult[$row['resourceUri']['value']] = $weight;
             }
         } else {
             $tempResult[$row['resourceUri']['value']] = $weight;
         }
     }
     arsort($tempResult);
     require_once 'OntoWiki/Model/TitleHelper.php';
     require_once 'OntoWiki/Utils.php';
     if (null !== $modelUri) {
         $model = $store->getModel($modelUri, false);
         $titleHelper = new OntoWiki_Model_TitleHelper($model);
     } else {
         $titleHelper = new OntoWiki_Model_TitleHelper();
     }
     $titleHelper->addResources(array_keys($tempResult));
     $translate = $this->_owApp->translate;
     // create different source description strings
     if (count($classes) > 0) {
         $sourceString = $translate->_('Local Search') . ' (' . $translate->_('recommended') . ')';
     } else {
         $sourceString = $translate->_('Local Search');
     }
     $result = array();
     foreach ($tempResult as $uri => $w) {
         $title = $titleHelper->getTitle($uri);
         if (null !== $title) {
             $result[$uri] = str_replace('|', '&Iota;', $title) . '|' . $uri . '|' . $sourceString;
         } else {
             $result[$uri] = OntoWiki_Utils::compactUri($uri) . $uri . '|' . $sourceString;
         }
     }
     return $result;
 }
예제 #5
0
 private function checkConfig($config)
 {
     $resVar = new Erfurt_Sparql_Query2_Var('resourceUri');
     $typeVar = new Erfurt_Sparql_Query2_IriRef(EF_RDF_TYPE);
     $query = new Erfurt_Sparql_Query2();
     $query->addProjectionVar($resVar)->setDistinct(true);
     $union = new Erfurt_Sparql_Query2_GroupOrUnionGraphPattern();
     if (is_string($config->hierarchyTypes)) {
         $config->hierarchyTypes = array($config->hierarchyTypes);
     }
     foreach ($config->hierarchyTypes->toArray() as $type) {
         $ggp = new Erfurt_Sparql_Query2_GroupGraphPattern();
         $ggp->addTriple($resVar, $typeVar, new Erfurt_Sparql_Query2_IriRef($type));
         $union->addElement($ggp);
     }
     $query->addElement($union);
     $query->setLimit(1);
     $allResults = $this->_owApp->selectedModel->sparqlQuery($query);
     /*$this->_owApp->logger->info(
           'Navigation Query: ' .PHP_EOL . $query->__toString()
       );
       $this->_owApp->logger->info(
           'Navigation Query Results: ' .PHP_EOL . print_r($all_results)
       );*/
     return count($allResults);
 }