public function run(){
		if(!$this->performed)
			$start = microtime(true);

		try{
			$query = $this->performed
				? $this->resultSet
				: $this->connection->getDriver()->runQuery(preg_replace('/\s+/', ' ', $this->parse()));
		} catch(DriverException $e){
			throw new NeevoException('Query failed. ' . $e->getMessage(), $e->getCode(), $e->getSql(), $e);
		}

		if(!$this->performed)
			$this->time = microtime(true) - $start;

		$this->performed = true;
		$this->resultSet = $query;

		$this->notifyObservers(isset($this->type)
			? self::$eventTable[$this->type] : ObserverInterface::QUERY);

		return $query;
	}