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