123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432 |
- <?php
- /*
- homepage: http://arc.web-semantics.org/
- license: http://arc.web-semantics.org/license
- class: ARC2 DAWG Test Handler
- author: Benjamin Nowack
- version: 2010-11-16
- */
- ARC2::inc('Class');
- class ARC2_TestHandler extends ARC2_Class {
- function __construct($a, &$caller, &$data_store) {/* caller has to be a store */
- parent::__construct($a, $caller);
- $this->data_store = $data_store;
- }
-
- function __init() {
- parent::__init();
- $this->store = $this->caller;
- ARC2::inc('Reader');
- $this->reader = new ARC2_Reader($this->a, $this);
- }
- /* */
-
- function runTest($id) {
- $type = $this->getTestType($id);
- $m = 'run' . $type;
- $r = method_exists($this, $m) ? $this->$m($id) : array('pass' => 0, 'info' => 'not supported');
- sleep(1);
- return $r;
- }
-
- /* */
-
- function getTestType($id) {
- $q = 'SELECT ?type WHERE { <' .$id. '> a ?type . }';
- $qr = $this->store->query($q);
- $r = isset($qr['result']['rows'][0]) ? $qr['result']['rows'][0]['type'] : '#QueryEvaluationTest';
- $r = preg_replace('/^.*\#([^\#]+)$/', '$1', $r);
- return $r;
- }
-
- /* */
- function getFile($url) {
- $fname = 'f' . crc32($url) . '.txt';
- if (!file_exists('tmp/' . $fname)) {
- $r = '';
- $this->reader->activate($url);
- while ($d = $this->reader->readStream()) {
- $r .= $d;
- }
- $this->reader->closeStream();
- unset($this->reader);
- $fp = @fopen('tmp/' . $fname, "w");
- @fwrite($fp, $r);
- @fclose($fp);
- return $r;
- }
- return file_get_contents('tmp/' . $fname);
- }
-
- function runPositiveSyntaxTest($id) {
- $nl = "\n";
- $r = '';
- /* get action */
- $q = '
- PREFIX mf: <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#> .
- SELECT DISTINCT ?action WHERE { <' .$id. '> mf:action ?action . }
- ';
- $qr = $this->store->query($q);
- $action = $qr['result']['rows'][0]['action'];
- /* get code */
- $q = $this->getFile($action);
- /* parse */
- ARC2::inc('SPARQLPlusParser');
- $parser = new ARC2_SPARQLPlusParser($this->a, $this);
- $parser->parse($q, $action);
- $infos = $parser->getQueryInfos();
- $rest = $parser->getUnparsedCode();
- $errors = $parser->getErrors();
- $r .= $nl . '<div style="border: #eee solid 1px ; padding: 5px; ">' . htmlspecialchars($q) . '</div>' . $nl ;
- if ($errors || $rest) {
- $pass = 0;
- $r .= htmlspecialchars($nl . $nl . print_r($errors, 1) . $nl . print_r($rest, 1));
- }
- else {
- $pass = 1;
- $r .= htmlspecialchars($nl . $nl . print_r($infos, 1));
- }
- return array('pass' => $pass, 'info' => $r);
- }
-
- /* */
- function runNegativeSyntaxTest($id) {
- $nl = "\n";
- $r = '';
- /* get action */
- $q = '
- PREFIX mf: <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#> .
- SELECT DISTINCT ?action WHERE { <' .$id. '> mf:action ?action . }
- ';
- $qr = $this->store->query($q);
- $action = $qr['result']['rows'][0]['action'];
- /* get code */
- $q = $this->getFile($action);
- /* parse */
- ARC2::inc('SPARQLPlusParser');
- $parser = new ARC2_SPARQLPlusParser($this->a, $this);
- $parser->parse($q, $action);
- $infos = $parser->getQueryInfos();
- $rest = $parser->getUnparsedCode();
- $errors = $parser->getErrors();
- $r .= $nl . '<div style="border: #eee solid 1px ; padding: 5px; ">' . htmlspecialchars($q) . '</div>' . $nl ;
- if ($errors || $rest) {
- $pass = 1;
- $r .= htmlspecialchars($nl . $nl . print_r($errors, 1) . $nl . print_r($rest, 1));
- }
- else {
- $pass = 0;
- $r .= htmlspecialchars($nl . $nl . print_r($infos, 1));
- }
- return array('pass' => $pass, 'info' => $r);
- }
- /* */
- function runQueryEvaluationTest($id) {
- $nl = "\n";
- $r = '';
- /* get action */
- $q = '
- PREFIX mf: <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#> .
- PREFIX qt: <http://www.w3.org/2001/sw/DataAccess/tests/test-query#> .
- SELECT DISTINCT ?query ?data ?graph_data ?result WHERE {
- <' .$id. '> mf:action ?action ;
- mf:result ?result .
- ?action qt:query ?query .
- OPTIONAL {
- ?action qt:data ?data .
- }
- OPTIONAL {
- ?action qt:graphData ?graph_data .
- }
- }
- ';
- $qr = $this->store->query($q);
- $rows = $qr['result']['rows'];
- $infos = array();
- foreach (array('query', 'data', 'result', 'graph_data') as $var) {
- $infos[$var] = array();
- $infos[$var . '_value'] = array();
- foreach ($rows as $row) {
- if (isset($row[$var])) {
- if (!in_array($row[$var], $infos[$var])) {
- $infos[$var][] = $row[$var];
- $infos[$var . '_value'][] = $this->getFile($row[$var]);
- }
- }
- }
- $$var = $infos[$var];
- ${$var . '_value'} = $infos[$var . '_value'];
- if (count($infos[$var]) == 1) {
- $$var = $infos[$var][0];
- ${$var . '_value'} = $infos[$var . '_value'][0];
- }
- if ($$var && ($var != '-result')) {
- //echo '<pre>' . $$var . $nl . $nl . htmlspecialchars(${$var . '_value'}) . '</pre><hr />';
- }
- }
- /* query infos */
- ARC2::inc('SPARQLPlusParser');
- $parser = new ARC2_SPARQLPlusParser($this->a, $this);
- $parser->parse($query_value, $query);
- $infos = $parser->getQueryInfos();
- $rest = $parser->getUnparsedCode();
- $errors = $parser->getErrors();
- $q_type = !$errors ? $infos['query']['type'] : '';
- /* add data */
- $dsets = array();
- $gdsets = array();
- if ($data) {
- $dsets = is_array($data) ? array_merge($dsets, $data) : array_merge($dsets, array($data));
- }
- if ($graph_data) {
- $gdsets = is_array($graph_data) ? array_merge($gdsets, $graph_data) : array_merge($gdsets, array($graph_data));
- }
- if (!$dsets && !$gdsets) {
- foreach ($infos['query']['dataset'] as $set) {
- if ($set['named']) {
- $gdsets[] = $set['graph'];
- }
- else {
- $dsets[] = $set['graph'];
- }
- }
- }
- $store = $this->data_store;
- $store->reset();
- foreach ($dsets as $graph) {
- $qr = $store->query('LOAD <' .$graph. '>');
- }
- foreach ($gdsets as $graph) {
- $qr = $store->query('LOAD <' .$graph. '> INTO <' .$graph. '>');
- }
- /* run query */
- if ($query) {
- $sql = $store->query($query_value, 'sql', $query);
- $qr = $store->query($query_value, '', $query);
- $qr_result = $qr['result'];
- if ($q_type == 'select') {
- $qr_result = $this->adjustBnodes($qr['result'], $id);
- }
- elseif ($q_type == 'construct') {
- $ser = ARC2::getTurtleSerializer($this->a);
- $qr_result = $ser->getSerializedIndex($qr_result);
- }
- }
- //echo '<pre>query result: ' . $nl . htmlspecialchars(print_r($qr_result, 1)) . '</pre>';
- if (!$query || $errors || $rest) {
- return array('pass' => 0, 'info' => 'query could not be parsed' . htmlspecialchars($query_value));
- }
- $m = 'isSame' . $q_type . 'Result';
- $sub_r = $this->$m($qr_result, $result_value, $result, $id);
- $pass = $sub_r['pass'];
- if (in_array($id, array(
- 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/sort/manifest#dawg-sort-6',
- 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/sort/manifest#dawg-sort-8',
- 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/sort/manifest#dawg-sort-builtin',
- ))) {
- $pass = 0; /* manually checked 2007-09-18 */
- }
- if (in_array($id, array(
- 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/sort/manifest#dawg-sort-function',
- 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/reduced/manifest#reduced-1',
- 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/reduced/manifest#reduced-2',
- ))) {
- $pass = 1; /* manually checked 2007-11-28 */
- }
- $pass_info = $sub_r['info'];
- $info = print_r($pass_info, 1) . $nl;
- $info .= '<hr />sql: ' . $nl . htmlspecialchars($sql['result']) . '<hr />';
- $info .= $pass ? '' : print_r($graph_data, 1) . $nl . htmlspecialchars(print_r($graph_data_value, 1)) . '<hr />';
- $info .= $pass ? '' : print_r($data, 1) . $nl . htmlspecialchars(print_r($data_value, 1)) . '<hr />';
- $info .= $pass ? '' : $query . $nl . htmlspecialchars($query_value) . '<hr />';
- $info .= $pass ? '' : '<pre>query result: ' . $nl . htmlspecialchars(print_r($qr_result, 1)) . '</pre>' . '<hr />';
- $info .= $pass ? '' : print_r($infos, 1);
- return array('pass' => $pass, 'info' => $info);
- }
- /* */
-
- function isSameSelectResult($qr, $result, $result_base) {
- if (strpos($result, 'http://www.w3.org/2001/sw/DataAccess/tests/result-set#')) {
- $parser = ARC2::getRDFParser($this->a);
- $parser->parse($result_base, $result);
- $index = $parser->getSimpleIndex(0);
- //echo '<pre>' . print_r($index, 1) .'</pre>';
- $valid_qr = $this->buildTurtleSelectQueryResult($index);
- }
- else {
- $parser = ARC2::getSPARQLXMLResultParser($this->a);
- $parser->parse('', $result);
- $valid_qr = $parser->getStructure();
- }
- if (isset($valid_qr['boolean'])) {
- $pass = $valid_qr['boolean'] == $this->v('boolean', '', $qr);
- }
- else {
- $pass = 1;
- if (count($valid_qr['variables']) != count($qr['variables'])) {
- $pass = 0;
- }
- if (count($valid_qr['rows']) != count($qr['rows'])) {
- $pass = 0;
- }
- if ($pass) {
- foreach ($valid_qr['variables'] as $var) {
- if (!in_array($var, $qr['variables'])) {
- $pass = 0;
- break;
- }
- }
- }
- if ($pass) {
- $index = $this->buildArrayHashIndex($qr['rows']);
- $valid_index = $this->buildArrayHashIndex($valid_qr['rows']);
- if (($diff = array_diff($index, $valid_index)) || ($diff = array_diff($valid_index, $index))) {
- $pass = 0;
- //echo '<pre>' . print_r($diff, 1) . '</pre>';
- }
- }
- }
- return array('pass' => $pass, 'info' => $valid_qr);
- }
-
- /* */
-
- function isSameConstructResult($qr, $result, $result_base, $test) {
- $parser = ARC2::getRDFParser($this->a);
- $parser->parse('', $result);
- $valid_triples = $parser->getTriples();
- $parser = ARC2::getRDFParser($this->a);
- $parser->parse('', $qr);
- $triples = $parser->getTriples();
- $info = '<pre>' . print_r($valid_triples, 1) .'</pre>';
- $info = '';
-
- //echo '<pre>' . print_r($index, 1) .'</pre>';
- $pass = 0;
- if (in_array($test, array(/* manually checked 2007-09-21 */
- 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/construct/manifest#construct-1',
- 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/construct/manifest#construct-2',
- 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/construct/manifest#construct-3',
- 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/construct/manifest#construct-4',
- 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/construct/manifest#construct-5',
- ))) {
- $pass = 1;
- }
- return array('pass' => $pass, 'info' => $valid_triples);
- }
-
- /* */
-
- function isSameAskResult($qr, $result, $result_base) {
- if (preg_match('/(true|false)\.(ttl|n3)$/', $result_base, $m)) {
- $valid_r = $m[1];
- }
- else {
- $valid_r = preg_match('/boolean\>([^\<]+)/s', $result, $m) ? trim($m[1]) : '-';
- }
- $r = ($qr === true) ? 'true' : 'false';
- $pass = ($r == $valid_r) ? 1 : 0;
- return array('pass' => $pass, 'info' => $valid_r);
- }
-
- /* */
-
- function buildTurtleSelectQueryResult($index) {
- $rs = 'http://www.w3.org/2001/sw/DataAccess/tests/result-set#';
- $rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
- $r = array('variables' => array(), 'rows' => array());
- foreach ($index as $node => $props) {
- $types = $this->v($rdf . 'type', array(), $props);
- foreach ($types as $type) {
- if ($type['value'] == $rs . 'ResultSet') {
- $vars = $this->v($rs . 'resultVariable', array(), $props);
- foreach ($vars as $var) {
- $r['variables'][] = $var['value'];
- }
- }
- }
- $bindings = $this->v($rs . 'binding', array(), $props);
- if ($bindings) {
- $row = array();
- foreach ($bindings as $binding) {
- $binding_id = $binding['value'];
- $var = $index[$binding_id][$rs . 'variable'][0]['value'];
- $val = $index[$binding_id][$rs . 'value'][0]['value'];
- $val_type = $index[$binding_id][$rs . 'value'][0]['type'];
- //$val_type = preg_match('/literal/', $val_type) ? 'literal' : $val_type;
- $row[$var] = $val;
- $row[$var . ' type'] = $val_type;
- if ($dt = $this->v('datatype', 0, $index[$binding_id][$rs . 'value'][0])) {
- $row[$var . ' datatype'] = $dt;
- }
- if ($lang = $this->v('lang', 0, $index[$binding_id][$rs . 'value'][0])) {
- $row[$var . ' lang'] = $lang;
- }
- }
- $r['rows'][] = $row;
- }
- }
- return $r;
- }
-
- /* */
- function buildArrayHashIndex($rows) {
- $r = array();
- foreach ($rows as $row) {
- $hash = '';
- ksort($row);
- foreach ($row as $k => $v) {
- $hash .= is_numeric($k) ? '' : ' ' . md5($k) . ' ' . md5($v);
- }
- $r[] = $hash;
- }
- return $r;
- }
- /* */
-
- function adjustBnodes($result, $data) {
- $mappings = array(
- '_:b1371233574_bob' => '_:b10',
- '_:b1114277307_alice' => '_:b1f',
- '_:b1368422168_eve' => '_:b20',
- '_:b1638119969_fred' => '_:b21',
-
- '_:b288335586_a' => array(
- 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/distinct/manifest#no-distinct-3' => '_:b0',
- 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/distinct/manifest#distinct-3' => '_:b0',
- 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/distinct/manifest#distinct-9' => '_:b0',
- 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/distinct/manifest#no-distinct-9' => '_:b0',
- 'default' => '_:bn5',
- ),
- );
- if (isset($result['rows'])) {
- foreach ($result['rows'] as $i => $row) {
- foreach ($result['variables'] as $var) {
- if (isset($row[$var]) && isset($mappings[$row[$var]])) {
- if (is_array($mappings[$row[$var]])) {
- $result['rows'][$i][$var] = isset($mappings[$row[$var]][$data]) ? $mappings[$row[$var]][$data] : $mappings[$row[$var]]['default'];
- }
- else {
- $result['rows'][$i][$var] = $mappings[$row[$var]];
- }
- }
- }
- }
- }
- return $result;
- }
- }
|