Add analytics
[bus.git] / busui / owa / owa_metric.php
blob:a/busui/owa/owa_metric.php -> blob:b/busui/owa/owa_metric.php
  <?php
   
  //
  // Open Web Analytics - An Open Source Web Analytics Framework
  //
  // Copyright 2006 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$
  //
   
  require_once(OWA_BASE_CLASS_DIR.'pagination.php');
  require_once(OWA_BASE_CLASS_DIR.'timePeriod.php');
   
  /**
  * Metric
  *
  * @author Peter Adams <peter@openwebanalytics.com>
  * @copyright Copyright &copy; 2006 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_metric extends owa_base {
   
  /**
  * Current Time
  *
  * @var array
  */
  var $time_now = array();
   
  /**
  * Data
  *
  * @var array
  */
  var $data;
   
  /**
  * The params of the caller, either a report or graph
  *
  * @var array
  */
  var $params = array();
   
  /**
  * The lables for calculated measures
  *
  * @var array
  */
  var $labels = array();
   
  /**
  * Page results
  *
  * @var boolean
  */
  var $page_results = false;
   
  /**
  * Data Access Object
  *
  * @var object
  */
  var $db;
   
  var $_default_offset = 0;
   
  var $pagination;
   
  var $page;
   
  var $limit;
   
  var $order;
   
  var $table;
   
  var $select = array();
   
  var $time_period_constraint_format = 'timestamp';
   
  var $column;
   
  var $is_calculated = false;
   
  var $data_type;
   
  var $supported_data_types = array('percentage', 'decimal', 'integer', 'url', 'yyyymmdd', 'timestamp', 'string', 'currency');
   
  function __construct($params = array()) {
   
  if (!empty($params)) {
  $this->params = $params;
  }
   
  $this->db = owa_coreAPI::dbSingleton();
   
  $this->pagination = new owa_pagination;
   
  return parent::__construct();
  }
   
   
  /**
  * @depricated
  * @remove
  */
  function applyOptions($params) {
   
  // apply constraints
  if (array_key_exists('constraints', $params)) {
   
  foreach ($params['constraints'] as $k => $v) {
   
  if(is_array($v)) {
  $this->setConstraint($k, $v[1], $v[0]);
  } else {
  $this->setConstraint($k, $value);
  }
  }
  }
   
  // apply limit
  if (array_key_exists('limit', $params)) {
  $this->setLimit($params['limit']);
  }
   
  // apply order
  if (array_key_exists('order', $params)) {
  $this->setOrder($params['order']);
  }
   
  // apply page
  if (array_key_exists('page', $params)) {
  $this->setOrder($params['page']);
  }
   
  // apply offset
  if (array_key_exists('offset', $params)) {
  $this->setOrder($params['offset']);
  }
   
  // apply format
  if (array_key_exists('format', $params)) {
  //$this->setFormat($params['format']);
  }
   
  // apply period
  if (array_key_exists('period', $params)) {
  $this->setFormat($params['period']);
  }
   
  // apply start date
  if (array_key_exists('startDate', $params)) {
  $this->setFormat($params['startDate']);
  }
   
  // apply end date
  if (array_key_exists('endDate', $params)) {
  $this->setFormat($params['endDate']);
  }
  }
   
  function setConstraint($name, $value, $operator = '') {
   
  if (empty($operator)):
  $operator = '=';
  endif;
   
  if (!empty($value)):
  $this->params['constraints'][$name] = array('operator' => $operator, 'value' => $value, 'name' => $name);
  endif;
   
  return;
   
  }
   
  function setConstraints($array) {
   
  if (is_array($array)) {
   
  if (is_array($this->params['constraints'])) {
  $this->params['constraints'] = array_merge($array, $this->params['constraints']);
  } else {
  $this->params['constraints'] = $array;
  }
  }
  }
   
  function setLimit($value) {
   
  if (!empty($value)):
   
  $this->limit = $value;
   
  endif;
  }
   
  function setOrder($value) {
   
  if (!empty($value)):
   
  $this->params['order'] = $value;
   
  endif;
  }
   
  function setSort($column, $order) {
   
  //$this->params['orderby'][] = array($this->getColumnName($column), $order);
  }
   
  function setSorts($array) {
   
  if (is_array($array)) {
   
  if (!empty($this->params['orderby'])) {
  $this->params['orderby'] = array_merge($array, $this->params['orderby']);
   
  } else {
  $this->params['orderby'] = $array;
  }
   
  }
   
  }
   
  function setPage($value) {
   
  if (!empty($value)):
   
  $this->page = $value;
   
  if (!empty($this->pagination)):
  $this->pagination->setPage($value);
  endif;
   
  endif;
  }
   
   
  function getConstraints() {
   
  return $this->params['constraints'];
  }
   
  function setOffset($value) {
   
  if (!empty($value)):
  $this->params['offset'] = $value;
  endif;
  }
   
  function setFormat($value) {
  if (!empty($value)):
  $this->params['result_format'] = $value;
  endif;
  }
   
  function setPeriod($value) {
  if (!empty($value)):
  $this->params['period'] = $value;
  endif;
  }
   
  function setTimePeriod($period_name = '', $startDate = null, $endDate = null, $startTime = null, $endTime = null) {
   
  if ($startDate && $endDate) {
  $period_name = 'date_range';
  $map = array('startDate' => $startDate, 'endDate' => $endDate);
  } elseif ($startTime && $endTime) {
  $period_name = 'time_range';
  $map = array('startTime' => $startTime, 'endTime' => $endTime);
  } else {
  $this->debug('no period params passed to owa_metric::setTimePeriod');
  return false;
  }
   
  $p = owa_coreAPI::supportClassFactory('base', 'timePeriod');
   
  $p->set($period_name, $map);
   
  $this->setPeriod($p);
  }
   
  function makeTimePeriod($period = '') {
   
  $start = $this->params['period']->startDate->get($this->time_period_constraint_format);
  $end = $this->params['period']->endDate->get($this->time_period_constraint_format);
   
  if (!empty($this->entity)) {
  $col = $this->entity->getTableAlias().'.'.$this->time_period_constraint_format;
  } else {
  // needed for backwards compatability
  $col = $this->time_period_constraint_format;
  }
   
   
  $this->params['constraints'][$col] = array('operator' => 'BETWEEN', 'value' => array('start' => $start, 'end' => $end));
   
  return;
   
  }
   
  function setStartDate($date) {
  if (!empty($date)):
  $this->params['startDate'] = $date;
  endif;
  }
   
  function setEndDate($date) {
  if (!empty($date)):
  $this->params['endDate'] = $date;
  endif;
  }
   
  /**
  * @depricated
  */
  function generate($method = 'calculate') {
   
  $this->makeTimePeriod();
   
  $this->db->multiWhere($this->getConstraints());
   
  if (!empty($this->pagination)):
  $this->pagination->setLimit($this->limit);
  endif;
   
  // pass limit to db object if one exists
  if (!empty($this->limit)):
  $this->db->limit($this->limit);
  endif;
   
  // pass order to db object if one exists
   
   
   
  // pagination
  if (!empty($this->page)):
  $this->pagination->setPage($this->page);
  $offset = $this->pagination->calculateOffset();
  $this->db->offset($offset);
  endif;
   
   
  $results = $this->$method();
   
  if (!empty($this->pagination)):
  $this->pagination->countResults($results);
  endif;
   
  return $results;
   
  }
   
  /**
  * @depricated
  */
  function generateResults() {
   
  // set period specific constraints
  $this->makeTimePeriod();
  // set constraints
  $this->db->multiWhere($this->getConstraints());
  // sets metric specific SQL
  $this->calculate();
  // generate paginated result set
  $rs = owa_coreAPI::supportClassFactory('base', 'paginatedResultSet');
  // pass limit to db object if one exists
  if (!empty($this->limit)) {
  $rs->setLimit($this->limit);
  }
   
  // pass limit to db object if one exists
  if (!empty($this->page)) {
  $rs->setPage($this->page);
  }
   
  // get results
  $rs->generate($this->db);
   
  // add labels
  $rs->setLabels($this->getLabels());
   
  // add period info
  $rs->setPeriodInfo($this->params['period']->getAllInfo());
   
  return $rs;
  }
   
  /**
  * @depricated
  */
  function calculatePaginationCount() {
   
  if (method_exists($this, 'paginationCount')):
  $this->makeTimePerio