* @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']; } } ?>