You are here

function flot_fields_views_plugin_style::preprocess_SearchApiViewsQuery in Flot 7

1 call to flot_fields_views_plugin_style::preprocess_SearchApiViewsQuery()
flot_fields_views_plugin_style::preprocess in flot_views/views/flot_fields_views_plugin_style.inc
Theme template preprocessor.

File

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

Class

flot_fields_views_plugin_style
@file Style plugin for views

Code

function preprocess_SearchApiViewsQuery($vars, $input, &$output) {

  // input
  $yfields = $input['yfields'];
  $fieldx = $input['fieldx'];
  $group_fields = $input['group_fields'];

  // output
  $data = array();
  $series = array();
  $series_options = array();
  $range = array();
  $range['xaxis'] = $range['yaxis'] = array(
    'min' => NULL,
    'max' => NULL,
  );
  $ticks = array();

  // convert to usable format
  if (!isset($vars['rows'])) {
    $output = array(
      'series' => $series,
      'series_options' => $series_options,
      'range' => $range,
      'ticks' => $ticks,
    );
    return;
  }
  foreach ($vars['rows'] as $id => $row) {
    if (isset($row) && isset($row->_entity_properties)) {
      $datarow = array();
      foreach ($row->_entity_properties as $key => $value) {
        if ($key != 'search_api_relevance' && $key != 'search_api_excerpt') {
          $datarow[$key] = $value;
        }
      }
      if (!empty($datarow)) {
        $data[] = (object) $datarow;
      }
    }
  }

  // count doen - min/max bepalen
  $min = $data[0]->{$fieldx->field_alias};
  $max = $data[0]->{$fieldx->field_alias};
  foreach ($data as $id => $row) {
    if ($row->{$fieldx->field_alias} < $min) {
      $min = $row->{$fieldx->field_alias};
    }
    elseif ($row->{$fieldx->field_alias} > $max) {
      $max = $row->{$fieldx->field_alias};
    }
  }
  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;
  }
  $countdata = array();
  foreach ($data as $id => $row) {
    $x = round($row->{$fieldx->field_alias} / $timeinterval) * $timeinterval;
    if (empty($yfields)) {
      if (!isset($countdata[$x])) {
        $countdata[$x]->{$fieldx->field_alias} = $x;
        $countdata[$x]->count = 1;
      }
      else {
        $countdata[$x]->count++;
      }
    }
    else {
      $labelfields = array();
      foreach ($yfields as $fieldy) {
        if ($fieldy->options['flot']['y']['function'] == 'label') {
          $labelfields[] = $fieldy;
        }
      }
      foreach ($yfields as $fieldy) {
        $rowval = 0;
        $label = $fieldy->field;
        if (isset($row->{"entity object"})) {
          $wrapper = entity_metadata_wrapper($fieldy->entity_type, $row->{"entity object"});
          $label = field_info_instance($wrapper
            ->type(), $fieldy->field, $wrapper
            ->getBundle());
          if (empty($label)) {

            //this is an entity that does not have this field (e.g. nodes of different types do not have the same fields)
            $label = t('No data');
          }
          else {
            $label = $label['label'];
          }
        }
        if (isset($row->{$fieldy->field_alias})) {
          $rowval = $row->{$fieldy->field_alias};
        }
        else {
          if (isset($wrapper->{$fieldy->field})) {
            $rowval = $wrapper->{$fieldy->field}
              ->value();
          }
        }
        $rowval = is_null($rowval) ? 0 : $rowval;
        $datakey = $x;
        if ($fieldy->options['flot']['y']['function'] == 'count') {
          $datakey = $x . $rowval;
        }
        if (!isset($countdata[$datakey]) && !in_array($fieldy, $labelfields)) {
          $countdata[$datakey]->x = $x;
          $labelval = array();
          if (!empty($labelfields)) {
            foreach ($labelfields as $labelfield) {
              if (isset($row->{$labelfield->field_alias})) {
                $labelval[] = $labelfield->definition['title'] . ': ' . $row->{$labelfield->field_alias};
              }
              else {
                if (isset($wrapper->{$labelfield->field})) {
                  $labelval[] = $labelfield->definition['title'] . ': ' . $wrapper->{$labelfield->field}
                    ->value();
                }
              }
            }
          }
          switch ($fieldy->options['flot']['y']['function']) {
            case 'count':
              $countdata[$datakey]->count = 1;
              if (empty($labelfields) && isset($row->{$fieldy->field_alias})) {
                $labelval[] = $fieldy->definition['title'] . ': ' . $row->{$fieldy->field_alias};
              }
              else {
                if (isset($wrapper->{$fieldy->field})) {
                  $labelval[] = $fieldy->definition['title'] . ': ' . $wrapper->{$fieldy->field}
                    ->value();
                }
              }
              break;
            default:

              //min, max, sum
              $countdata[$datakey]->count = $rowval;
              break;
          }
          $countdata[$datakey]->label = empty($labelval) ? $label : implode(', ', $labelval);
        }
        else {
          switch ($fieldy->options['flot']['y']['function']) {
            case 'count':
              $countdata[$datakey]->count++;
              break;
            case 'sum':
              $countdata[$datakey]->count += $rowval;
              break;
            case 'min':
              $countdata[$datakey]->count = min($rowval, $countdata[$x]->count);
              break;
            case 'max':
              $countdata[$datakey]->count = max($rowval, $countdata[$x]->count);
              break;
          }
        }
      }
    }
  }

  // sort data by timestamp
  function cmp_dp($a, $b) {
    if ($a->x == $b->x) {
      return 0;
    }
    return $a->x < $b->x ? -1 : 1;
  }
  usort($countdata, 'cmp_dp');

  // Iterate over results to build data and ticks
  foreach ($countdata as $id => $row) {
    if (isset($row)) {
      if (empty($yfields)) {
        if (isset($fieldx->options['date_format'])) {
          $datapoint = array(
            $row->x * 1000,
            $row->{"count"},
          );
        }
        else {
          if (!in_array($row->x, $ticks)) {
            $ticks[] = $row->x;
          }
          $datapoint = array(
            array_shift(array_keys($ticks, $row->x)),
            $row->{"count"},
          );
        }
        $range['xaxis']['min'] = is_null($range['xaxis']['min']) ? $row->{"count"} : min($row->{"count"}, $range['xaxis']['min']);
        $range['xaxis']['max'] = is_null($range['xaxis']['max']) ? $row->{"count"} : max($row->{"count"}, $range['xaxis']['max']);
        $series[$fieldx->field_alias][] = $datapoint;
      }
      else {

        // datetime fields need special care
        // TODO: Also handle datetime for the Y axis, not just the X axis
        if (isset($fieldx->options['date_format'])) {
          $datapoint = array(
            $row->x * 1000,
            $row->count,
          );
        }
        else {
          if (!in_array($row->{$fieldx->field_alias}, $ticks)) {
            $ticks[] = $row->x;
          }
          $datapoint = array(
            array_shift(array_keys($ticks, $row->x)),
            $row->count,
          );
        }
        $range['yaxis']['min'] = is_null($range['yaxis']['min']) ? $datapoint[1] : min($datapoint[1] - 1, $range['yaxis']['min']);

        //-1 for padding
        $range['yaxis']['max'] = is_null($range['yaxis']['max']) ? $datapoint[1] : max($datapoint[1] + 1, $range['yaxis']['max']);

        //+1 for padding
        $range['xaxis']['min'] = is_null($range['xaxis']['min']) ? $datapoint[0] : min($datapoint[0], $range['xaxis']['min']);
        $range['xaxis']['max'] = is_null($range['xaxis']['max']) ? $datapoint[0] : max($datapoint[0], $range['xaxis']['max']);
        $serieskey = $row->label;
        $series[$serieskey][] = $datapoint;
        $series_options[$serieskey] = $fieldy->options['flot']['y'];
      }
    }
  }
  $output = array(
    'series' => $series,
    'series_options' => $series_options,
    'range' => $range,
    'ticks' => $ticks,
  );
}