Example #1
0
 /**
  * Checks if $token is a qname.
  *
  * @param  String  $token The token
  * @return boolean TRUE if the token is a qname false if not
  * @throws SparqlParserException
  */
 protected function qnameCheck($token)
 {
     $pattern = "/^([^:^\\<]*):([^:]*)\$/";
     if (preg_match($pattern, $token, $hits) > 0) {
         $prefs = $this->query->getPrefixes();
         if (isset($prefs[$hits[1]])) {
             return true;
         }
         if ($hits[1] == "_") {
             return true;
         }
         throw new SparqlParserException("Unbound Prefix: <i>" . $hits[1] . "</i>", null, key($this->tokens));
     } else {
         return false;
     }
 }
Example #2
0
 /**
  * Builds an evaluation string to determine wether the result passes
  * the filter or not. This string is evaluatet by the php buildin eval() function
  *
  * @param  Array      $vars a list which contains the used variables
  * @param  Array      $res  the result part which have to be evaluated
  * @param  Constraint $constraint the Constrain object
  * @param  Array      $function an Array which contains the used functions
  * @return String
  */
 protected function fillConstraintString($vars, $res, $constraint, $function)
 {
     $boundExpr = false;
     $evalString = $constraint->getExpression();
     // extract Literals
     $pattern1 = "/\".[^\"]*\"[^\\^\\@]/";
     $pattern2 = "/\\'.[^\\']*\\'[^\\^\\@]/";
     preg_match_all($pattern1, $evalString, $hits1);
     preg_match_all($pattern2, $evalString, $hits2);
     foreach ($hits1[0] as $k => $val) {
         $evalString = preg_replace('/\\".[^\\"]*\\"[^\\^]/', '_REPLACED1_' . $k++, $evalString, 1);
     }
     foreach ($hits2[0] as $k => $val) {
         $evalString = preg_replace('/\\".[^\\"]*\\"[^\\^]/', '_REPLACED2_' . $k++, $evalString, 1);
     }
     // replace namespaces
     $prefs = $this->query->getPrefixes();
     foreach ($prefs as $key => $val) {
         if ($key == '') {
             $key = ' ';
         }
         $evalString = preg_replace("/^(" . $key . "\\:)(.[^\\s]*)|([\\s\\(]?[^\\^])(" . $key . "\\:)(.[^\\s\\)]*)([\\s\\)]?)/", "\$3'<" . $val . "\$2\$5>'\$6", $evalString);
         $evalString = preg_replace("/(\\^)(" . $key . "\\:)(.[^\\s]*)/", "\$1<" . $val . "\$3>", $evalString);
     }
     $xsd = "http\\:\\/\\/www.w3.org\\/2001\\/XMLSchema\\#";
     // evaluate bound calls
     if ($function['bound']) {
         $boundExpr = true;
         foreach ($function['bound'] as $var) {
             if (isset($res[$var]) && $res[$var] !== "") {
                 $replacement = 'true';
             } else {
                 $replacement = 'false';
             }
             $evalString = preg_replace("/bound\\(\\" . $var . "\\)/i", $replacement, $evalString);
         }
     }
     // evaluate isBlank calls
     if ($function['isBlank']) {
         foreach ($function['isBlank'] as $var) {
             if (isset($res[$var]) && $res[$var] !== "" && $res[$var] instanceof BlankNode) {
                 $replacement = 'true';
             } else {
                 $replacement = 'false';
             }
             $evalString = preg_replace("/isBlank\\(\\" . $var . "\\)/i", $replacement, $evalString);
         }
     }
     // evaluate isLiteral calls
     if ($function['isLiteral']) {
         foreach ($function['isLiteral'] as $var) {
             if (isset($res[$var]) && $res[$var] !== "" && $res[$var] instanceof Literal) {
                 $replacement = 'true';
             } else {
                 $replacement = 'false';
             }
             $evalString = preg_replace("/isLiteral\\(\\" . $var . "\\)/i", $replacement, $evalString);
         }
     }
     // evaluate isUri calls
     if ($function['isUri']) {
         foreach ($function['isUri'] as $var) {
             if (isset($res[$var]) && $res[$var] !== "" && $res[$var] instanceof Resource && $res[$var]->getUri() && !$res[$var] instanceof BlankNode) {
                 $replacement = 'true';
             } else {
                 $replacement = 'false';
             }
             $evalString = preg_replace("/isUri\\(\\" . $var . "\\)/i", $replacement, $evalString);
         }
     }
     // evaluate lang calls
     if ($function['lang']) {
         foreach ($function['lang'] as $var) {
             if (isset($res[$var]) && $res[$var] !== "" && $res[$var] instanceof Literal && $res[$var]->getLanguage()) {
                 $replacement = '"' . $res[$var]->getLanguage() . '"';
             } else {
                 $replacement = 'null';
             }
             $evalString = preg_replace("/lang\\(\\" . $var . "\\)/i", $replacement, $evalString);
         }
     }
     // evaluate datatype calls
     if ($function['datatype']) {
         foreach ($function['datatype'] as $var) {
             if (isset($res[$var]) && $res[$var] !== "" && $res[$var] instanceof Literal && $res[$var]->getDatatype()) {
                 $replacement = '\'<' . $res[$var]->getDatatype() . '>\'';
             } else {
                 $replacement = 'false';
             }
             $evalString = preg_replace("/datatype\\(\\" . $var . "\\)/i", $replacement, $evalString);
         }
     }
     // evaluate string calls
     if ($function['string']) {
         foreach ($function['string'] as $var) {
             if ($var[0] == '?' || $var[0] == '$') {
                 if (isset($res[$var]) && $res[$var] !== "") {
                     $replacement = "'str_" . $res[$var]->getLabel() . "'";
                     if ($res[$var] instanceof BlankNode) {
                         $replacement = "''";
                     }
                 } else {
                     $replacement = 'false';
                 }
                 $evalString = preg_replace("/str\\(\\" . $var . "\\)/i", $replacement, $evalString);
             } else {
                 if ($var[0] == '<') {
                     $evalString = preg_replace("/str\\(\\s*\\<(.[^\\>]*)\\>\\s*\\)/i", "'str_\$1'", $evalString);
                 }
                 if ($var[0] == '"') {
                     $evalString = preg_replace("/str\\(\\s*\"(.[^\\>]*)\"\\@[a-z]*\\s*\\)/i", "'str_\$1'", $evalString);
                 }
             }
         }
     }
     // evaluate VARS
     foreach ($vars[0] as $var) {
         if (isset($res[$var]) && $res[$var] !== "") {
             //$replacement = "'".$res[$var]->getLabel()."'";
             $replacement = '" "';
             if ($res[$var] instanceof Literal) {
                 if ($res[$var]->getDatatype() != null) {
                     if ($res[$var]->getDatatype() == XML_SCHEMA . 'boolean') {
                         $replacement = $res[$var]->getLabel();
                     }
                     if ($res[$var]->getDatatype() == XML_SCHEMA . 'double') {
                         $replacement = $res[$var]->getLabel();
                     }
                     if ($res[$var]->getDatatype() == XML_SCHEMA . 'integer') {
                         $replacement = $res[$var]->getLabel();
                     }
                     if ($res[$var]->getDatatype() == XML_SCHEMA . 'dateTime') {
                         $replacement = strtotime($res[$var]->getLabel());
                     }
                 } else {
                     if ($res[$var]->getLabel() == "") {
                         $replacement = 'false';
                     } else {
                         $replacement = "'str_" . $res[$var]->getLabel() . "'";
                     }
                 }
             } else {
                 if ($res[$var] instanceof Resource) {
                     $replacement = "'<" . $res[$var]->getLabel() . ">'";
                 }
             }
             $evalString = preg_replace("/\\" . $var . "/", $replacement, $evalString);
         }
         // problem with PHP: false < 13 is true
         if (isset($res[$var])) {
             if ($res[$var] === "") {
                 if ($boundExpr) {
                     $evalString = preg_replace("/\\" . $var . "/", "false", $evalString);
                 } else {
                     $evalString = 'false';
                 }
             }
         } else {
             $evalString = preg_replace("/\\" . $var . "/", "false", $evalString);
         }
     }
     // replace '=' with '=='
     $evalString = preg_replace("/(.[^\\=])(\\=)(.[^\\=])/", "\$1==\$3", $evalString);
     // rewrite Literals
     foreach ($hits1[0] as $k => $val) {
         $pattern = '/_REPLACED1_' . $k . '/';
         $evalString = preg_replace($pattern, $hits1[0][$k], $evalString, 1);
     }
     foreach ($hits2[0] as $k => $val) {
         $pattern = '/_REPLACED2_' . $k . '/';
         $evalString = preg_replace($pattern, $hits2[0][$k], $evalString, 1);
     }
     // replace xsd:boolean expressions
     $pattern = $pattern = '/\\"\\s?true\\s?\\"\\^\\^\\<' . $xsd . 'boolean\\>|\'\\s?true\\s?\'\\^\\^xsd:boolean/';
     $evalString = preg_replace($pattern, "true", $evalString);
     $pattern = $pattern = '/\\"\\s?false\\s?\\"\\^\\^\\<' . $xsd . 'boolean\\>|\'\\s?false\\s?\'\\^\\^xsd:boolean/';
     $evalString = preg_replace($pattern, "false", $evalString);
     // replace xsd:date expressions
     $pattern = "/\"(.[^\"]*)\"\\^\\^" . $xsd . "dateTime/";
     preg_match_all($pattern, $evalString, $hits);
     foreach ($hits[1] as $dummy) {
         $evalString = preg_replace("/\".[^\"]*\"\\^\\^" . $xsd . "dateTime/", strtotime($dummy), $evalString, 1);
     }
     $evalString = preg_replace("/(\\'\\<" . $xsd . "dateTime\\()(.[^\\)]*\\))\\>\\'/", "dateTime(\$2", $evalString);
     $evalString = preg_replace("/(\\'\\<" . $xsd . "integer\\()(.[^\\)]*\\))\\>\\'/", "integer(\$2", $evalString);
     // tag plain literals
     $evalString = preg_replace("/\"(.[^\"]*)\"([^\\^])|\"(.[^\"]*)\"\$/", "'str_\$1\$3'\$2", $evalString);
     return $evalString;
 }