xref: /plugin/struct/meta/QueryBuilderWhere.php (revision 7234bfb14e712ff548d9266ef32fdcc8eaf2d04e)
13fde0efcSAndreas Gohr<?php
23fde0efcSAndreas Gohr
33fde0efcSAndreas Gohrnamespace dokuwiki\plugin\struct\meta;
43fde0efcSAndreas Gohr
53fde0efcSAndreas Gohr/**
63fde0efcSAndreas Gohr * Class QueryWhere
73fde0efcSAndreas Gohr * @package dokuwiki\plugin\struct\meta
83fde0efcSAndreas Gohr */
9d6d97f60SAnna Dabrowskaclass QueryBuilderWhere
10d6d97f60SAnna Dabrowska{
113fde0efcSAndreas Gohr    /** @var  QueryBuilderWhere[]|string */
123fde0efcSAndreas Gohr    protected $statement;
133fde0efcSAndreas Gohr    /** @var string */
143fde0efcSAndreas Gohr    protected $type = 'AND';
15af993d55SMichael Grosse    /** @var QueryBuilder */
16af993d55SMichael Grosse    protected $QB;
173fde0efcSAndreas Gohr
183fde0efcSAndreas Gohr    /**
193fde0efcSAndreas Gohr     * Create a new WHERE clause
203fde0efcSAndreas Gohr     *
2195c419beSMichael Grosse     * @param QueryBuilder $QB The QueryBuilder to which this where-clause belongs
223fde0efcSAndreas Gohr     * @param string $type The type of the statement, either 'AND' or 'OR'
233fde0efcSAndreas Gohr     * @param null|string $statement The statement or null if this should hold sub statments
243fde0efcSAndreas Gohr     */
25d6d97f60SAnna Dabrowska    public function __construct(QueryBuilder $QB, $type = 'AND', $statement = null)
26d6d97f60SAnna Dabrowska    {
27af993d55SMichael Grosse        $this->QB = $QB;
283fde0efcSAndreas Gohr        $this->type = $type;
293fde0efcSAndreas Gohr        if ($statement === null) {
30*7234bfb1Ssplitbrain            $this->statement = [];
313fde0efcSAndreas Gohr        } else {
323fde0efcSAndreas Gohr            $this->statement = $statement;
333fde0efcSAndreas Gohr        }
343fde0efcSAndreas Gohr    }
353fde0efcSAndreas Gohr
363fde0efcSAndreas Gohr    /**
373fde0efcSAndreas Gohr     * Adds another AND clause
383fde0efcSAndreas Gohr     *
393fde0efcSAndreas Gohr     * @param string $statement
403fde0efcSAndreas Gohr     * @return $this
413fde0efcSAndreas Gohr     */
42d6d97f60SAnna Dabrowska    public function whereAnd($statement)
43d6d97f60SAnna Dabrowska    {
44d21da21cSAndreas Gohr        return $this->where('AND', $statement);
453fde0efcSAndreas Gohr    }
463fde0efcSAndreas Gohr
473fde0efcSAndreas Gohr    /**
483fde0efcSAndreas Gohr     * Adds another OR clause
493fde0efcSAndreas Gohr     *
503fde0efcSAndreas Gohr     * @param $statement
513fde0efcSAndreas Gohr     * @return $this
523fde0efcSAndreas Gohr     */
53d6d97f60SAnna Dabrowska    public function whereOr($statement)
54d6d97f60SAnna Dabrowska    {
55d21da21cSAndreas Gohr        return $this->where('OR', $statement);
563fde0efcSAndreas Gohr    }
573fde0efcSAndreas Gohr
583fde0efcSAndreas Gohr    /**
593fde0efcSAndreas Gohr     * Add a new AND sub clause on which more statements can be added
603fde0efcSAndreas Gohr     *
613fde0efcSAndreas Gohr     * @return QueryBuilderWhere
623fde0efcSAndreas Gohr     */
63d6d97f60SAnna Dabrowska    public function whereSubAnd()
64d6d97f60SAnna Dabrowska    {
65d21da21cSAndreas Gohr        return $this->where('AND', null);
663fde0efcSAndreas Gohr    }
673fde0efcSAndreas Gohr
683fde0efcSAndreas Gohr    /**
693fde0efcSAndreas Gohr     * Add a new OR sub clause on which more statements can be added
703fde0efcSAndreas Gohr     *
713fde0efcSAndreas Gohr     * @return QueryBuilderWhere
723fde0efcSAndreas Gohr     */
73d6d97f60SAnna Dabrowska    public function whereSubOr()
74d6d97f60SAnna Dabrowska    {
75d21da21cSAndreas Gohr        return $this->where('OR', null);
763fde0efcSAndreas Gohr    }
773fde0efcSAndreas Gohr
783fde0efcSAndreas Gohr    /**
793fde0efcSAndreas Gohr     * Adds another statement to this sub clause
803fde0efcSAndreas Gohr     *
814c13ff97SAndreas Gohr     * @param string $op either AND or OR
823fde0efcSAndreas Gohr     * @param null|string $statement null creates a new sub clause
833fde0efcSAndreas Gohr     * @return $this|QueryBuilderWhere
843fde0efcSAndreas Gohr     * @throws StructException when this is not a sub clause
853fde0efcSAndreas Gohr     */
86d6d97f60SAnna Dabrowska    public function where($op = 'AND', $statement = null)
87d6d97f60SAnna Dabrowska    {
88d21da21cSAndreas Gohr        if (!is_array($this->statement)) {
89d21da21cSAndreas Gohr            throw new StructException('This WHERE is not a sub clause and can not have additional clauses');
90d21da21cSAndreas Gohr        }
914c13ff97SAndreas Gohr        if ($op != 'AND' && $op != 'OR') {
92d21da21cSAndreas Gohr            throw new StructException('Bad logical operator');
93d21da21cSAndreas Gohr        }
94af993d55SMichael Grosse        $where = new QueryBuilderWhere($this->QB, $op, $statement);
953fde0efcSAndreas Gohr        $this->statement[] = $where;
963fde0efcSAndreas Gohr
973fde0efcSAndreas Gohr        if ($statement) {
983fde0efcSAndreas Gohr            return $this;
993fde0efcSAndreas Gohr        } else {
1003fde0efcSAndreas Gohr            return $where;
1013fde0efcSAndreas Gohr        }
1023fde0efcSAndreas Gohr    }
1033fde0efcSAndreas Gohr
1043fde0efcSAndreas Gohr    /**
105af993d55SMichael Grosse     * @return QueryBuilder
106af993d55SMichael Grosse     */
107d6d97f60SAnna Dabrowska    public function getQB()
108d6d97f60SAnna Dabrowska    {
109af993d55SMichael Grosse        return $this->QB;
110af993d55SMichael Grosse    }
111af993d55SMichael Grosse
112af993d55SMichael Grosse    /**
1133fde0efcSAndreas Gohr     * @param bool $first is this the first where statement? Then the type is ignored
1143fde0efcSAndreas Gohr     * @return string
1153fde0efcSAndreas Gohr     */
116d6d97f60SAnna Dabrowska    public function toSQL($first = true)
117d6d97f60SAnna Dabrowska    {
1183fde0efcSAndreas Gohr        if (!$this->statement) return '';
1193fde0efcSAndreas Gohr
1203fde0efcSAndreas Gohr        $sql = ' ';
1213fde0efcSAndreas Gohr        if (!$first) $sql .= $this->type . ' ';
1223fde0efcSAndreas Gohr
1233fde0efcSAndreas Gohr        if (is_array($this->statement)) {
1243fde0efcSAndreas Gohr            $first = true;
1253fde0efcSAndreas Gohr            $sql .= '(';
1263fde0efcSAndreas Gohr            foreach ($this->statement as $where) {
1273fde0efcSAndreas Gohr                $sql .= $where->toSQL($first);
1283fde0efcSAndreas Gohr                $first = false;
1293fde0efcSAndreas Gohr            }
1303fde0efcSAndreas Gohr            $sql .= ' )';
1313fde0efcSAndreas Gohr        } else {
1323fde0efcSAndreas Gohr            $sql .= $this->statement;
1333fde0efcSAndreas Gohr        }
1343fde0efcSAndreas Gohr
1353fde0efcSAndreas Gohr        return $sql;
1363fde0efcSAndreas Gohr    }
1373fde0efcSAndreas Gohr}
138