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