1*5153720fSfkaag71<?php 2*5153720fSfkaag71/** 3*5153720fSfkaag71 * DokuWiki Plugin stratastorage (Helper Component) 4*5153720fSfkaag71 * 5*5153720fSfkaag71 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 6*5153720fSfkaag71 * @author Brend Wanders <b.wanders@utwente.nl> 7*5153720fSfkaag71 */ 8*5153720fSfkaag71 9*5153720fSfkaag71// must be run within Dokuwiki 10*5153720fSfkaag71if (!defined('DOKU_INC')) die('Meh.'); 11*5153720fSfkaag71 12*5153720fSfkaag71class strata_querytree_visitor { 13*5153720fSfkaag71 /** 14*5153720fSfkaag71 * Visits a triple pattern. 15*5153720fSfkaag71 */ 16*5153720fSfkaag71 function visit_tp(&$tp) { 17*5153720fSfkaag71 } 18*5153720fSfkaag71 19*5153720fSfkaag71 /** 20*5153720fSfkaag71 * Visit a filter pattern. 21*5153720fSfkaag71 */ 22*5153720fSfkaag71 function visit_fp(&$fp) { 23*5153720fSfkaag71 } 24*5153720fSfkaag71 25*5153720fSfkaag71 /** 26*5153720fSfkaag71 * Visit an optional operation. 27*5153720fSfkaag71 */ 28*5153720fSfkaag71 function visit_opt(&$query) { 29*5153720fSfkaag71 $this->dispatch($query['lhs']); 30*5153720fSfkaag71 $this->dispatch($query['rhs']); 31*5153720fSfkaag71 } 32*5153720fSfkaag71 33*5153720fSfkaag71 /** 34*5153720fSfkaag71 * Visit an and operation. 35*5153720fSfkaag71 */ 36*5153720fSfkaag71 function visit_and(&$query) { 37*5153720fSfkaag71 $this->dispatch($query['lhs']); 38*5153720fSfkaag71 $this->dispatch($query['rhs']); 39*5153720fSfkaag71 } 40*5153720fSfkaag71 41*5153720fSfkaag71 /** 42*5153720fSfkaag71 * Visit a filter operation. 43*5153720fSfkaag71 */ 44*5153720fSfkaag71 function visit_filter(&$query) { 45*5153720fSfkaag71 $this->dispatch($query['lhs']); 46*5153720fSfkaag71 foreach($query['rhs'] as &$filter) { 47*5153720fSfkaag71 $this->visit_fp($filter); 48*5153720fSfkaag71 } 49*5153720fSfkaag71 } 50*5153720fSfkaag71 51*5153720fSfkaag71 /** 52*5153720fSfkaag71 * Visit minus operation. 53*5153720fSfkaag71 */ 54*5153720fSfkaag71 function visit_minus(&$query) { 55*5153720fSfkaag71 $this->dispatch($query['lhs']); 56*5153720fSfkaag71 $this->dispatch($query['rhs']); 57*5153720fSfkaag71 58*5153720fSfkaag71 } 59*5153720fSfkaag71 60*5153720fSfkaag71 /** 61*5153720fSfkaag71 * Visit union operation. 62*5153720fSfkaag71 */ 63*5153720fSfkaag71 function visit_union(&$query) { 64*5153720fSfkaag71 $this->dispatch($query['lhs']); 65*5153720fSfkaag71 $this->dispatch($query['rhs']); 66*5153720fSfkaag71 67*5153720fSfkaag71 } 68*5153720fSfkaag71 69*5153720fSfkaag71 /** 70*5153720fSfkaag71 * Visit projection and ordering. 71*5153720fSfkaag71 */ 72*5153720fSfkaag71 function visit_select(&$query) { 73*5153720fSfkaag71 $this->dispatch($query['group']); 74*5153720fSfkaag71 } 75*5153720fSfkaag71 76*5153720fSfkaag71 function dispatch(&$query) { 77*5153720fSfkaag71 switch($query['type']) { 78*5153720fSfkaag71 case 'select': 79*5153720fSfkaag71 return $this->visit_select($query); 80*5153720fSfkaag71 case 'union': 81*5153720fSfkaag71 return $this->visit_union($query); 82*5153720fSfkaag71 case 'minus': 83*5153720fSfkaag71 return $this->visit_minus($query); 84*5153720fSfkaag71 case 'optional': 85*5153720fSfkaag71 return $this->visit_opt($query); 86*5153720fSfkaag71 case 'filter': 87*5153720fSfkaag71 return $this->visit_filter($query); 88*5153720fSfkaag71 case 'triple': 89*5153720fSfkaag71 return $this->visit_tp($query); 90*5153720fSfkaag71 case 'and': 91*5153720fSfkaag71 return $this->visit_and($query); 92*5153720fSfkaag71 default: 93*5153720fSfkaag71 } 94*5153720fSfkaag71 } 95*5153720fSfkaag71 96*5153720fSfkaag71 /** 97*5153720fSfkaag71 * Visits an abstract query tree to SQL. 98*5153720fSfkaag71 */ 99*5153720fSfkaag71 function visit(&$query) { 100*5153720fSfkaag71 $this->dispatch($query); 101*5153720fSfkaag71 } 102*5153720fSfkaag71} 103