Add analytics
[bus.git] / busui / owa / modules / base / handlers / sessionHandlers.php
blob:a/busui/owa/modules/base/handlers/sessionHandlers.php -> blob:b/busui/owa/modules/base/handlers/sessionHandlers.php
--- a/busui/owa/modules/base/handlers/sessionHandlers.php
+++ b/busui/owa/modules/base/handlers/sessionHandlers.php
@@ -1,1 +1,233 @@
+<?php

+

+//

+// Open Web Analytics - An Open Source Web Analytics Framework

+//

+// Copyright 2006-2010 Peter Adams. All rights reserved.

+//

+// Licensed under GPL v2.0 http://www.gnu.org/copyleft/gpl.html

+//

+// Unless required by applicable law or agreed to in writing, software

+// distributed under the License is distributed on an "AS IS" BASIS,

+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+// See the License for the specific language governing permissions and

+// limitations under the License.

+//

+// $Id$

+//

+

+if(!class_exists('owa_observer')) {

+	require_once(OWA_BASE_DIR.'owa_observer.php');

+}	

+

+/**

+ * OWA Session Event handlers

+ * 

+ * @author      Peter Adams <peter@openwebanalytics.com>

+ * @copyright   Copyright &copy; 2006-2010 Peter Adams <peter@openwebanalytics.com>

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

+    }

+}

+

+?>