%PDF- %PDF-
Direktori : /var/www/html/bbw/farmaci/kritik-portale/module/Basis/src/Basis/EventStore/ |
Current File : /var/www/html/bbw/farmaci/kritik-portale/module/Basis/src/Basis/EventStore/EventStore.php |
<?php /** * Created by PhpStorm. * User: juliangilles * Date: 17.03.14 * Time: 11:41 */ namespace Basis\EventStore; use Basis\Entity; use Login\Model\Session; use Zend\Db\Sql\Expression; use Zend\Db\Sql\Select; use Zend\Db\TableGateway\TableGateway; use Zend\Db\ResultSet\ResultSet; use Zend\Json\Json; class EventStore { /** * @var \Zend\Db\Adapter\Adapter */ protected $_databaseAdapter; protected $_resultSet; protected $_eventStoreTable; protected $_entityType = null; public function __construct($entityType = null) { if (!is_null($entityType)) { $this->_entityType = $entityType; } } public function setDatabaseAdapter(\Zend\Db\Adapter\Adapter $databaseAdapter) { $this->_databaseAdapter = $databaseAdapter; $this->_resultSet = new ResultSet(ResultSet::TYPE_ARRAYOBJECT, new \Basis\Entity\EventStoreEntity()); $this->_eventStoreTable = new TableGateway('eventstore', $this->_databaseAdapter, null, $this->_resultSet); } public function loadEvents($entityId) { $events = array(); $result = $this->_eventStoreTable->select(array('entityid' => $entityId, 'entitytype' => $this->_entityType)); foreach($result as $row) { $events[] = $row; } return $events; } public function loadEventsByType($eventType, $onlyIds = false, $entityid = null) { $events = array(); $eventFromDB = $this->_eventStoreTable->select(function (Select $select) use ($eventType, $entityid) { if(is_null($entityid)) { $select->where(array('eventtype' => $eventType)); } else { $select->where(array('eventtype' => $eventType, 'entityid' => $entityid)); } $select->order('ideventstore ASC'); }); if($onlyIds){ foreach($eventFromDB as $event){ $events[] = $event->__get("entityid"); } return $events; } foreach($eventFromDB as $one) { /* @var $event \Basis\Event\Event */ $class = $one->__get("eventtype"); $event = new $class(); $event->setParams((Json::decode($one->__get("domaindata"), true))); $event->setEntityId($one->__get("entityid")); $events[] = $event; } return $events; } public function saveEvents(\Basis\Model\EventBasis $object) { $events = $object->getEvents(); $repo = $this->_eventStoreTable; $user = Session::getIdentity(); if($user !== null) { $userId = $user->__get('entityid'); } else { $userId = "guest"; //what?! ;-) } $select = $repo->getSql()->select(); $select->columns(array( 'maxVersion' => new Expression('MAX(entityversion)') )); $select->where(array('entityid' => $object->getId())); $rowset = $repo->selectWith($select); $lastVersion = $rowset->current(); if (is_null($lastVersion->maxVersion)) { $version = 1; } else { $version = (int)$lastVersion->maxVersion; $version++; } foreach ($events as $event) { /* @var $event \Basis\Event\Event */ $entity = new Entity\EventStoreEntity(); $entity->__set("entityid", $object->getId()); $entity->__set("entitytype", $this->_entityType); $entity->__set("entityversion", $version); $entity->__set("eventtype", $event->getName()); $entity->__set("eventtypeversion", $event->getVersion()); $entity->__set("domaindata", $event->getParams()); $time = new \DateTime(date('Y-m-d H:i:s')); $entity->__set("time", $time->format("Y-m-d H:i:s")); $entity->__set("user_iduser", $userId); $this->_eventStoreTable->insert($entity->getArrayCopy()); $version++; } } public function loadEventsByTime($eventType, $start, $end) { $events = array(); $eventFromDB = $this->_eventStoreTable->select(function (Select $select) use ($eventType, $start, $end) { $select->where(array('eventtype' => $eventType)); $select->where('time BETWEEN "' . $start . '" AND "' . $end . '"'); $select->group('entityid'); $select->order('ideventstore ASC'); }); foreach($eventFromDB as $one) { /* @var $event \Basis\Event\Event */ $class = $one->__get("eventtype"); $event = new $class(); $event->setParams((Json::decode($one->__get("domaindata"), true))); $event->setEntityId($one->__get("entityid")); $events[] = $event; } return $events; } public function loadEventsByTwoIntervals($eventTypeArray, $firstStart, $firstEnd, $secondStart, $secondEnd, $onlyIds = false) { $events = array(); $dbAdapter = $this->_databaseAdapter; $eventFromDB = $this->_eventStoreTable->select(function (Select $select) use ($dbAdapter,$eventTypeArray, $firstStart, $firstEnd, $secondStart, $secondEnd) { // $select->where(array('eventtype' => $eventType)); $predicateSet = new \Zend\Db\Sql\Predicate\PredicateSet(); foreach ($eventTypeArray as $eventType) { $predicate = new \Zend\Db\Sql\Predicate\Predicate(); $predicate->equalTo('eventtype', $eventType); $predicateSet->orPredicate($predicate); } $select->where($predicateSet); $select->where('time BETWEEN "' . $firstStart . '" AND "' . $firstEnd . '" OR time BETWEEN "' . $secondStart . '" AND "' . $secondEnd . '"'); $select->group('entityid'); $select->order('ideventstore ASC'); }); if($onlyIds){ foreach($eventFromDB as $event){ $events[] = $event->__get("entityid"); } return $events; } foreach($eventFromDB as $one) { /* @var $event \Basis\Event\Event */ $class = $one->__get("eventtype"); $event = new $class(); $event->setParams((Json::decode($one->__get("domaindata"), true))); $event->setEntityId($one->__get("entityid")); $events[] = $event; } return $events; } public function getLastEventOfType($eventType) { $eventFromDB = $this->_eventStoreTable->select(function (Select $select) use ($eventType) { $select->where(array('eventtype' => $eventType)); $select->order('ideventstore DESC'); $select->limit(1); }); foreach($eventFromDB as $one) { /* @var $event \Basis\Event\Event */ $class = $one->__get("eventtype"); $event = new $class(); $event->setParams((Json::decode($one->__get("domaindata"), true))); $event->setEntityId($one->__get("entityid")); $event->time = $one->__get("time"); return $event; } return null; } }