/**
  * Find the redirect target of an ExpNsResource
  *
  * Returns an SMWExpNsResource object the input redirects to, the input
  * itself if there is no redirect (or it cannot be used for making a resource
  * with a prefix).
  *
  * @since 1.6
  *
  * @param ExpNsResource $expNsResource string URI to check
  * @param boolean $existsthat is set to true if $expNsResource is in the
  * store; always false for blank nodes; always true for subobjects
  *
  * @return ExpNsResource
  * @throws RuntimeException
  */
 public function findRedirectTargetResource(ExpNsResource $expNsResource, &$exists)
 {
     $exists = true;
     if ($expNsResource->isBlankNode() || $this->isNonRedirectableResource($expNsResource)) {
         $exists = false;
         return $expNsResource;
     }
     if ($expNsResource->getDataItem() instanceof DIWikiPage && $expNsResource->getDataItem()->getSubobjectName() !== '') {
         return $expNsResource;
     }
     $firstRow = $this->doLookupResourceUriTargetFor($expNsResource);
     if ($firstRow === false) {
         $exists = false;
         return $expNsResource;
     }
     if (count($firstRow) > 1 && !is_null($firstRow[1])) {
         return $this->getResourceForTargetElement($expNsResource, $firstRow[1]);
     }
     return $expNsResource;
 }
 /**
  * Find the redirect target of an SMWExpNsResource.
  * Returns an SMWExpNsResource object the input redirects to,
  * the input itself if there is no redirect (or it cannot be
  * used for making a resource with a prefix).
  *
  * @since 1.6
  * @param $expNsResource string URI to check
  * @param $exists boolean that is set to true if $expNsResource is in the
  * store; always false for blank nodes; always true for subobjects
  * @return SMWExpNsResource
  */
 protected function getSparqlRedirectTarget(SMWExpNsResource $expNsResource, &$exists)
 {
     if ($expNsResource->isBlankNode()) {
         $exists = false;
         return $expNsResource;
     } elseif ($expNsResource->getDataItem() instanceof SMWDIWikiPage && $expNsResource->getDataItem()->getSubobjectName() !== '') {
         $exists = true;
         return $expNsResource;
     }
     $resourceUri = SMWTurtleSerializer::getTurtleNameForExpElement($expNsResource);
     $rediUri = SMWTurtleSerializer::getTurtleNameForExpElement(SMWExporter::getSpecialPropertyResource('_REDI'));
     $skeyUri = SMWTurtleSerializer::getTurtleNameForExpElement(SMWExporter::getSpecialPropertyResource('_SKEY'));
     $sparqlResult = smwfGetSparqlDatabase()->select('*', "{$resourceUri} {$skeyUri} ?s  OPTIONAL { {$resourceUri} {$rediUri} ?r }", array('LIMIT' => 1), array($expNsResource->getNamespaceId() => $expNsResource->getNamespace()));
     $firstRow = $sparqlResult->current();
     if ($firstRow === false) {
         $exists = false;
         return $expNsResource;
     } elseif (count($firstRow) > 1 && !is_null($firstRow[1])) {
         $exists = true;
         $rediTargetElement = $firstRow[1];
         $rediTargetUri = $rediTargetElement->getUri();
         $wikiNamespace = SMWExporter::getNamespaceUri('wiki');
         if (strpos($rediTargetUri, $wikiNamespace) === 0) {
             return new SMWExpNsResource(substr($rediTargetUri, 0, strlen($wikiNamespace)), $wikiNamespace, 'wiki');
         } else {
             return $expNsResource;
         }
     } else {
         $exists = true;
         return $expNsResource;
     }
 }