Source of file State.php

Size: 7,094 Bytes - Last Modified: 2018-02-09T16:14:20-05:00

src/State.php

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
<?php declare(strict_types=1);
/**
 * Query
 *
 * SQL Query Builder / Database Abstraction Layer
 *
 * PHP version 7.1
 *
 * @package     Query
 * @author      Timothy J. Warren <tim@timshomepage.net>
 * @copyright   2012 - 2018 Timothy J. Warren
 * @license     http://www.opensource.org/licenses/mit-license.html  MIT License
 * @link        https://git.timshomepage.net/aviat4ion/Query
 */
namespace Query;

/**
 * Query builder state
 */
class State {
	// --------------------------------------------------------------------------
	// ! SQL Clause Strings
	// --------------------------------------------------------------------------

	/**
	 * Compiled 'select' clause
	 * @var string
	 */
	protected $selectString = '';

	/**
	 * Compiled 'from' clause
	 * @var string
	 */
	protected $fromString = '';

	/**
	 * Compiled arguments for insert / update
	 * @var string
	 */
	protected $setString = '';

	/**
	 * Order by clause
	 * @var string
	 */
	protected $orderString = '';

	/**
	 * Group by clause
	 * @var string
	 */
	protected $groupString = '';

	// --------------------------------------------------------------------------
	// ! SQL Clause Arrays
	// --------------------------------------------------------------------------

	/**
	 * Keys for insert/update statement
	 * @var array
	 */
	protected $setArrayKeys = [];

	/**
	 * Key/val pairs for order by clause
	 * @var array
	 */
	protected $orderArray = [];

	/**
	 * Key/val pairs for group by clause
	 * @var array
	 */
	protected $groupArray = [];

	// --------------------------------------------------------------------------
	// ! Other Class vars
	// --------------------------------------------------------------------------

	/**
	 * Values to apply to prepared statements
	 * @var array
	 */
	protected $values = [];

	/**
	 * Values to apply to where clauses in prepared statements
	 * @var array
	 */
	protected $whereValues = [];

	/**
	 * Value for limit string
	 * @var integer
	 */
	protected $limit;

	/**
	 * Value for offset in limit string
	 * @var string|false
	 */
	protected $offset = FALSE;

	/**
	 * Query component order mapping
	 * for complex select queries
	 *
	 * Format:
	 * [
	 *		'type' => 'where',
	 *		'conjunction' => ' AND ',
	 *		'string' => 'k=?'
	 * ]
	 *
	 * @var array
	 */
	protected $queryMap = [];

	/**
	 * Map for having clause
	 * @var array
	 */
	protected $havingMap = [];

	/**
	 * @param string $str
	 * @return State
	 */
	public function setSelectString(string $str): self
	{
		$this->selectString = $str;
		return $this;
	}

	/**
	 * @return string
	 */
	public function getSelectString(): string
	{
		return $this->selectString;
	}

	/**
	 * @param string $str
	 * @return State
	 */
	public function appendSelectString(string $str): self
	{
		$this->selectString .= $str;
		return $this;
	}

	/**
	 * @return string
	 */
	public function getFromString(): string
	{
		return $this->fromString;
	}

	/**
	 * @param string $fromString
	 * @return State
	 */
	public function setFromString(string $fromString): self
	{
		$this->fromString = $fromString;
		return $this;
	}

	/**
	 * @return string
	 */
	public function getSetString(): string
	{
		return $this->setString;
	}

	/**
	 * @param string $setString
	 * @return State
	 */
	public function setSetString(string $setString): self
	{
		$this->setString = $setString;
		return $this;
	}

	/**
	 * @return string
	 */
	public function getOrderString(): string
	{
		return $this->orderString;
	}

	/**
	 * @param string $orderString
	 * @return State
	 */
	public function setOrderString(string $orderString): self
	{
		$this->orderString = $orderString;
		return $this;
	}

	/**
	 * @return string
	 */
	public function getGroupString(): string
	{
		return $this->groupString;
	}

	/**
	 * @param string $groupString
	 * @return State
	 */
	public function setGroupString(string $groupString): self
	{
		$this->groupString = $groupString;
		return $this;
	}

	/**
	 * @return array
	 */
	public function getSetArrayKeys(): array
	{
		return $this->setArrayKeys;
	}

	/**
	 * @param array $setArrayKeys
	 * @return State
	 */
	public function appendSetArrayKeys(array $setArrayKeys): self
	{
		$this->setArrayKeys = array_merge($this->setArrayKeys, $setArrayKeys);
		return $this;
	}

	/**
	 * @param array $setArrayKeys
	 * @return State
	 */
	public function setSetArrayKeys(array $setArrayKeys): self
	{
		$this->setArrayKeys = $setArrayKeys;
		return $this;
	}

	/**
	 * @return array
	 */
	public function getOrderArray(): array
	{
		return $this->orderArray;
	}

	/**
	 * @param string $key
	 * @param mixed $orderArray
	 * @return State
	 */
	public function setOrderArray(string $key, $orderArray): self
	{
		$this->orderArray[$key] = $orderArray;
		return $this;
	}

	/**
	 * @return array
	 */
	public function getGroupArray(): array
	{
		return $this->groupArray;
	}

	/**
	 * @param array $groupArray
	 * @return State
	 */
	public function setGroupArray(array $groupArray): self
	{
		$this->groupArray = $groupArray;
		return $this;
	}

	/**
	 * @param string $groupArray
	 * @return State
	 */
	public function appendGroupArray(string $groupArray): self
	{
		$this->groupArray[] = $groupArray;
		return $this;
	}

	/**
	 * @return array
	 */
	public function getValues(): array
	{
		return $this->values;
	}

	/**
	 * @param array $values
	 * @return State
	 */
	public function appendValues(array $values): self
	{
		$this->values = array_merge($this->values, $values);
		return $this;
	}

	/**
	 * @return array
	 */
	public function getWhereValues(): array
	{
		return $this->whereValues;
	}

	/**
	 * @param mixed $val
	 * @return State
	 */
	public function appendWhereValues($val): self
	{
		if (\is_array($val))
		{
			foreach($val as $v)
			{
				$this->whereValues[] = $v;
			}

			return $this;
		}

		$this->whereValues[] = $val;
		return $this;
	}

	/**
	 * @return int
	 */
	public function getLimit(): ?int
	{
		return $this->limit;
	}

	/**
	 * @param int $limit
	 * @return State
	 */
	public function setLimit(int $limit): self
	{
		$this->limit = $limit;
		return $this;
	}

	/**
	 * @return string|false
	 */
	public function getOffset()
	{
		return $this->offset;
	}

	/**
	 * @param string|false $offset
	 * @return State
	 */
	public function setOffset($offset): self
	{
		$this->offset = $offset;
		return $this;
	}

	/**
	 * @return array
	 */
	public function getQueryMap(): array
	{
		return $this->queryMap;
	}

	/**
	 * Add an additional set of mapping pairs to a internal map
	 *
	 * @param string $conjunction
	 * @param string $string
	 * @param string $type
	 * @return State
	 */
	public function appendMap(string $conjunction = '', string $string = '', string $type = ''): self
	{
		$this->queryMap[] = [
			'type' => $type,
			'conjunction' => $conjunction,
			'string' => $string
		];
		return $this;
	}

	/**
	 * @return array
	 */
	public function getHavingMap(): array
	{
		return $this->havingMap;
	}

	/**
	 * @param array $item
	 * @return State
	 */
	public function appendHavingMap(array $item): self
	{
		$this->havingMap[] = $item;
		return $this;
	}
}