Example #1
0
 /**
  * The query engine's main method.
  *
  * @param  Dataset       $dataset    the RDF Dataset
  * @param  mixed         $query      the parsed SPARQL query
  * @param  String        $resultform the result form. If set to 'xml' the result will be
  *                                   SPARQL Query Results XML Format as described in http://www.w3.org/TR/rdf-sparql-XMLres/ .
  * @return Array/String  Type of the result depends on $resultform.
  */
 public function queryModel($dataset, Query $query, $resultform = false)
 {
     $this->query = $query;
     $this->dataset = $dataset;
     if ($this->query->isEmpty) {
         $vartable[0]['patternResult'] = null;
         return SparqlEngine_ResultConverter::convertFromResult($vartable, $this, $resultform);
     }
     $graphlist = $this->preselectGraphs();
     /// match graph patterns against the RDF Dataset
     $patternlist = $this->matchPatterns($graphlist);
     // filter results- apply inner filters
     $patternlist = $this->filterPatterns($patternlist, false);
     // join pattern results
     $vartable = $this->joinResults($patternlist);
     // filter results- apply outer filters
     $vartable = $this->filterPatterns($vartable, true);
     if ($vartable[0]['patternResult'] != null) {
         // sort vars (ORDER BY, LIMIT, OFFSET)
         $vartable = $this->sortVars($vartable[0]['patternResult']);
         $qrf = $this->query->getResultForm();
         if ($qrf == 'select' || $qrf == 'select distinct') {
             $vars = $this->query->getResultVars();
             $vartable = $this->selectVars($vartable, $vars);
             if ($qrf == 'select distinct') {
                 $vartable = $this->distinct($vartable);
             }
         }
     } else {
         $vartable = null;
     }
     return SparqlEngine_ResultConverter::convertFromResult($vartable, $this, $resultform);
 }
Example #2
0
 /**
  * Parses the SELECT part of a query.
  *
  * @return void
  * @throws SparqlParserException
  */
 protected function parseSelect()
 {
     $this->_fastForward();
     $curLow = strtolower(current($this->tokens));
     prev($this->tokens);
     if ($curLow == 'distinct') {
         $this->query->setResultForm('select distinct');
     } else {
         $this->query->setResultForm('select');
     }
     $currentVar = null;
     $currentFunc = null;
     $bWaitForRenaming = false;
     while ($curLow != 'from' && $curLow != 'where' && $curLow != "{") {
         $this->_fastForward();
         $curTok = current($this->tokens);
         $curLow = strtolower($curTok);
         if ($this->varCheck($curTok) || $curLow == '*') {
             if ($bWaitForRenaming) {
                 $bWaitForRenaming = false;
                 $currentVar->setAlias($curTok);
                 if ($currentFunc != null) {
                     $currentVar->setFunc($currentFunc);
                 }
                 $this->query->addResultVar($currentVar);
                 $currentVar = null;
             } else {
                 if ($currentVar != null) {
                     $this->query->addResultVar($currentVar);
                     $currentVar = null;
                 }
                 $currentVar = new Query_ResultVariable($curTok);
                 if ($currentFunc != null) {
                     $currentVar->setFunc($currentFunc);
                 }
             }
             $currentFunc = null;
         } else {
             if ($curLow == 'as') {
                 if ($currentVar === null) {
                     throw new SparqlParserException('AS requires a variable left and right', null, key($this->tokens));
                 }
                 $bWaitForRenaming = true;
             } else {
                 if (in_array($curLow, self::$sops)) {
                     $currentFunc = $curLow;
                 }
             }
         }
         if (!current($this->tokens)) {
             throw new SparqlParserException("Unexpected end of File.", null, key($this->tokens));
         }
     }
     if ($currentVar != null) {
         $this->query->addResultVar($currentVar);
     }
     prev($this->tokens);
     if (count($this->query->getResultVars()) == 0) {
         throw new SparqlParserException("Variable or '*' expected.", null, key($this->tokens));
     }
 }