xref: /plugin/strata/lib/strata_querytree_visitor.php (revision 5153720fcc1dd2b6e63035d45f7c2bc32e429371)
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