/** * 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); }
/** * 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)); } }