Esempio n. 1
0
 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);
 }
Esempio n. 2
0
 public function testUncomment()
 {
     $queryString = '# bla
                     ## bla bla
                     ### bla bla bla';
     $this->assertEquals('', trim(Erfurt_Sparql_Parser::uncomment($queryString)));
 }
Esempio n. 3
0
 /**
  * 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;
 }
Esempio n. 4
0
 /** @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;
 }
Esempio n. 5
0
 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;
 }