%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /var/www/html/bbw/farmaci/kritik-portale/module/Basis/src/Basis/EventStore/
Upload File :
Create Path :
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;
    }

} 

Zerion Mini Shell 1.0