public static function initFromString($queryString, $parserOptions = array()) { require_once 'Erfurt/Sparql/ParserException.php'; $retval = null; $errors = null; $parser = new Erfurt_Sparql_Parser($queryString); try { $retval = $parser->parse(); } catch (Erfurt_Sparql_ParserException $e) { $errors = $e->__toString(); } return array('retval' => $retval, 'errors' => $errors); }
public function testUncomment() { $queryString = '# bla ## bla bla ### bla bla bla'; $this->assertEquals('', trim(Erfurt_Sparql_Parser::uncomment($queryString))); }
/** * parsing the Query * @access private * @param string $queryString SparqlQuery * @return array $queryParts $queryParts['triples'] = $triples; * $queryParts['graphs'] = $graphs; */ private function parseQuery($queryString) { // Creation of SPARQL Parser and parsing the query string $parser = new Erfurt_Sparql_Parser(); //hack to get Construct queries running. $queryString = preg_replace("/CONSTRUCT\\s*\\{[^\\}]*\\}/mix", "SELECT *", $queryString); $parsedQuery = $parser->parse($queryString); //extract graphUris from FromPart and from FromNamedPart $graphs = $parsedQuery->getFromPart(); $fromNamedParts = $parsedQuery->getFromNamedPart(); foreach ($fromNamedParts as $fromNamedPart) { array_push($graphs, $fromNamedPart); } //extract triplePattern from parsed query and put them in an array. $triples = array(); //triples[0,1,2...] = array('subject' => <subject>, 'predicate' => <predicate>, 'object' => <object>,) $graphPatterns = $parsedQuery->getResultPart(); foreach ($graphPatterns as $gid => $graphPattern) { $triplePatterns = $graphPattern->getTriplePatterns(); foreach ($triplePatterns as $tid => $triplePattern) { $subject = (string) $triplePattern->getSubject(); $predicate = (string) $triplePattern->getPredicate(); $object = (string) $triplePattern->getObject(); $triple = array(); $this->_isVariable($subject) ? null : ($triple['subject'] = $subject); $this->_isVariable($predicate) ? null : ($triple['predicate'] = $predicate); $this->_isVariable($object) ? null : ($triple['object'] = $object); $triples[] = $triple; } } $queryParts['triples'] = $triples; $queryParts['graphs'] = $graphs; return $queryParts; }
/** @see Erfurt_Store_Adapter_Interface */ public function sparqlQuery($query, $options = array()) { $resultform = isset($options[Erfurt_Store::RESULTFORMAT]) ? $options[Erfurt_Store::RESULTFORMAT] : Erfurt_Store::RESULTFORMAT_PLAIN; $start = microtime(true); require_once 'Erfurt/Sparql/EngineDb/Adapter/EfZendDb.php'; $engine = new Erfurt_Sparql_EngineDb_Adapter_EfZendDb($this->_dbConn, $this->_getModelInfos()); require_once 'Erfurt/Sparql/Parser.php'; $parser = new Erfurt_Sparql_Parser(); if (!$query instanceof Erfurt_Sparql_Query) { $query = $parser->parse((string) $query); } $result = $engine->queryModel($query, $resultform); // Debug executed SPARQL queries in debug mode (7) $logger = Erfurt_App::getInstance()->getLog(); $time = (microtime(true) - $start) * 1000; $debugText = 'SPARQL Query (' . $time . ' ms)'; $logger->debug($debugText); return $result; }
protected function _parseConstraintTree($nLevel = 0, $bParameter = false) { $tree = array(); $part = array(); $chQuotes = null; $litQuotes = null; $strQuoted = ''; $parens = false; while ($tok = next($this->_tokens)) { if ($chQuotes !== null && $tok != $chQuotes) { $strQuoted .= $tok; continue; } else { if ($litQuotes !== null) { $strQuoted .= $tok; if ($tok[strlen($tok) - 1] === '>') { $tok = '>'; } else { continue; } } else { if ($tok === ')' || $tok === '}' || $tok === '.') { break; } else { if (strtolower($tok) === 'filter' || strtolower($tok) === 'optional') { break; } } } } switch ($tok) { case '"': case '\'': if ($chQuotes === null) { $chQuotes = $tok; $strQuoted = ''; } else { $chQuotes = null; $part[] = array('type' => 'value', 'value' => $strQuoted, 'quoted' => true); } continue 2; break; case '>': $litQuotes = null; $part[] = array('type' => 'value', 'value' => $strQuoted, 'quoted' => false); continue 2; break; case '(': $parens = true; $bFunc1 = isset($part[0]['type']) && $part[0]['type'] === 'value'; $bFunc2 = isset($tree['type']) && $tree['type'] === 'equation' && isset($tree['operand2']) && isset($tree['operand2']['value']); $part[] = $this->_parseConstraintTree($nLevel + 1, $bFunc1 || $bFunc2); if ($bFunc1) { $tree['type'] = 'function'; $tree['name'] = $part[0]['value']; Erfurt_Sparql_Parser::fixNegationInFuncName($tree); if (isset($part[1]['type'])) { $part[1] = array($part[1]); } $tree['parameter'] = $part[1]; $part = array(); } else { if ($bFunc2) { $tree['operand2']['type'] = 'function'; $tree['operand2']['name'] = $tree['operand2']['value']; Erfurt_Sparql_Parser::fixNegationInFuncName($tree['operand2']); $tree['operand2']['parameter'] = $part[0]; unset($tree['operand2']['value']); unset($tree['operand2']['quoted']); $part = array(); } } if (current($this->_tokens) === ')') { if (substr(next($this->_tokens), 0, 2) === '_:') { // filter ends here prev($this->_tokens); break 2; } else { prev($this->_tokens); } } continue 2; break; case ' ': case "\t": continue 2; case '=': case '>': case '<': case '<=': case '>=': case '!=': case '&&': case '||': if (isset($tree['type']) && $tree['type'] === 'equation' && isset($tree['operand2'])) { //previous equation open $part = array($tree); } else { if (isset($tree['type']) && $tree['type'] !== 'equation') { $part = array($tree); $tree = array(); } } $tree['type'] = 'equation'; $tree['level'] = $nLevel; $tree['operator'] = $tok; $tree['operand1'] = $part[0]; unset($tree['operand2']); $part = array(); continue 2; break; case '!': if ($tree != array()) { require_once 'Erfurt/Sparql/ParserException.php'; throw new Erfurt_Sparql_ParserException('Unexpected "!" negation in constraint.', -1, current($this->_tokens)); } $tree['negated'] = true; continue 2; case ',': //parameter separator if (count($part) == 0 && !isset($tree['type'])) { throw new SparqlParserException('Unexpected comma'); } $bParameter = true; if (count($part) === 0) { $part[] = $tree; $tree = array(); } continue 2; default: break; } if ($this->_varCheck($tok)) { if (!$parens && $nLevel === 0) { // Variables need parenthesizes first require_once 'Erfurt/Sparql/ParserException.php'; throw new Erfurt_Sparql_ParserException('FILTER expressions that start with a variable need parenthesizes.', -1, current($this->_tokens)); } $part[] = array('type' => 'value', 'value' => $tok, 'quoted' => false); } else { if (substr($tok, 0, 2) === '_:') { // syntactic blank nodes not allowed in filter require_once 'Erfurt/Sparql/ParserException.php'; throw new Erfurt_Sparql_ParserException('Syntactic Blanknodes not allowed in FILTER.', -1, current($this->_tokens)); } else { if (substr($tok, 0, 2) === '^^') { $part[count($part) - 1]['datatype'] = $this->_query->getFullUri(substr($tok, 2)); } else { if ($tok[0] === '@') { $part[count($part) - 1]['language'] = substr($tok, 1); } else { if ($tok[0] === '<') { if ($tok[strlen($tok) - 1] === '>') { //single-tokenized <> uris $part[] = array('type' => 'value', 'value' => $tok, 'quoted' => false); } else { //iris split over several tokens $strQuoted = $tok; $litQuotes = true; } } else { if ($tok === 'true' || $tok === 'false') { $part[] = array('type' => 'value', 'value' => $tok, 'quoted' => false, 'datatype' => 'http://www.w3.org/2001/XMLSchema#boolean'); } else { $part[] = array('type' => 'value', 'value' => $tok, 'quoted' => false); } } } } } } if (isset($tree['type']) && $tree['type'] === 'equation' && isset($part[0])) { $tree['operand2'] = $part[0]; Erfurt_Sparql_Parser::balanceTree($tree); $part = array(); } } if (!isset($tree['type']) && $bParameter) { return $part; } else { if (isset($tree['type']) && $tree['type'] === 'equation' && isset($tree['operand1']) && !isset($tree['operand2']) && isset($part[0])) { $tree['operand2'] = $part[0]; Erfurt_Sparql_Parser::balanceTree($tree); } } if (count($tree) === 0 && count($part) > 1) { require_once 'Erfurt/Sparql/ParserException.php'; throw new Erfurt_Sparql_ParserException('Failed to parse constraint.', -1, current($this->_tokens)); } if (!isset($tree['type']) && isset($part[0])) { if (isset($tree['negated'])) { $part[0]['negated'] = true; } return $part[0]; } return $tree; }