You are here

function apachesolr_stats_generate_report_elements in Apache Solr Statistics 6

Same name and namespace in other branches
  1. 6.3 apachesolr_stats.module \apachesolr_stats_generate_report_elements()
  2. 7 apachesolr_stats.module \apachesolr_stats_generate_report_elements()

Generates report elements for the given granularity.

Parameters

string $granularity: Timespan to aggregate report by. Possible values: 'minute', 'hour' or 'day'

Return value

array An indexed array with the report elements; each element is an array with the indexes: 'name' => human-readable name of the element, e.g. "Total queries" 'value' => html with the result. Can be an image, a number, etc.

3 calls to apachesolr_stats_generate_report_elements()
apachesolr_stats_report in ./apachesolr_stats.module
Callback for admin/reports/apachesolr/stats.
apachesolr_stats_report_gadget in ./apachesolr_stats.module
Callback function that outputs an XML description for a Google Gadget and terminates PHP execution.
apachesolr_stats_report_gadget_element in ./apachesolr_stats.module
Callback function used by Gadget javascript to fetch a particular element.

File

./apachesolr_stats.module, line 750
Keeps and reports statistics about Apache Solr usage and performance.

Code

function apachesolr_stats_generate_report_elements($granularity) {

  // Initialize
  $facets = apachesolr_stats_get_facets();
  $suggestions = 0;
  $queries = 0;
  $users = array();
  $sessions = array();
  $start_timeslot = 0;
  $last_timeslot = 0;
  $first_timestamp = 0;
  $no_keywords = 0;
  $total_queries = 0;
  $time['max'] = -1;
  $time['min'] = 9999.999;
  $report_elements = array();
  $keywords = array();
  $keywords_noresults = array();

  // Scan the logfile and build statistics arrays
  $result = db_query("SELECT * FROM {apachesolr_stats} WHERE timestamp > %d ORDER BY timestamp DESC", time() - $granularity['time_before']);
  while ($record = db_fetch_object($result)) {
    $timeslot = intval($record->timestamp / $granularity['timespan']);
    if ($last_timeslot == 0) {
      $last_timeslot = $timeslot;
    }
    @$users[$record->uid]++;
    @$sessions[$record->sid]++;

    // Tally suggestions
    if ($record->showed_suggestions) {
      $suggestions++;
    }
    @$total_requests++;
    @($time['total'] += $record->total_time);

    // $time['prepare'] += $record->prepare_time;
    // $time['process'] += $record->process_time;
    // Track max and min response times
    $time['max'] = $time['max'] < $record->total_time ? $record->total_time : $time['max'];
    $time['min'] = $time['min'] > $record->total_time ? $record->total_time : $time['min'];

    // Field usage; only when on first results page (meaning it's a fresh search)
    if ($record->page == "") {
      $facet_processed_flag = array();
      $ok = preg_match_all('/[^ ]+/', $record->filters, $matches);
      foreach ($matches[0] as $word) {
        $fieldname = apachesolr_stats_determine_field_from_query($facets, $word);
        if ($fieldname != false) {

          // Count this facet field only once per query
          if (!isset($facet_processed_flag[$fieldname])) {

            // Add 1 to usage of term from vocabulary
            $facets[$fieldname]['usage']++;

            // Mark so we don't count it again for this query
            $facet_processed_flag[$fieldname] = true;
          }
        }
      }
      if (trim($record->keywords) != "") {
        if (!isset($facet_processed_flag['kw']) || $facet_processed_flag['kw'] != true) {
          $facets['kw']['usage']++;
          $facet_processed_flag['kw'] = true;

          // Keep track of individual keywords used
          $keys_filtered = drupal_strtolower(trim($record->keywords));
          @$keywords[$keys_filtered]++;

          // Count keywords with zero results; but only when no filters issued.
          if ($record->numfound == 0 && !$record->filters) {
            @$keywords_noresults[$keys_filtered]++;
          }
        }
      }
      else {
        $no_keywords++;
      }

      // Count each unique query
      $facets["any"]['usage']++;

      // Keep track of how many fields were active per query
      @$simultaneous_fields[sizeof($facet_processed_flag)]++;
      $total_queries++;
    }

    // Sort usage; count only the first page of results
    if ($record->page == "") {
      @$sort_usage[$record->sort ? $record->sort : "relevance"]++;
    }

    // Group some stats into timeslots (minutes, hours) to show trends
    if (empty($user_slot[$record->uid][$timeslot])) {
      @$data_per_granularity['users_per_slot'][$timeslot]++;
      $user_slot[$record->uid][$timeslot] = TRUE;
    }
    if (empty($session_slot[$record->sid][$timeslot])) {
      @$data_per_granularity['sessions_per_slot'][$timeslot]++;
      $session_slot[$record->sid][$timeslot] = TRUE;
    }
    @$data_per_granularity['queries'][$timeslot]++;
    @$count_per_granularity[$timeslot]++;
    @($data_per_granularity['total_time'][$timeslot] += $record->total_time);
    $first_timestamp = $record->timestamp;
  }
  if (sizeof($sessions) == 0 || sizeof($users) == 0 || $total_queries == 0) {
    return array();
  }
  $start_timeslot = $timeslot;
  $earliest_timestamp = $start_timeslot * $granularity['timespan'];
  $report_elements['span'] = array(
    'name' => t('Report span'),
    'value' => t('Last @interval (@startdate to @enddate)', array(
      '@interval' => format_interval(3600 + time() - $first_timestamp),
      '@startdate' => format_date($first_timestamp),
      '@enddate' => format_date(time()),
    )) . '<br />' . t('Data points in charts are one point per @granularity.', array(
      '@granularity' => $granularity['name'],
    )),
  );

  #$report_elements['queries'] = array('name' => t('Total requests to Solr'), 'value' => $total_queries);

  // Chart for queries per timeslot
  $chart = apachesolr_stats_chart($granularity, $data_per_granularity['queries'], $start_timeslot, $last_timeslot, $total_queries, $total_queries / ($last_timeslot - $start_timeslot + 1));
  $report_elements['total_queries_per'] = array(
    'name' => t('Requests'),
    'value' => t('Total: @total', array(
      '@total' => $total_queries,
    )) . '<br />' . $chart,
  );

  // Chart for sessions per timeslot
  $chart = apachesolr_stats_chart($granularity, $data_per_granularity['sessions_per_slot'], $start_timeslot, $last_timeslot, sizeof($sessions), sizeof($sessions) / ($last_timeslot - $start_timeslot + 1));
  $report_elements['total_sessions_per'] = array(
    'name' => t('Unique sessions'),
    'value' => t('Total: @total', array(
      '@total' => sizeof($sessions),
    )) . '<br />' . $chart,
  );
  $report_elements['avg_queries_session'] = array(
    'name' => t('Average requests per session'),
    'value' => sprintf("%.1f", $total_queries / sizeof($sessions)),
  );

  // Chart for average time per timeslot
  $data = array();
  foreach ($data_per_granularity['total_time'] as $timeslot => $value) {
    $data[$timeslot] = $value / $count_per_granularity[$timeslot];
  }

  // Call with average_empty = FALSE
  $chart = apachesolr_stats_chart($granularity, $data, $start_timeslot, $last_timeslot, $total_queries, $time['total'] / $total_queries);
  $report_elements['query_avg_time'] = array(
    'name' => t('Average time per request (miliseconds)'),
    'value' => sprintf("%s: %.2f ms / %s: %.2f ms / %s: %.2f ms", t('Minimum'), $time['min'], t('Average'), $time['total'] / $total_queries, t('Maximum'), $time['max']) . '</br>' . $chart,
  );

  // Most-used keywords
  $report_elements['keywords'] = array(
    'name' => t('Top search phrases'),
    'value' => apachesolr_stats_report_frequent_keywords($keywords, $keywords_noresults),
  );

  // Most-used keywords with no results
  $report_elements['keywords_noresults'] = array(
    'name' => t('Top search phrases with no results'),
    'value' => apachesolr_stats_report_frequent_keywords($keywords_noresults, $keywords_noresults, "error"),
  );

  // Total spellchecker suggestions
  $report_elements['spellchecker'] = array(
    'name' => t('Total spellchecker suggestions'),
    'value' => $suggestions,
  );

  // Chart for sort usage
  $leyends = array();
  foreach ($sort_usage as $key => $value) {
    $leyends[] = drupal_urlencode($key);
  }
  $chl = implode('|', $leyends);
  $chd = implode(',', $sort_usage);
  $chart = "<img src='http://chart.apis.google.com/chart?cht=p3&chd=t:{$chd}&chs=350x100&chl={$chl}' />";
  $report_elements['sort_usage'] = array(
    'name' => t('Sort usage'),
    'value' => $chart,
  );

  // Chart for field usage
  $report_elements['field_usage'] = array(
    'name' => t('Facet usage'),
    'value' => apachesolr_stats_facet_usage_graph($facets) . apachesolr_stats_facet_usage_table($facets),
  );
  return $report_elements;
}