danielebarchiesi@4: xPrologue($v); danielebarchiesi@4: foreach (array('Select', 'Construct', 'Describe', 'Ask', 'Insert', 'Delete', 'Load') as $type) { danielebarchiesi@4: $m = 'x' . $type . 'Query'; danielebarchiesi@4: if ((list($r, $v) = $this->$m($v)) && $r) { danielebarchiesi@4: return array($r, $v); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: return array(0, $v); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* +3 */ danielebarchiesi@4: danielebarchiesi@4: function xResultVar($v) { danielebarchiesi@4: $aggregate = ''; danielebarchiesi@4: /* aggregate */ danielebarchiesi@4: if ($sub_r = $this->x('\(?(AVG|COUNT|MAX|MIN|SUM)\s*\(\s*([^\)]+)\)\s+AS\s+([^\s\)]+)\)?', $v)) { danielebarchiesi@4: $aggregate = $sub_r[1]; danielebarchiesi@4: $result_var = $sub_r[3]; danielebarchiesi@4: $v = $sub_r[2] . $sub_r[4]; danielebarchiesi@4: } danielebarchiesi@4: if ($sub_r && (list($sub_r, $sub_v) = $this->xVar($result_var)) && $sub_r) { danielebarchiesi@4: $result_var = $sub_r['value']; danielebarchiesi@4: } danielebarchiesi@4: /* * or var */ danielebarchiesi@4: if ((list($sub_r, $sub_v) = $this->x('\*', $v)) && $sub_r) { danielebarchiesi@4: return array(array('var' => $sub_r['value'], 'aggregate' => $aggregate, 'alias' => $aggregate ? $result_var : ''), $sub_v); danielebarchiesi@4: } danielebarchiesi@4: if ((list($sub_r, $sub_v) = $this->xVar($v)) && $sub_r) { danielebarchiesi@4: return array(array('var' => $sub_r['value'], 'aggregate' => $aggregate, 'alias' => $aggregate ? $result_var : ''), $sub_v); danielebarchiesi@4: } danielebarchiesi@4: return array(0, $v); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* +4 */ danielebarchiesi@4: danielebarchiesi@4: function xLoadQuery($v) { danielebarchiesi@4: if ($sub_r = $this->x('LOAD\s+', $v)) { danielebarchiesi@4: $sub_v = $sub_r[1]; danielebarchiesi@4: if ((list($sub_r, $sub_v) = $this->xIRIref($sub_v)) && $sub_r) { danielebarchiesi@4: $r = array('type' => 'load', 'url' => $sub_r, 'target_graph' => ''); danielebarchiesi@4: if ($sub_r = $this->x('INTO\s+', $sub_v)) { danielebarchiesi@4: $sub_v = $sub_r[1]; danielebarchiesi@4: if ((list($sub_r, $sub_v) = $this->xIRIref($sub_v)) && $sub_r) { danielebarchiesi@4: $r['target_graph'] = $sub_r; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: return array($r, $sub_v); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: return array(0, $v); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* +5 */ danielebarchiesi@4: danielebarchiesi@4: function xInsertQuery($v) { danielebarchiesi@4: if ($sub_r = $this->x('INSERT\s+', $v)) { danielebarchiesi@4: $r = array( danielebarchiesi@4: 'type' => 'insert', danielebarchiesi@4: 'dataset' => array(), danielebarchiesi@4: ); danielebarchiesi@4: $sub_v = $sub_r[1]; danielebarchiesi@4: /* target */ danielebarchiesi@4: if ($sub_r = $this->x('INTO\s+', $sub_v)) { danielebarchiesi@4: $sub_v = $sub_r[1]; danielebarchiesi@4: if ((list($sub_r, $sub_v) = $this->xIRIref($sub_v)) && $sub_r) { danielebarchiesi@4: $r['target_graph'] = $sub_r; danielebarchiesi@4: /* CONSTRUCT keyword, optional */ danielebarchiesi@4: if ($sub_r = $this->x('CONSTRUCT\s+', $sub_v)) { danielebarchiesi@4: $sub_v = $sub_r[1]; danielebarchiesi@4: } danielebarchiesi@4: /* construct template */ danielebarchiesi@4: if ((list($sub_r, $sub_v) = $this->xConstructTemplate($sub_v)) && is_array($sub_r)) { danielebarchiesi@4: $r['construct_triples'] = $sub_r; danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $this->addError('Construct Template not found'); danielebarchiesi@4: return array(0, $v); danielebarchiesi@4: } danielebarchiesi@4: /* dataset */ danielebarchiesi@4: while ((list($sub_r, $sub_v) = $this->xDatasetClause($sub_v)) && $sub_r) { danielebarchiesi@4: $r['dataset'][] = $sub_r; danielebarchiesi@4: } danielebarchiesi@4: /* where */ danielebarchiesi@4: if ((list($sub_r, $sub_v) = $this->xWhereClause($sub_v)) && $sub_r) { danielebarchiesi@4: $r['pattern'] = $sub_r; danielebarchiesi@4: } danielebarchiesi@4: /* solution modifier */ danielebarchiesi@4: if ((list($sub_r, $sub_v) = $this->xSolutionModifier($sub_v)) && $sub_r) { danielebarchiesi@4: $r = array_merge($r, $sub_r); danielebarchiesi@4: } danielebarchiesi@4: return array($r, $sub_v); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: return array(0, $v); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* +6 */ danielebarchiesi@4: danielebarchiesi@4: function xDeleteQuery($v) { danielebarchiesi@4: if ($sub_r = $this->x('DELETE\s+', $v)) { danielebarchiesi@4: $r = array( danielebarchiesi@4: 'type' => 'delete', danielebarchiesi@4: 'target_graphs' => array() danielebarchiesi@4: ); danielebarchiesi@4: $sub_v = $sub_r[1]; danielebarchiesi@4: /* target */ danielebarchiesi@4: do { danielebarchiesi@4: $proceed = false; danielebarchiesi@4: if ($sub_r = $this->x('FROM\s+', $sub_v)) { danielebarchiesi@4: $sub_v = $sub_r[1]; danielebarchiesi@4: if ((list($sub_r, $sub_v) = $this->xIRIref($sub_v)) && $sub_r) { danielebarchiesi@4: $r['target_graphs'][] = $sub_r; danielebarchiesi@4: $proceed = 1; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } while ($proceed); danielebarchiesi@4: /* CONSTRUCT keyword, optional */ danielebarchiesi@4: if ($sub_r = $this->x('CONSTRUCT\s+', $sub_v)) { danielebarchiesi@4: $sub_v = $sub_r[1]; danielebarchiesi@4: } danielebarchiesi@4: /* construct template */ danielebarchiesi@4: if ((list($sub_r, $sub_v) = $this->xConstructTemplate($sub_v)) && is_array($sub_r)) { danielebarchiesi@4: $r['construct_triples'] = $sub_r; danielebarchiesi@4: /* dataset */ danielebarchiesi@4: while ((list($sub_r, $sub_v) = $this->xDatasetClause($sub_v)) && $sub_r) { danielebarchiesi@4: $r['dataset'][] = $sub_r; danielebarchiesi@4: } danielebarchiesi@4: /* where */ danielebarchiesi@4: if ((list($sub_r, $sub_v) = $this->xWhereClause($sub_v)) && $sub_r) { danielebarchiesi@4: $r['pattern'] = $sub_r; danielebarchiesi@4: } danielebarchiesi@4: /* solution modifier */ danielebarchiesi@4: if ((list($sub_r, $sub_v) = $this->xSolutionModifier($sub_v)) && $sub_r) { danielebarchiesi@4: $r = array_merge($r, $sub_r); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: return array($r, $sub_v); danielebarchiesi@4: } danielebarchiesi@4: return array(0, $v); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* +7 */ danielebarchiesi@4: danielebarchiesi@4: function xSolutionModifier($v) { danielebarchiesi@4: $r = array(); danielebarchiesi@4: if ((list($sub_r, $sub_v) = $this->xGroupClause($v)) && $sub_r) { danielebarchiesi@4: $r['group_infos'] = $sub_r; danielebarchiesi@4: } danielebarchiesi@4: if ((list($sub_r, $sub_v) = $this->xOrderClause($sub_v)) && $sub_r) { danielebarchiesi@4: $r['order_infos'] = $sub_r; danielebarchiesi@4: } danielebarchiesi@4: while ((list($sub_r, $sub_v) = $this->xLimitOrOffsetClause($sub_v)) && $sub_r) { danielebarchiesi@4: $r = array_merge($r, $sub_r); danielebarchiesi@4: } danielebarchiesi@4: return ($v == $sub_v) ? array(0, $v) : array($r, $sub_v); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /* +8 */ danielebarchiesi@4: danielebarchiesi@4: function xGroupClause($v) { danielebarchiesi@4: if ($sub_r = $this->x('GROUP BY\s+', $v)) { danielebarchiesi@4: $sub_v = $sub_r[1]; danielebarchiesi@4: $r = array(); danielebarchiesi@4: do { danielebarchiesi@4: $proceed = 0; danielebarchiesi@4: if ((list($sub_r, $sub_v) = $this->xVar($sub_v)) && $sub_r) { danielebarchiesi@4: $r[] = $sub_r; danielebarchiesi@4: $proceed = 1; danielebarchiesi@4: if ($sub_r = $this->x('\,', $sub_v)) { danielebarchiesi@4: $sub_v = $sub_r[1]; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } while ($proceed); danielebarchiesi@4: if (count($r)) { danielebarchiesi@4: return array($r, $sub_v); danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $this->addError('No columns specified in GROUP BY clause.'); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: return array(0, $v); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: }