Mercurial > hg > rr-repo
diff sites/all/libraries/ARC2/arc/parsers/ARC2_SPARQLPlusParser.php @ 4:ce11bbd8f642
added modules
author | danieleb <danielebarchiesi@me.com> |
---|---|
date | Thu, 19 Sep 2013 10:38:44 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sites/all/libraries/ARC2/arc/parsers/ARC2_SPARQLPlusParser.php Thu Sep 19 10:38:44 2013 +0100 @@ -0,0 +1,210 @@ +<?php +/* +homepage: http://arc.semsol.org/ +license: http://arc.semsol.org/license + +class: ARC2 SPARQL+ Parser (SPARQL + Aggregates + LOAD + INSERT + DELETE) +author: Benjamin Nowack +version: 2010-11-16 +*/ + +ARC2::inc('SPARQLParser'); + +class ARC2_SPARQLPlusParser extends ARC2_SPARQLParser { + + function __construct($a, &$caller) { + parent::__construct($a, $caller); + } + + function __init() { + parent::__init(); + } + + /* +1 */ + + function xQuery($v) { + list($r, $v) = $this->xPrologue($v); + foreach (array('Select', 'Construct', 'Describe', 'Ask', 'Insert', 'Delete', 'Load') as $type) { + $m = 'x' . $type . 'Query'; + if ((list($r, $v) = $this->$m($v)) && $r) { + return array($r, $v); + } + } + return array(0, $v); + } + + /* +3 */ + + function xResultVar($v) { + $aggregate = ''; + /* aggregate */ + if ($sub_r = $this->x('\(?(AVG|COUNT|MAX|MIN|SUM)\s*\(\s*([^\)]+)\)\s+AS\s+([^\s\)]+)\)?', $v)) { + $aggregate = $sub_r[1]; + $result_var = $sub_r[3]; + $v = $sub_r[2] . $sub_r[4]; + } + if ($sub_r && (list($sub_r, $sub_v) = $this->xVar($result_var)) && $sub_r) { + $result_var = $sub_r['value']; + } + /* * or var */ + if ((list($sub_r, $sub_v) = $this->x('\*', $v)) && $sub_r) { + return array(array('var' => $sub_r['value'], 'aggregate' => $aggregate, 'alias' => $aggregate ? $result_var : ''), $sub_v); + } + if ((list($sub_r, $sub_v) = $this->xVar($v)) && $sub_r) { + return array(array('var' => $sub_r['value'], 'aggregate' => $aggregate, 'alias' => $aggregate ? $result_var : ''), $sub_v); + } + return array(0, $v); + } + + /* +4 */ + + function xLoadQuery($v) { + if ($sub_r = $this->x('LOAD\s+', $v)) { + $sub_v = $sub_r[1]; + if ((list($sub_r, $sub_v) = $this->xIRIref($sub_v)) && $sub_r) { + $r = array('type' => 'load', 'url' => $sub_r, 'target_graph' => ''); + if ($sub_r = $this->x('INTO\s+', $sub_v)) { + $sub_v = $sub_r[1]; + if ((list($sub_r, $sub_v) = $this->xIRIref($sub_v)) && $sub_r) { + $r['target_graph'] = $sub_r; + } + } + return array($r, $sub_v); + } + } + return array(0, $v); + } + + /* +5 */ + + function xInsertQuery($v) { + if ($sub_r = $this->x('INSERT\s+', $v)) { + $r = array( + 'type' => 'insert', + 'dataset' => array(), + ); + $sub_v = $sub_r[1]; + /* target */ + if ($sub_r = $this->x('INTO\s+', $sub_v)) { + $sub_v = $sub_r[1]; + if ((list($sub_r, $sub_v) = $this->xIRIref($sub_v)) && $sub_r) { + $r['target_graph'] = $sub_r; + /* CONSTRUCT keyword, optional */ + if ($sub_r = $this->x('CONSTRUCT\s+', $sub_v)) { + $sub_v = $sub_r[1]; + } + /* construct template */ + if ((list($sub_r, $sub_v) = $this->xConstructTemplate($sub_v)) && is_array($sub_r)) { + $r['construct_triples'] = $sub_r; + } + else { + $this->addError('Construct Template not found'); + return array(0, $v); + } + /* dataset */ + while ((list($sub_r, $sub_v) = $this->xDatasetClause($sub_v)) && $sub_r) { + $r['dataset'][] = $sub_r; + } + /* where */ + if ((list($sub_r, $sub_v) = $this->xWhereClause($sub_v)) && $sub_r) { + $r['pattern'] = $sub_r; + } + /* solution modifier */ + if ((list($sub_r, $sub_v) = $this->xSolutionModifier($sub_v)) && $sub_r) { + $r = array_merge($r, $sub_r); + } + return array($r, $sub_v); + } + } + } + return array(0, $v); + } + + /* +6 */ + + function xDeleteQuery($v) { + if ($sub_r = $this->x('DELETE\s+', $v)) { + $r = array( + 'type' => 'delete', + 'target_graphs' => array() + ); + $sub_v = $sub_r[1]; + /* target */ + do { + $proceed = false; + if ($sub_r = $this->x('FROM\s+', $sub_v)) { + $sub_v = $sub_r[1]; + if ((list($sub_r, $sub_v) = $this->xIRIref($sub_v)) && $sub_r) { + $r['target_graphs'][] = $sub_r; + $proceed = 1; + } + } + } while ($proceed); + /* CONSTRUCT keyword, optional */ + if ($sub_r = $this->x('CONSTRUCT\s+', $sub_v)) { + $sub_v = $sub_r[1]; + } + /* construct template */ + if ((list($sub_r, $sub_v) = $this->xConstructTemplate($sub_v)) && is_array($sub_r)) { + $r['construct_triples'] = $sub_r; + /* dataset */ + while ((list($sub_r, $sub_v) = $this->xDatasetClause($sub_v)) && $sub_r) { + $r['dataset'][] = $sub_r; + } + /* where */ + if ((list($sub_r, $sub_v) = $this->xWhereClause($sub_v)) && $sub_r) { + $r['pattern'] = $sub_r; + } + /* solution modifier */ + if ((list($sub_r, $sub_v) = $this->xSolutionModifier($sub_v)) && $sub_r) { + $r = array_merge($r, $sub_r); + } + } + return array($r, $sub_v); + } + return array(0, $v); + } + + /* +7 */ + + function xSolutionModifier($v) { + $r = array(); + if ((list($sub_r, $sub_v) = $this->xGroupClause($v)) && $sub_r) { + $r['group_infos'] = $sub_r; + } + if ((list($sub_r, $sub_v) = $this->xOrderClause($sub_v)) && $sub_r) { + $r['order_infos'] = $sub_r; + } + while ((list($sub_r, $sub_v) = $this->xLimitOrOffsetClause($sub_v)) && $sub_r) { + $r = array_merge($r, $sub_r); + } + return ($v == $sub_v) ? array(0, $v) : array($r, $sub_v); + } + + /* +8 */ + + function xGroupClause($v) { + if ($sub_r = $this->x('GROUP BY\s+', $v)) { + $sub_v = $sub_r[1]; + $r = array(); + do { + $proceed = 0; + if ((list($sub_r, $sub_v) = $this->xVar($sub_v)) && $sub_r) { + $r[] = $sub_r; + $proceed = 1; + if ($sub_r = $this->x('\,', $sub_v)) { + $sub_v = $sub_r[1]; + } + } + } while ($proceed); + if (count($r)) { + return array($r, $sub_v); + } + else { + $this->addError('No columns specified in GROUP BY clause.'); + } + } + return array(0, $v); + } + +}