You are here

function flot_fields_views_plugin_style::query_views_plugin_query_default in Flot 7

1 call to flot_fields_views_plugin_style::query_views_plugin_query_default()
flot_fields_views_plugin_style::query in flot_views/views/flot_fields_views_plugin_style.inc
Add anything to the query that we might need to.

File

flot_views/views/flot_fields_views_plugin_style.inc, line 345
Style plugin for views

Class

flot_fields_views_plugin_style
@file Style plugin for views

Code

function query_views_plugin_query_default() {

  // get all fields
  $fields = $this->display->handler->handlers['field'];

  // Get flot fields, and bail if non present.
  $fields = $this->display->handler->handlers['field'];
  foreach ($fields as $fieldname => $field) {
    if ($field->options['flot']['axis'] == 'x') {
      $fieldx = $field;
      unset($fields[$fieldname]);
    }
  }
  $alias = $fieldx->field_alias;

  //if there are no y fields
  if (empty($fields)) {
    $this->view->query
      ->add_field(NULL, $this->view->query->fields[$alias]['table'] . '.' . $this->view->query->fields[$alias]['field'], "count", array(
      'function' => 'count',
    ));
  }

  // is first field a data field?
  if ($fieldx->options['flot']['x']['mode'] == 'time') {

    // check filters for timestamps
    // needs love, don't assume name of the field is timestamp
    // check for class viewss_handler_filter_date?
    // check cache as well, if not in cache we need to execute an extra query to get the full interval
    $this->rebuild_zoom_flot = FALSE;
    $filters = $this->display->handler->handlers['filter'];
    foreach ($filters as $filter) {
      if ($filter->options['field'] == $fieldx->options['field'] && $filter->options['table'] == $fieldx->options['table']) {
        if ($filter->options['exposed'] && $filter->options['operator'] == 'between') {
          if (isset($filter->value['min']) && isset($filter->value['max']) && is_numeric($filter->value['min']) && is_numeric($filter->value['max'])) {

            // How to find the right condition to alter
            $filter_field = $filter->table . '.' . $filter->field;

            // find right condition
            $wherekey = min(array_keys($this->view->query->where));
            foreach ($this->view->query->where[$wherekey]['conditions'] as $key => $condition) {
              if (strpos($condition['field'], 'BETWEEN') && strpos($condition['field'], $filter_field) === 0) {
                $this->view->query->where[$wherekey]['conditions'][$key]['field'] = $filter_field . ' BETWEEN ' . $filter->value['min'] . ' AND ' . $filter->value['max'];
                break;
              }
            }
          }
          else {

            // Only build cache if there is no range given
            $this->rebuild_zoom_flot = TRUE;
          }
          break;
        }
      }
    }

    // calculate a sane interval for datetime fields
    $minmaxview = new view();
    foreach ($this->view as $key => $val) {
      if (is_object($val) && $key != 'query') {
        $minmaxview->{$key} = clone $val;
      }
      elseif (is_array($val)) {
        $minmaxview->{$key} = $val;
      }
      else {
        $minmaxview->{$key} = $val;
      }
    }
    $minmaxview->query = new views_plugin_query_default();
    foreach ($this->view->query as $key => $val) {
      if (is_object($val)) {
        $minmaxview->query->{$key} = clone $val;
      }
      elseif (is_array($val)) {
        $minmaxview->query->{$key} = $val;
      }
      else {
        $minmaxview->query->{$key} = $val;
      }
    }
    $minmaxview->query->orderby = array();
    $minmaxview->query->fields = array();
    $minmaxview->query->fields[$alias . '_min'] = array(
      'field' => 'MIN(' . $this->view->query->fields[$alias]['table'] . '.' . $this->view->query->fields[$alias]['field'] . ')',
      'table' => '',
      'alias' => $alias . '_min',
    );
    $minmaxview->query->fields[$alias . '_max'] = array(
      'field' => 'MAX(' . $this->view->query->fields[$alias]['table'] . '.' . $this->view->query->fields[$alias]['field'] . ')',
      'table' => '',
      'alias' => $alias . '_max',
    );
    $minmaxview->query->view = $minmaxview;
    $minmaxview->query
      ->query(FALSE);
    $minmaxview->query
      ->build($minmaxview);
    $minmaxview->query
      ->execute($minmaxview);
    $timeinterval = 86400;
    if (isset($minmaxview->result) && isset($minmaxview->result[0])) {
      $minmax = $minmaxview->result[0];
      $min = $minmax->{$alias . '_min'};
      $max = $minmax->{$alias . '_max'};
      if ($max - $min > 30 * 86400) {
        $timeinterval = 86400;
      }
      elseif ($max - $min > 7 * 86400) {
        $timeinterval = 21600;
      }
      elseif ($max - $min > 3 * 86400) {
        $timeinterval = 10800;
      }
      elseif ($max - $min > 86400) {
        $timeinterval = 3600;
      }
      else {
        $timeinterval = 60;
      }
    }
    $this->view->query->fields[$alias]['field'] = '(ROUND(' . $this->view->query->fields[$alias]['table'] . '.' . $this->view->query->fields[$alias]['field'] . " / {$timeinterval}) * {$timeinterval})";
    $this->view->query->fields[$alias]['table'] = '';
  }
  if (!empty($fields)) {
    foreach ($fields as $field) {
      if ($field->options['flot']['y']['function'] != 'label') {

        // get the alias

        //$y_alias = $this->view->query->add_field($field->table, $field->real_field);
        $y_alias = $field->field_alias;
        $this->view->query
          ->add_field($field->table, $field->real_field, $y_alias . '_' . $field->options['flot']['y']['function'], array(
          'function' => $field->options['flot']['y']['function'],
        ));
      }
    }
  }

  // group by first field
  $groupby = isset($this->view->query->groupby) ? $this->view->query->groupby : array();
  array_unshift($groupby, $this->view->query->fields[$alias]['alias']);
  $this->view->query->groupby = $groupby;
  $this->view->query->has_aggregate = TRUE;
}