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;
}