--- a/busui/owa/modules/base/handlers/sessionHandlers.php +++ b/busui/owa/modules/base/handlers/sessionHandlers.php @@ -1,1 +1,233 @@ + + * @copyright Copyright © 2006-2010 Peter Adams + * @license http://www.gnu.org/copyleft/gpl.html GPL v2.0 + * @category owa + * @package owa + * @version $Revision$ + * @since owa 1.0.0 + */ + +class owa_sessionHandlers extends owa_observer { + + /** + * Notify Event Handler + * + * @param unknown_type $event + * @access public + */ + function notify($event) { + + if ($event->get('is_new_session')) { + return $this->logSession($event); + } else { + return $this->logSessionUpdate($event); + } + } + + function logSession($event) { + + // Control logic + + $s = owa_coreAPI::entityFactory('base.session'); + + $s->load( $event->get('session_id') ); + + if ( ! $s->wasPersisted() ) { + + $s->setProperties($event->getProperties()); + + // Set Primary Key + $s->set( 'id', $event->get('session_id') ); + + // set initial number of page views + $s->set('num_pageviews', 1); + $s->set('is_bounce', true); + + // set prior session time properties + $s->set('prior_session_lastreq', $event->get('last_req')); + + $s->set('prior_session_id', $event->get('prior_session_id')); + + if ($s->get('prior_session_lastreq') > 0) { + $s->set('time_sinse_priorsession', $s->get('timestamp') - $event->get('last_req')); + $s->set('prior_session_year', date("Y", $event->get('last_req'))); + $s->set('prior_session_month', date("M", $event->get('last_req'))); + $s->set('prior_session_day', date("d", $event->get('last_req'))); + $s->set('prior_session_hour', date("G", $event->get('last_req'))); + $s->set('prior_session_minute', date("i", $event->get('last_req'))); + $s->set('prior_session_dayofweek', date("w", $event->get('last_req'))); + } + + // set last_req to be the timestamp of the event that triggered this session. + $s->set('last_req', $event->get('timestamp')); + $s->set('days_since_first_session', $event->get('days_since_first_session')); + $s->set('days_since_prior_session', $event->get('days_since_prior_session')); + $s->set('num_prior_sessions', $event->get('num_prior_sessions')); + + // set medium + //$s->set('medium', $event->get('medium')); + + // set campaign touches + $s->set( 'latest_attributions' , $event->get( 'attribs' ) ); + + // Make document ids + $s->set('first_page_id', owa_lib::setStringGuid($event->get('page_url'))); + + $s->set('last_page_id', $s->get('first_page_id')); + + // Generate Referer id + + if ($event->get('external_referer')) { + $s->set('referer_id', owa_lib::setStringGuid($event->get('HTTP_REFERER'))); + } + + // this should already be set by the request handler. + $s->set( 'location_id', $event->get( 'location_id' ) ); + + $ret = $s->create(); + + // create event message + $session = $s->_getProperties(); + $properties = array_merge($event->getProperties(), $session); + $properties['request_id'] = $event->get('guid'); + $ne = owa_coreAPI::supportClassFactory('base', 'event'); + $ne->setProperties($properties); + $ne->setEventType('base.new_session'); + + // log the new session event to the event queue + $eq = owa_coreAPI::getEventDispatch(); + $eq->notify($ne); + + if ($ret) { + return OWA_EHS_EVENT_HANDLED; + } else { + return OWA_EHS_EVENT_FAILED; + } + } else { + owa_coreAPI::debug('Not persisting new session. Session already exists.'); + return OWA_EHS_EVENT_HANDLED; + } + } + + function logSessionUpdate($event) { + + // Make entity + $s = owa_coreAPI::entityFactory('base.session'); + + // Fetch from session from database + $s->getByPk('id', $event->get('session_id')); + + $id = $s->get('id'); + // fail safe for when there is no existing session in DB + if (empty($id)) { + + owa_coreAPI::debug("Aborting session update as no existing session was found"); + return OWA_EHS_EVENT_FAILED; + } + + // idempotent check needed in case updates are processed out of order. + // dont update the database if the event timestamp is older that the last_req + // timestamp that is already set on the session object. + $last_req_time = $s->get('last_req'); + $event_req_time = $event->get('timestamp'); + + $ret = false; + + if ($event_req_time > $last_req_time) { + + // increment number of page views + $s->set('num_pageviews', $this->summarizePageviews($id)); + $s->set('is_bounce', 'false'); + + // update timestamp of latest request that triggered the session update + $s->set('last_req', $event->get('timestamp')); + + // update last page id + $s->set('last_page_id', owa_lib::setStringGuid($event->get('page_url'))); + + // set medium + $s->set('medium', $event->get('medium')); + + // set source + if ($event->get('source_id')) { + $s->set('source_id', $event->get('source_id') ); + } + + // set search terms + if ($event->get('referring_search_term_id')) { + $s->set('referring_search_term_id', $event->get('referring_search_term_id') ); + } + + // set campaign + if ($event->get('campaign_id')) { + $s->set('campaign_id', $event->get('campaign_id') ); + } + + // set ad + if ($event->get('ad_id')) { + $s->set('ad_id', $event->get('ad_id') ); + } + + // set campaign touches + $s->set( 'latest_attributions' , $event->get( 'attribs' ) ); + + // Persist to database + $ret = $s->update(); + } + + // setup event message + $session = $s->_getProperties(); + $properties = array_merge($event->getProperties(), $session); + $properties['request_id'] = $event->get('guid'); + $ne = owa_coreAPI::supportClassFactory('base', 'event'); + $ne->setProperties($properties); + $ne->setEventType('base.session_update'); + // Log session update event to event queue + $eq = owa_coreAPI::getEventDispatch(); + $ret = $eq->notify( $ne ); + + if ( $ret ) { + return OWA_EHS_EVENT_HANDLED; + } else { + return OWA_EHS_EVENT_FAILED; + } + } + + function summarizePageviews($id) { + + $ret = owa_coreAPI::summarize(array( + 'entity' => 'base.request', + 'columns' => array('id' => 'count_distinct'), + 'constraints' => array( 'session_id' => $id ) ) ); + + return $ret['id_dcount']; + } +} + +?>