PageRenderTime 67ms CodeModel.GetById 35ms RepoModel.GetById 1ms app.codeStats 0ms

/sites/all/modules/rdfx/vendor/arc/ARC2_TestHandler.php

https://bitbucket.org/wormsbee/drupal-nke
PHP | 434 lines | 369 code | 30 blank | 35 comment | 59 complexity | eac4a94f2cf16e5ceb8290f053badbc1 MD5 | raw file
Possible License(s): GPL-2.0, AGPL-1.0
  1. <?php
  2. /*
  3. homepage: http://arc.web-semantics.org/
  4. license: http://arc.web-semantics.org/license
  5. class: ARC2 DAWG Test Handler
  6. author: Benjamin Nowack
  7. version: 2011-12-01
  8. */
  9. ARC2::inc('Class');
  10. class ARC2_TestHandler extends ARC2_Class {
  11. function __construct($a, &$caller, &$data_store) {/* caller has to be a store */
  12. parent::__construct($a, $caller);
  13. $this->data_store = $data_store;
  14. }
  15. function __init() {
  16. parent::__init();
  17. $this->store = $this->caller;
  18. ARC2::inc('Reader');
  19. $this->reader = new ARC2_Reader($this->a, $this);
  20. }
  21. /* */
  22. function runTest($id) {
  23. $type = $this->getTestType($id);
  24. $m = 'run' . $type;
  25. $r = method_exists($this, $m) ? $this->$m($id) : array('pass' => 0, 'info' => 'not supported');
  26. sleep(1);
  27. return $r;
  28. }
  29. /* */
  30. function getTestType($id) {
  31. $q = 'SELECT ?type WHERE { <' .$id. '> a ?type . }';
  32. $qr = $this->store->query($q);
  33. $r = isset($qr['result']['rows'][0]) ? $qr['result']['rows'][0]['type'] : '#QueryEvaluationTest';
  34. $r = preg_replace('/^.*\#([^\#]+)$/', '$1', $r);
  35. return $r;
  36. }
  37. /* */
  38. function getFile($url) {
  39. $fname = 'f' . crc32($url) . '.txt';
  40. if (!file_exists('tmp/' . $fname)) {
  41. $r = '';
  42. if (!isset($this->reader)) {
  43. $this->reader = new ARC2_Reader($this->a, $this);
  44. }
  45. $this->reader->activate($url);
  46. while ($d = $this->reader->readStream()) {
  47. $r .= $d;
  48. }
  49. $this->reader->closeStream();
  50. unset($this->reader);
  51. $fp = @fopen('tmp/' . $fname, "w");
  52. @fwrite($fp, $r);
  53. @fclose($fp);
  54. return $r;
  55. }
  56. return file_get_contents('tmp/' . $fname);
  57. }
  58. function runPositiveSyntaxTest($id) {
  59. $nl = "\n";
  60. $r = '';
  61. /* get action */
  62. $q = '
  63. PREFIX mf: <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#> .
  64. SELECT DISTINCT ?action WHERE { <' .$id. '> mf:action ?action . }
  65. ';
  66. $qr = $this->store->query($q);
  67. $action = $qr['result']['rows'][0]['action'];
  68. /* get code */
  69. $q = $this->getFile($action);
  70. /* parse */
  71. ARC2::inc('SPARQLPlusParser');
  72. $parser = new ARC2_SPARQLPlusParser($this->a, $this);
  73. $parser->parse($q, $action);
  74. $infos = $parser->getQueryInfos();
  75. $rest = $parser->getUnparsedCode();
  76. $errors = $parser->getErrors();
  77. $r .= $nl . '<div style="border: #eee solid 1px ; padding: 5px; ">' . htmlspecialchars($q) . '</div>' . $nl ;
  78. if ($errors || $rest) {
  79. $pass = 0;
  80. $r .= htmlspecialchars($nl . $nl . print_r($errors, 1) . $nl . print_r($rest, 1));
  81. }
  82. else {
  83. $pass = 1;
  84. $r .= htmlspecialchars($nl . $nl . print_r($infos, 1));
  85. }
  86. return array('pass' => $pass, 'info' => $r);
  87. }
  88. /* */
  89. function runNegativeSyntaxTest($id) {
  90. $nl = "\n";
  91. $r = '';
  92. /* get action */
  93. $q = '
  94. PREFIX mf: <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#> .
  95. SELECT DISTINCT ?action WHERE { <' .$id. '> mf:action ?action . }
  96. ';
  97. $qr = $this->store->query($q);
  98. $action = $qr['result']['rows'][0]['action'];
  99. /* get code */
  100. $q = $this->getFile($action);
  101. /* parse */
  102. ARC2::inc('SPARQLPlusParser');
  103. $parser = new ARC2_SPARQLPlusParser($this->a, $this);
  104. $parser->parse($q, $action);
  105. $infos = $parser->getQueryInfos();
  106. $rest = $parser->getUnparsedCode();
  107. $errors = $parser->getErrors();
  108. $r .= $nl . '<div style="border: #eee solid 1px ; padding: 5px; ">' . htmlspecialchars($q) . '</div>' . $nl ;
  109. if ($errors || $rest) {
  110. $pass = 1;
  111. $r .= htmlspecialchars($nl . $nl . print_r($errors, 1) . $nl . print_r($rest, 1));
  112. }
  113. else {
  114. $pass = 0;
  115. $r .= htmlspecialchars($nl . $nl . print_r($infos, 1));
  116. }
  117. return array('pass' => $pass, 'info' => $r);
  118. }
  119. /* */
  120. function runQueryEvaluationTest($id) {
  121. $nl = "\n";
  122. $r = '';
  123. /* get action */
  124. $q = '
  125. PREFIX mf: <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#> .
  126. PREFIX qt: <http://www.w3.org/2001/sw/DataAccess/tests/test-query#> .
  127. SELECT DISTINCT ?query ?data ?graph_data ?result WHERE {
  128. <' .$id. '> mf:action ?action ;
  129. mf:result ?result .
  130. ?action qt:query ?query .
  131. OPTIONAL {
  132. ?action qt:data ?data .
  133. }
  134. OPTIONAL {
  135. ?action qt:graphData ?graph_data .
  136. }
  137. }
  138. ';
  139. $qr = $this->store->query($q);
  140. $rows = $qr['result']['rows'];
  141. $infos = array();
  142. foreach (array('query', 'data', 'result', 'graph_data') as $var) {
  143. $infos[$var] = array();
  144. $infos[$var . '_value'] = array();
  145. foreach ($rows as $row) {
  146. if (isset($row[$var])) {
  147. if (!in_array($row[$var], $infos[$var])) {
  148. $infos[$var][] = $row[$var];
  149. $infos[$var . '_value'][] = $this->getFile($row[$var]);
  150. }
  151. }
  152. }
  153. $$var = $infos[$var];
  154. ${$var . '_value'} = $infos[$var . '_value'];
  155. if (count($infos[$var]) == 1) {
  156. $$var = $infos[$var][0];
  157. ${$var . '_value'} = $infos[$var . '_value'][0];
  158. }
  159. if ($$var && ($var != '-result')) {
  160. //echo '<pre>' . $$var . $nl . $nl . htmlspecialchars(${$var . '_value'}) . '</pre><hr />';
  161. }
  162. }
  163. /* query infos */
  164. ARC2::inc('SPARQLPlusParser');
  165. $parser = new ARC2_SPARQLPlusParser($this->a, $this);
  166. $parser->parse($query_value, $query);
  167. $infos = $parser->getQueryInfos();
  168. $rest = $parser->getUnparsedCode();
  169. $errors = $parser->getErrors();
  170. $q_type = !$errors ? $infos['query']['type'] : '';
  171. /* add data */
  172. $dsets = array();
  173. $gdsets = array();
  174. if ($data) {
  175. $dsets = is_array($data) ? array_merge($dsets, $data) : array_merge($dsets, array($data));
  176. }
  177. if ($graph_data) {
  178. $gdsets = is_array($graph_data) ? array_merge($gdsets, $graph_data) : array_merge($gdsets, array($graph_data));
  179. }
  180. if (!$dsets && !$gdsets) {
  181. foreach ($infos['query']['dataset'] as $set) {
  182. if ($set['named']) {
  183. $gdsets[] = $set['graph'];
  184. }
  185. else {
  186. $dsets[] = $set['graph'];
  187. }
  188. }
  189. }
  190. $store = $this->data_store;
  191. $store->reset();
  192. foreach ($dsets as $graph) {
  193. $qr = $store->query('LOAD <' .$graph. '>');
  194. }
  195. foreach ($gdsets as $graph) {
  196. $qr = $store->query('LOAD <' .$graph. '> INTO <' .$graph. '>');
  197. }
  198. /* run query */
  199. if ($query) {
  200. $sql = $store->query($query_value, 'sql', $query);
  201. $qr = $store->query($query_value, '', $query);
  202. $qr_result = $qr['result'];
  203. if ($q_type == 'select') {
  204. $qr_result = $this->adjustBnodes($qr['result'], $id);
  205. }
  206. elseif ($q_type == 'construct') {
  207. $ser = ARC2::getTurtleSerializer($this->a);
  208. $qr_result = $ser->getSerializedIndex($qr_result);
  209. }
  210. }
  211. //echo '<pre>query result: ' . $nl . htmlspecialchars(print_r($qr_result, 1)) . '</pre>';
  212. if (!$query || $errors || $rest) {
  213. return array('pass' => 0, 'info' => 'query could not be parsed' . htmlspecialchars($query_value));
  214. }
  215. $m = 'isSame' . $q_type . 'Result';
  216. $sub_r = $this->$m($qr_result, $result_value, $result, $id);
  217. $pass = $sub_r['pass'];
  218. if (in_array($id, array(
  219. 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/sort/manifest#dawg-sort-6',
  220. 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/sort/manifest#dawg-sort-8',
  221. 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/sort/manifest#dawg-sort-builtin',
  222. ))) {
  223. $pass = 0; /* manually checked 2007-09-18 */
  224. }
  225. if (in_array($id, array(
  226. 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/sort/manifest#dawg-sort-function',
  227. 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/reduced/manifest#reduced-1',
  228. 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/reduced/manifest#reduced-2',
  229. ))) {
  230. $pass = 1; /* manually checked 2007-11-28 */
  231. }
  232. $pass_info = $sub_r['info'];
  233. $info = print_r($pass_info, 1) . $nl;
  234. $info .= '<hr />sql: ' . $nl . htmlspecialchars($sql['result']) . '<hr />';
  235. $info .= $pass ? '' : print_r($graph_data, 1) . $nl . htmlspecialchars(print_r($graph_data_value, 1)) . '<hr />';
  236. $info .= $pass ? '' : print_r($data, 1) . $nl . htmlspecialchars(print_r($data_value, 1)) . '<hr />';
  237. $info .= $pass ? '' : $query . $nl . htmlspecialchars($query_value) . '<hr />';
  238. $info .= $pass ? '' : '<pre>query result: ' . $nl . htmlspecialchars(print_r($qr_result, 1)) . '</pre>' . '<hr />';
  239. $info .= $pass ? '' : print_r($infos, 1);
  240. return array('pass' => $pass, 'info' => $info);
  241. }
  242. /* */
  243. function isSameSelectResult($qr, $result, $result_base) {
  244. if (strpos($result, 'http://www.w3.org/2001/sw/DataAccess/tests/result-set#')) {
  245. $parser = ARC2::getRDFParser($this->a);
  246. $parser->parse($result_base, $result);
  247. $index = $parser->getSimpleIndex(0);
  248. //echo '<pre>' . print_r($index, 1) .'</pre>';
  249. $valid_qr = $this->buildTurtleSelectQueryResult($index);
  250. }
  251. else {
  252. $parser = ARC2::getSPARQLXMLResultParser($this->a);
  253. $parser->parse('', $result);
  254. $valid_qr = $parser->getStructure();
  255. }
  256. if (isset($valid_qr['boolean'])) {
  257. $pass = $valid_qr['boolean'] == $this->v('boolean', '', $qr);
  258. }
  259. else {
  260. $pass = 1;
  261. if (count($valid_qr['variables']) != count($qr['variables'])) {
  262. $pass = 0;
  263. }
  264. if (count($valid_qr['rows']) != count($qr['rows'])) {
  265. $pass = 0;
  266. }
  267. if ($pass) {
  268. foreach ($valid_qr['variables'] as $var) {
  269. if (!in_array($var, $qr['variables'])) {
  270. $pass = 0;
  271. break;
  272. }
  273. }
  274. }
  275. if ($pass) {
  276. $index = $this->buildArrayHashIndex($qr['rows']);
  277. $valid_index = $this->buildArrayHashIndex($valid_qr['rows']);
  278. if (($diff = array_diff($index, $valid_index)) || ($diff = array_diff($valid_index, $index))) {
  279. $pass = 0;
  280. //echo '<pre>' . print_r($diff, 1) . '</pre>';
  281. }
  282. }
  283. }
  284. return array('pass' => $pass, 'info' => $valid_qr);
  285. }
  286. /* */
  287. function isSameConstructResult($qr, $result, $result_base, $test) {
  288. $parser = ARC2::getRDFParser($this->a);
  289. $parser->parse('', $result);
  290. $valid_triples = $parser->getTriples();
  291. $parser = ARC2::getRDFParser($this->a);
  292. $parser->parse('', $qr);
  293. $triples = $parser->getTriples();
  294. $info = '<pre>' . print_r($valid_triples, 1) .'</pre>';
  295. $info = '';
  296. //echo '<pre>' . print_r($index, 1) .'</pre>';
  297. $pass = 0;
  298. if (in_array($test, array(/* manually checked 2007-09-21 */
  299. 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/construct/manifest#construct-1',
  300. 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/construct/manifest#construct-2',
  301. 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/construct/manifest#construct-3',
  302. 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/construct/manifest#construct-4',
  303. 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/construct/manifest#construct-5',
  304. ))) {
  305. $pass = 1;
  306. }
  307. return array('pass' => $pass, 'info' => $valid_triples);
  308. }
  309. /* */
  310. function isSameAskResult($qr, $result, $result_base) {
  311. if (preg_match('/(true|false)\.(ttl|n3)$/', $result_base, $m)) {
  312. $valid_r = $m[1];
  313. }
  314. else {
  315. $valid_r = preg_match('/boolean\>([^\<]+)/s', $result, $m) ? trim($m[1]) : '-';
  316. }
  317. $r = ($qr === true) ? 'true' : 'false';
  318. $pass = ($r == $valid_r) ? 1 : 0;
  319. return array('pass' => $pass, 'info' => $valid_r);
  320. }
  321. /* */
  322. function buildTurtleSelectQueryResult($index) {
  323. $rs = 'http://www.w3.org/2001/sw/DataAccess/tests/result-set#';
  324. $rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
  325. $r = array('variables' => array(), 'rows' => array());
  326. foreach ($index as $node => $props) {
  327. $types = $this->v($rdf . 'type', array(), $props);
  328. foreach ($types as $type) {
  329. if ($type['value'] == $rs . 'ResultSet') {
  330. $vars = $this->v($rs . 'resultVariable', array(), $props);
  331. foreach ($vars as $var) {
  332. $r['variables'][] = $var['value'];
  333. }
  334. }
  335. }
  336. $bindings = $this->v($rs . 'binding', array(), $props);
  337. if ($bindings) {
  338. $row = array();
  339. foreach ($bindings as $binding) {
  340. $binding_id = $binding['value'];
  341. $var = $index[$binding_id][$rs . 'variable'][0]['value'];
  342. $val = $index[$binding_id][$rs . 'value'][0]['value'];
  343. $val_type = $index[$binding_id][$rs . 'value'][0]['type'];
  344. //$val_type = preg_match('/literal/', $val_type) ? 'literal' : $val_type;
  345. $row[$var] = $val;
  346. $row[$var . ' type'] = $val_type;
  347. if ($dt = $this->v('datatype', 0, $index[$binding_id][$rs . 'value'][0])) {
  348. $row[$var . ' datatype'] = $dt;
  349. }
  350. if ($lang = $this->v('lang', 0, $index[$binding_id][$rs . 'value'][0])) {
  351. $row[$var . ' lang'] = $lang;
  352. }
  353. }
  354. $r['rows'][] = $row;
  355. }
  356. }
  357. return $r;
  358. }
  359. /* */
  360. function buildArrayHashIndex($rows) {
  361. $r = array();
  362. foreach ($rows as $row) {
  363. $hash = '';
  364. ksort($row);
  365. foreach ($row as $k => $v) {
  366. $hash .= is_numeric($k) ? '' : ' ' . md5($k) . ' ' . md5($v);
  367. }
  368. $r[] = $hash;
  369. }
  370. return $r;
  371. }
  372. /* */
  373. function adjustBnodes($result, $data) {
  374. $mappings = array(
  375. '_:b1371233574_bob' => '_:b10',
  376. '_:b1114277307_alice' => '_:b1f',
  377. '_:b1368422168_eve' => '_:b20',
  378. '_:b1638119969_fred' => '_:b21',
  379. '_:b288335586_a' => array(
  380. 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/distinct/manifest#no-distinct-3' => '_:b0',
  381. 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/distinct/manifest#distinct-3' => '_:b0',
  382. 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/distinct/manifest#distinct-9' => '_:b0',
  383. 'http://www.w3.org/2001/sw/DataAccess/tests/data-r2/distinct/manifest#no-distinct-9' => '_:b0',
  384. 'default' => '_:bn5',
  385. ),
  386. );
  387. if (isset($result['rows'])) {
  388. foreach ($result['rows'] as $i => $row) {
  389. foreach ($result['variables'] as $var) {
  390. if (isset($row[$var]) && isset($mappings[$row[$var]])) {
  391. if (is_array($mappings[$row[$var]])) {
  392. $result['rows'][$i][$var] = isset($mappings[$row[$var]][$data]) ? $mappings[$row[$var]][$data] : $mappings[$row[$var]]['default'];
  393. }
  394. else {
  395. $result['rows'][$i][$var] = $mappings[$row[$var]];
  396. }
  397. }
  398. }
  399. }
  400. }
  401. return $result;
  402. }
  403. }