You are here

class AcquiaLiftReport in Acquia Lift Connector 7

Responsible retrieving and generating reports on the Acquia Lift agent.

Hierarchy

Expanded class hierarchy of AcquiaLiftReport

File

plugins/agent_types/AcquiaLiftAgent.inc, line 2136
Provides an agent type for Acquia Lift

View source
class AcquiaLiftReport extends AcquiaLiftReportBase {

  /**
   * The threshold to use above which lift percentage will be positively noted.
   */
  const LIFT_THRESHHOLD = 0;

  /**
   * The threshold to use above which stability will be positively noted.
   */
  const STABILITY_THRESHOLD = 25;

  /**
   * Implements PersonalizeAgentReportInterface::renderStatsForOptionSet().
   */
  public function renderStatsForOptionSet($option_set, $date_from, $date_to = NULL) {
    $date_start = date('Y-m-d', $date_from);
    if (empty($date_to)) {
      $date_to = time();
    }
    $date_end = date('Y-m-d', $date_to);
    $report_data = $this
      ->generateReportConfiguration(array(
      'start' => $date_start,
      'end' => $date_end,
    ));
    if (!isset($report_data['confidence'])) {
      $this
        ->loadConfidenceData($report_data);
      if (isset($report_data['raw']['confidence']['error']) || !isset($report_data['raw']['confidence']['data'])) {
        return array();
      }
      else {
        $data = $this
          ->extractConfidenceReportData($report_data['raw']['confidence']['data']['items']);
      }
    }
    $decisions = $goals = 0;

    // Get a total count of all decisions made for this Option Set and all
    // goals received.
    foreach ($data['features'][self::NO_FEATURES] as $choice => $info) {
      list($decision_name, $option_id) = explode(':', $choice);
      if ($decision_name != $option_set->decision_name) {
        continue;
      }
      $decisions += $info['decisions'];
      $goals += $info['goals'];
    }
    $report[] = format_plural($decisions, '1 view', '@count views');
    $report[] = format_plural($goals, '1 goal', '@count goals');
    return $report;
  }

  /**
   * Implements PersonalizeAgentReportInterface::buildCampaignReports().
   */
  public function buildCampaignReports($options) {
    $report_data = $this
      ->loadReportData($options);
    $reports = array(
      'overview' => $this
        ->buildOverviewReport($report_data),
      'experiment' => $this
        ->buildAllConversionReports($report_data),
      'context' => $this
        ->buildContextReport($report_data),
      'stability' => $this
        ->buildStabilityReport($report_data),
      'targeting' => $this
        ->buildReportContextSelection($report_data),
    );
    $reports['#has_data'] = isset($reports['overview']['shown']['#title']) ? $reports['overview']['shown']['#title'] > 0 : FALSE;
    if (!is_array($report_data['status']) || !is_array($report_data['confidence']) || !is_array($report_data['targeting']) || !is_array($report_data['potential_context'])) {
      drupal_set_message(t('There was a problem retrieving the report data.  Please try again later.'), 'error');
    }
    else {
      if ($reports['#has_data'] && $report_data['status']['all']['total_confident'] == 0) {
        drupal_set_message($this
          ->getLowConfidenceMessage(), 'warning');
      }
    }
    return $reports;
  }

  /**
   * Loads all of the data necessary to generate the reports for the agent.
   *
   * @param $options
   * An array of report filter options.
   * - decision: Preselected decision to display.
   * - start: The start date of the report.
   * - from: The end date of the report.
   * - goal: (optional) A selected goal for reporting; defaults to all.
   * - conversion_metric: (optional) Metric to display within the conversion report.  One
   *   of 'rate' (conversion rate) or 'value' (conversion value).
   * @return array
   *   The reporting data for the date range as an array with keys for
   *   - status: The general agent status report data
   *   - confidence: The confidence report data
   *   - targeting: The targeting report data
   */
  protected function loadReportData($options) {
    $report_data = $this
      ->generateReportConfiguration($options);
    $this
      ->loadConversionReportData($report_data);

    // Context filters.
    if (!isset($report_data['potential_context'])) {
      $this
        ->loadContextFilterData($report_data);
      if (isset($report_data['raw']['potential_context']['error'])) {
        $report_data['potential_context'] = FALSE;
      }
      else {
        $report_data['potential_context'] = $this
          ->extractPotentialTargetingValues($report_data['raw']['potential_context']['data']);
      }
    }

    // Agent status
    if (!isset($report_data['status'])) {
      $this
        ->loadAgentStatusData($report_data);
      if (isset($report_data['raw']['status']['error'])) {
        $report_data['status'] = FALSE;
      }
      else {
        $report_data['status'] = $this
          ->extractOverviewReportData($report_data['raw']['status']['data'][$report_data['machine_name']]);
      }
    }

    // Confidence report data.
    if (!isset($report_data['confidence'])) {
      $this
        ->loadConfidenceData($report_data);
      if (isset($report_data['raw']['confidence']['error'])) {
        $report_data['confidence'] = FALSE;
      }
      else {
        $report_data['confidence'] = $this
          ->extractConfidenceReportData($report_data['raw']['confidence']['data']['items']);
      }
    }

    // Targeting report data.
    if (!isset($report_data['targeting'])) {
      $this
        ->loadTargetingData($report_data);
      if (isset($report_data['raw']['targeting']['error']) || !isset($report_data['raw']['targeting']['data']['items'])) {
        $report_data['targeting'] = FALSE;
      }
      else {
        $report_data['targeting'] = $this
          ->extractTargetingReportData($report_data['raw']['targeting']['data']['items']);
      }
    }
    if (!isset($report_data['extracted_total'])) {

      // Combine data to form all campaign report data.
      $this
        ->extractCampaignReportData($report_data);
    }
    return $report_data;
  }

  /**
   * Alter the report data returned from API calls to combine into data that is
   * ready for presentation within individual campaign reports.
   *
   * @param array $report_data
   *   The report data loaded and formatted from Acquia Lift.
   *
   * @see loadReportData()
   * @see extractOverviewReportData()
   * @see extractConfidenceReportData()
   * @see extractPotentialTargetingValues()
   * @see extractTargetingReportData()
   */
  protected function extractCampaignReportData(&$report_data) {
    $report_data['extracted_total'] = TRUE;
    if (!is_array($report_data['status']) || !is_array($report_data['confidence']) || !is_array($report_data['targeting']) || !is_array($report_data['potential_context'])) {
      return;
    }
    $agent_data = $this->agent
      ->getData();
    $isAdaptive = $agent_data['decision_style'] === 'adaptive';

    // Determine overall confidence based on confidence in choices.
    $total_confident = 0;
    if (isset($report_data['confidence']['features'][self::NO_FEATURES])) {
      foreach ($report_data['confidence']['features'][self::NO_FEATURES] as $choice) {
        if ($choice['significant']) {
          $total_confident++;
        }
      }
    }

    // Determine the overall time running for this agent.
    $interval_start = new DateTime();
    $interval_start
      ->setTimestamp($this->agent
      ->getStartTime());
    $interval = date_diff($interval_start, date_create());

    // Update the status report data (used for overview report).
    foreach ($report_data['status'] as &$report) {
      $report['total_lift_positive'] = $report['unformatted']['total_lift'] > self::LIFT_THRESHHOLD && $total_confident > 0;
      $report['total_confident'] = $total_confident;
      $report['confidence_level'] = $total_confident > 0 ? 'high' : 'low';
      $report['time_running'] = isset($interval) ? $interval
        ->format('%mm, %dd') : '1d';
    }

    // Update context report data.
    $option_numbers = array();
    if (isset($report_data['confidence']['features'])) {
      foreach ($report_data['confidence']['features'] as $feature_string => $feature) {

        // Get the user-friendly feature label from the possible contextual values.
        $feature_label = $feature_string;
        if (isset($report_data['potential_context'][$feature_string])) {
          $feature_label = $report_data['potential_context'][$feature_string]['label'];
        }

        // This report only shows features that can be targeted.
        if (!isset($report_data['targeting'][$feature_string])) {
          continue;
        }

        // Get the data from the targeting report for this feature.
        $targeting_data = $report_data['targeting'][$feature_string];

        // Create a hash of choice numbers for stability report.
        // Don't show system-defined features.
        if ($targeting_data['system'] === TRUE) {
          continue;
        }
        foreach ($feature as $choice_id => $choice) {
          $report_data['context']['features'][$feature_string][$choice_id] = array(
            'counter' => $choice['counter'],
            'choice_id' => $choice['choice_id'],
            'best' => $isAdaptive && $targeting_data['favored_selection'] === $choice['raw_label'],
            'decisions' => $choice['decisions'],
            'lift_default' => $choice['control'] ? self::DATA_NA : $choice['lift_default'],
            'lift_default_positive' => $choice['unformatted']['lift_default'] > self::LIFT_THRESHHOLD,
            'lift_random' => $choice['lift_random'],
            'lift_random_positive' => $choice['unformatted']['lift_random'] > self::LIFT_THRESHHOLD,
            'control' => $choice['control'],
            'feature_label' => $feature_label,
            'goals' => $choice['goals'],
            'conversion' => $choice['conversion'],
          );
          $option_numbers[$feature_string . '|' . $choice['raw_label']] = $choice['counter'];
        }
      }
    }

    // Build the experiment report data
    $report_data['experiment']['choices'] = isset($report_data['confidence']['features'][self::NO_FEATURES]) ? $report_data['confidence']['features'][self::NO_FEATURES] : array();

    // Build the stability report data
    foreach ($report_data['targeting'] as $feature_string => &$feature) {
      if ($feature['system']) {
        unset($report_data['targeting'][$feature_string]);
        continue;
      }

      // Get the user-friendly feature label from the possible contextual values.
      $feature['feature_label'] = $feature['label'];
      if (isset($report_data['potential_context'][$feature_string])) {
        $feature['feature_label'] = $report_data['potential_context'][$feature_string]['label'];
      }
      if (isset($option_numbers[$feature_string . '|' . $feature['favored_selection']])) {
        $feature['favored_selection_number'] = $option_numbers[$feature_string . '|' . $feature['favored_selection']];
      }
      if (!$isAdaptive) {
        unset($feature['favored_selection_number']);
        unset($feature['favored_selection']);
      }
    }
  }

  /**
   * Returns a render array representing the overview report for the given dates.
   *
   * @param array $report_data
   *   All of the reporting data for the campaign.
   * @return array
   *   A render array representing the overview report.
   */
  protected function buildOverviewReport($report_data) {
    $report = $report_data['status'];
    if ($report === FALSE) {
      return array();
    }
    if ($report_data['today_only']) {
      $overview_report = $report_data['status']['today'];
    }
    else {
      $overview_report = $report_data['status']['all'];
    }

    // Create report renderable.
    $build = array();
    $build['test_type'] = array(
      '#type' => 'container',
      '#theme' => 'acquia_lift_report_overview',
      '#title' => $overview_report['test_type'],
      '#description' => t('test type'),
      '#attributes' => array(
        'id' => 'acquia-lift-overview-type',
      ),
    );
    if (isset($overview_report['time_running'])) {
      $build['total_running'] = array(
        '#type' => 'container',
        '#theme' => 'acquia_lift_report_overview',
        '#attributes' => array(
          'id' => 'acquia-lift-overview-running',
        ),
        '#title' => $overview_report['time_running'],
        '#description' => t('total time running'),
      );
    }
    $build['shown'] = array(
      '#type' => 'container',
      '#theme' => 'acquia_lift_report_overview',
      '#attributes' => array(
        'id' => 'acquia-lift-overview-shown',
      ),
      '#title' => $overview_report['total_shown'],
      '#description' => format_plural($overview_report['total_shown'], 'time shown', 'times shown'),
    );
    $build['goals'] = array(
      '#type' => 'container',
      '#theme' => 'acquia_lift_report_overview',
      '#attributes' => array(
        'id' => 'acquia-lift-overview-goals',
      ),
      '#title' => $overview_report['total_goals'],
      '#description' => t('goals met'),
    );
    if ($overview_report['total_goals_positive']) {
      $build['goals']['#attributes']['class'] = array(
        'acquia-lift-report-positive',
      );
    }

    /*
     * @todo: Figure out a way to present and explain this information so
     * that we can include these figures.
    $build['lift'] = array(
      '#type' => 'container',
      '#theme' => 'acquia_lift_report_overview',
      '#attributes' => array(
        'id' => 'acquia-lift-overview-lift',
      ),
      '#title' => $overview_report['total_lift'],
      '#description' => t('Predicted lift/control'),
      '#attributes' => array(
        'class' => array(
          $overview_report['total_lift_positive'] ? 'acquia-lift-report-positive' : 'acquia-lift-report-negative',
        ),
      ),
    );
    $build['confidence'] = array(
      '#type' => 'container',
      '#theme' => 'acquia_lift_report_overview',
      '#attributes' => array(
        'id' => 'acquia-lift-overview-confidence',
      ),
      '#title' => t('Confidence'),
      '#description' =>  $overview_report['confidence_level'] == 'high' ? format_plural($overview_report['total_confident'], 'High confidence, 1 var.', 'High confidence, @count vars.') : t('Low confidence'),
      '#attributes' => array(
        'class' => array(
          $overview_report['confidence_level'] == 'high' ? 'acquia-lift-report-positive' : 'acquia-lift-report-negative',
        ),
      ),
      '#total_confident' => $overview_report['total_confident'],
    );
    */
    return $build;
  }

  /**
   * Returns a render array representing the context report.
   *
   * @param array $report_data
   *   Reporting data for the selected dates and decision.
   * @return array
   *   A render array representing the variation set report.
   */
  protected function buildContextReport($report_data) {
    $build = array();
    if ($report_data['confidence'] === FALSE || !isset($report_data['context']['features'])) {
      return array();
    }
    $header = array(
      t('Var.'),
      t('Name'),
      t('Context'),
      t('Shown'),
      t('Goals'),
      t('Conversion rate'),
      t('Lift over control'),
      t('Lift over random'),
    );
    $rows = array();
    foreach ($report_data['context']['features'] as $feature_string => $feature) {
      foreach ($feature as $choice) {
        $lift_default_classes = array();
        if (!$choice['control']) {
          $lift_default_classes = $choice['lift_default_positive'] ? 'acquia-lift-report-positive' : 'acquia-lift-report-negative';
        }
        $row = array();
        $row[] = $this
          ->getVariationLabel($choice['counter'] - 1, $choice['control']);
        if ($choice['control']) {
          $row[] = t('Control: ') . $choice['choice_id'];
        }
        else {
          $row[] = $choice['choice_id'];
        }
        $row[] = array(
          'data' => $choice['best'] ? $choice['feature_label'] . ' <span class="acquia-lift-best">' . t('best') . '</span>' : $choice['feature_label'],
          'class' => $choice['best'] ? array(
            'acquia-lift-context-best',
          ) : array(),
        );
        $row[] = $choice['decisions'];
        $row[] = $choice['goals'];
        $row[] = $choice['conversion'];
        $row[] = array(
          'data' => $choice['lift_default'],
          'class' => $lift_default_classes,
        );
        $row[] = array(
          'data' => $choice['lift_random'],
          'class' => $choice['lift_random_positive'] ? array(
            'acquia-lift-report-positive',
          ) : array(
            'acquia-lift-report-negative',
          ),
        );
        $rows[] = array(
          'data' => $row,
          'class' => $choice['control'] ? array(
            'acquia-lift-report-control',
          ) : array(),
          'no_striping' => $choice['control'],
          'data-acquia-lift-feature' => $feature_string,
        );
      }
    }
    $build['content'] = array(
      '#theme' => 'table',
      '#header' => $header,
      '#rows' => $rows,
      '#sticky' => FALSE,
    );
    return $build;
  }

  /**
   * Returns a render array representing the stability report for targeting
   * features for the given dates.
   *
   * @param array $report_data
   *   Reporting data for the selected dates and decision.
   * @return array
   *   A render array representing the targeting report
   */
  protected function buildStabilityReport($report_data) {
    $build = array();
    if ($report_data['targeting'] === FALSE) {
      return array();
    }
    $data = $report_data['targeting'];
    $rows = array();
    $show_favored_selection = FALSE;
    foreach ($data as $feature => $f) {
      $row_data = array(
        $f['feature_label'],
      );
      if (isset($f['favored_selection_number'])) {
        $show_favored_selection = TRUE;
        $row_data[] = $this
          ->getVariationLabel($f['favored_selection_number'] - 1, $f['favored_selection_number'] == 1);
      }
      $row_data[] = array(
        'data' => $f['percent_traffic'],
        'class' => array(
          $f['percent_traffic_graph'],
        ),
      );
      $row_data[] = array(
        'data' => $f['stability'],
        'class' => $f['stability_positive'] ? array(
          'acquia-lift-report-positive',
        ) : array(
          'acquia-lift-report-negative',
        ),
      );
      $rows[] = array(
        'data' => $row_data,
        'data-acquia-lift-feature' => $feature,
      );
    }
    $header[] = t('Context');
    if ($show_favored_selection) {
      $header[] = t('Best Variation');
    }
    $header[] = t('Percent of Traffic');
    $header[] = t('Stability');
    $build['content'] = array(
      '#theme' => 'table',
      '#header' => $header,
      '#rows' => $rows,
      '#sticky' => FALSE,
    );
    return $build;
  }

  /**
   * Returns a form input array for the context selector.
   *
   * @param array $report_data
   *   Reporting data for the selected dates and decision.
   * @return array
   *   A render array representing the variation set report.
   */
  protected function buildReportContextSelection($report_data) {
    if ($report_data['potential_context'] === FALSE || $report_data['targeting'] === FALSE) {
      return array();
    }
    $context_values = array();
    foreach ($report_data['targeting'] as $code => $feature) {
      if ($feature['system'] === TRUE) {
        continue;
      }
      if (isset($report_data['potential_context'][$code])) {
        $type = empty($report_data['potential_context'][$code]['type']) ? t('Other') : $report_data['potential_context'][$code]['type'];
        $context_values[$type][$code] = $report_data['potential_context'][$code]['name'];
      }
      else {
        $type = t('Other');
        $context_values[$type][$code] = $code;
      }
    }
    if (count($context_values) <= 1) {
      return array();
    }
    return array(
      '#title' => t('Context: '),
      '#type' => 'select',
      '#options' => $context_values,
      '#multiple' => TRUE,
    );
  }

  /**
   * Extracts the required confidence report data from the items returned by Acquia Lift.
   *
   * @param $items
   *   An array of items as return from Acquia Lift.
   * @return array
   *   An associative array with information about the performance of each choice.
   */
  protected function extractConfidenceReportData($items) {
    if (empty($items)) {
      return array();
    }
    $data = array(
      'point' => $items[0]['point'],
      'features' => array(),
      'goal_value_differential' => FALSE,
    );
    $last_group = '';
    $counter = 1;
    foreach ($items as $i => $item) {

      // Check to see if we are in a new grouping of choices.
      $check = $item['feature'] . '|' . $item['point'];
      if ($last_group !== $check) {
        $last_group = $check;
        $counter = 1;
      }
      else {
        $counter++;
      }
      $choice = $option_id = $item['choice'];
      $choice_id = $choice;
      if (strpos($choice, ':') !== FALSE) {
        list($decision_name, $option_id) = explode(':', $choice);

        // @todo: Would like to get rid of this function call in order to make
        // the class unit-testable.
        if ($option_label = personalize_get_option_label_for_decision_and_choice($decision_name, $option_id)) {
          $choice_id = $option_label;
        }
      }
      $data['features'][$item['feature']][$choice] = array(
        'unformatted' => array(
          'lift_default' => $item['lift']['default'],
          'lift_random' => $item['lift']['random'],
        ),
        'counter' => $counter,
        'choice_id' => $choice_id,
        'raw_label' => $option_id,
        'decisions' => format_plural($item['totals']['count'], '1 time', '@count times'),
        'goals' => $item['totals']['goals'],
        'value' => $item['totals']['val'],
        'estimated_value' => $this
          ->formatReportNumber($item['vMean'], TRUE, 4),
        'estimated_lower' => $this
          ->formatReportNumber($item['bLo'], TRUE, 4),
        'estimated_higher' => $this
          ->formatReportNumber($item['bHi'], TRUE, 4),
        'goals_per_decision' => $item['totals']['goals'] == 0 ? self::DATA_NA : $this
          ->formatReportNumber($item['totals']['goalsPerDecision'], FALSE),
        'value_per_decision' => $item['totals']['goals'] == 0 ? self::DATA_NA : $this
          ->formatReportNumber($item['totals']['valPerDecision'], FALSE),
        'selections' => $item['count'],
        'conversion' => $item['totals']['goals'] > 0 ? $this
          ->formatReportPercentage($item['totals']['goals'] / $item['totals']['count']) : self::DATA_NA,
        'confidence' => $counter === 1 ? self::DATA_NA : $this
          ->formatReportPercentage($item['confidence'] / 100),
        'lift_default' => $counter === 1 ? self::DATA_NA : $this
          ->formatReportPercentage($item['lift']['default'] / 100, TRUE),
        'lift_random' => $this
          ->formatReportPercentage($item['lift']['random'] / 100, TRUE),
        'significant' => $item['signif'],
        'control' => $counter === 1,
      );
      if (!$data['goal_value_differential'] && $item['totals']['goals'] != $item['totals']['val']) {
        $data['goal_value_differential'] = TRUE;
      }
    }
    return $data;
  }

  /**
   * Extracts the required targeting report data from the items returned by Acquia Lift.
   *
   * @param $items
   *   An array of items as return from Acquia Lift.
   * @return array
   *   An associative array with feature codes as keys and associative arrays of info as
   *   values.
   */
  protected function extractTargetingReportData($items) {
    if (empty($items)) {
      return array();
    }
    $data = array();
    foreach ($items as $item) {
      $feature = $item['feature'];
      $favored_selection = 0;
      foreach ($item['choices'] as $i => $choice) {

        // Note: Choices are not in order of option.
        if ($choice['score'] > $item['choices'][$favored_selection]['score']) {
          $favored_selection = $i;
        }
      }
      $data[$feature] = array(
        'raw_label' => $item['label'],
        'label' => $item['labelText'],
        'favored_selection' => $item['choices'][$favored_selection]['label'],
        'percent_traffic' => $this
          ->formatReportPercentage($item['percentTraffic']),
        'percent_traffic_graph' => $this
          ->getGraphLevelClass($item['percentTraffic']),
        'predicted_value' => $item['averageResponseValue'],
        'stability' => $this
          ->formatReportNumber($item['stability']),
        'stability_positive' => $item['stability'] > self::STABILITY_THRESHOLD,
        'stability_level' => $item['stabilityLevel'],
        'system' => strpos($item['label'], '[share-alt]') !== FALSE,
      );
    }
    return $data;
  }

  /**
   * Extracts potential targeting values from the raw data returned by Acquia
   * Lift.
   *
   * @param $items
   *   An array of raw potential values.
   * $return array
   *   An associative array of potential targeting features keyed by code.
   */
  protected function extractPotentialTargetingValues($items) {
    $data = array();
    if (isset($items['potential']['features']) && !empty($items['potential']['features'])) {
      foreach ($items['potential']['features'] as $feature) {
        $data[$feature['code']] = array(
          'type' => isset($feature['typeName']) ? $feature['typeName'] : '',
          'name' => $feature['name'] === '-' || $feature['name'] === '0' ? $feature['code'] : $feature['name'],
        );
        $data[$feature['code']]['label'] = empty($data[$feature['code']]['type']) ? $data[$feature['code']]['name'] : $data[$feature['code']]['type'] . ': ' . $data[$feature['code']]['name'];
      }
    }
    return $data;
  }

  /**
   * Gets the appropriate class name for a graph indicating percentage.
   *
   * @param $value
   *   The percentage value expressed as a number between 0 and 1.
   */
  protected function getGraphLevelClass($value) {
    if ($value >= 1) {
      return 'acquia-lift-graph-level-5';
    }
    else {
      if ($value >= 0.8) {
        return 'acquia-lift-graph-level-4';
      }
      else {
        if ($value >= 0.6 && $value < 0.8) {
          return 'acquia-lift-graph-level-3';
        }
        else {
          if ($value >= 0.4 && $value < 0.6) {
            return 'acquia-lift-graph-level-2';
          }
          else {
            if ($value >= 0.2 && $value < 0.4) {
              return 'acquia-lift-graph-level-1';
            }
            else {
              return 'acquia-lift-graph-level-0';
            }
          }
        }
      }
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
AcquiaLiftReport::buildCampaignReports public function Implements PersonalizeAgentReportInterface::buildCampaignReports().
AcquiaLiftReport::buildContextReport protected function Returns a render array representing the context report.
AcquiaLiftReport::buildOverviewReport protected function Returns a render array representing the overview report for the given dates.
AcquiaLiftReport::buildReportContextSelection protected function Returns a form input array for the context selector.
AcquiaLiftReport::buildStabilityReport protected function Returns a render array representing the stability report for targeting features for the given dates.
AcquiaLiftReport::extractCampaignReportData protected function Alter the report data returned from API calls to combine into data that is ready for presentation within individual campaign reports.
AcquiaLiftReport::extractConfidenceReportData protected function Extracts the required confidence report data from the items returned by Acquia Lift.
AcquiaLiftReport::extractPotentialTargetingValues protected function Extracts potential targeting values from the raw data returned by Acquia Lift.
AcquiaLiftReport::extractTargetingReportData protected function Extracts the required targeting report data from the items returned by Acquia Lift.
AcquiaLiftReport::getGraphLevelClass protected function Gets the appropriate class name for a graph indicating percentage.
AcquiaLiftReport::LIFT_THRESHHOLD constant The threshold to use above which lift percentage will be positively noted.
AcquiaLiftReport::loadReportData protected function Loads all of the data necessary to generate the reports for the agent.
AcquiaLiftReport::renderStatsForOptionSet public function Implements PersonalizeAgentReportInterface::renderStatsForOptionSet().
AcquiaLiftReport::STABILITY_THRESHOLD constant The threshold to use above which stability will be positively noted.
AcquiaLiftReportBase::$agent protected property The Acquia Lift agent instance for reporting on.
AcquiaLiftReportBase::$confidence_measure protected property The confidence measure for determining statistical significance.
AcquiaLiftReportBase::$liftAPI protected property An instance of AcquiaLiftAPI.
AcquiaLiftReportBase::$report_data protected property The extracted report data for each of the Acquia Lift API calls keyed by date/feature set requested.
AcquiaLiftReportBase::buildAllConversionReports protected function Builds the conversion reports to show basic conversion metrics for report requested in the report_data.
AcquiaLiftReportBase::buildConversionDetailReport protected function Builds the render array for the metrics portion of the report.
AcquiaLiftReportBase::buildConversionReport public function Implements AcquiaLiftReportInterface()::buildConversionReport(). Overrides AcquiaLiftReportInterface::buildConversionReport
AcquiaLiftReportBase::buildConversionReports protected function Build a set of confidence reports from the report data.
AcquiaLiftReportBase::buildConversionSummaryReport protected function Builds the render array for the summary portion of the report.
AcquiaLiftReportBase::DATA_NA constant The value to show when report data is not applicable.
AcquiaLiftReportBase::extractConversionReportData protected function Extracts data from the raw confidence detail report that is prepared for use within the conversion report rendering process.
AcquiaLiftReportBase::extractConversionSummaryData protected function Extracts data from the raw aggregate confidence report that is prepared for use within the report rendering process.
AcquiaLiftReportBase::extractOverviewReportData protected function Extracts the required overview data from the report data returned by Acquia Lift.
AcquiaLiftReportBase::formatReportNumber protected function Formats a number value for use in reports.
AcquiaLiftReportBase::formatReportPercentage protected function Formats a percentage value for use in reports.
AcquiaLiftReportBase::generateReportConfiguration protected function Generates the general report configuration that is used to load any report.
AcquiaLiftReportBase::getConfidenceDetailReportOptions protected function Helper function to generate the report options necessary to get a detailed confidence report rather than a summary report.
AcquiaLiftReportBase::getConfidenceMeasure public function Implements AcquiaLiftReportInterface()::getConfidenceMeasure(). Overrides AcquiaLiftReportInterface::getConfidenceMeasure
AcquiaLiftReportBase::getConfidenceReportRawName protected function Generates an internal raw report name for a confidence report based on the options.
AcquiaLiftReportBase::getLowConfidenceMessage protected function Generates a message to show when there is insufficient confidence in the test results.
AcquiaLiftReportBase::getVariationLabel protected function Generates the variation abbreviated label.
AcquiaLiftReportBase::loadAgentStatusData protected function Loads the agent status raw reporting data.
AcquiaLiftReportBase::loadConfidenceData protected function Loads the agent confidence raw reporting data.
AcquiaLiftReportBase::loadContextFilterData protected function Loads the context filter raw values into the report data.
AcquiaLiftReportBase::loadConversionReportData protected function Loads and formats the necessary reporting data in order to generate a conversion metrics graph/report.
AcquiaLiftReportBase::loadConversionReportHelper protected function Handles all of the logic to load and extract a conversion report.
AcquiaLiftReportBase::loadTargetingData protected function Loads the agent targeting raw reporting data.
AcquiaLiftReportBase::NO_FEATURES constant The value representing no features applied to an experiment.
AcquiaLiftReportBase::setConfidenceMeasure public function Implements AcquiaLiftReportInterface()::setConfidenceMeasure(). Overrides AcquiaLiftReportInterface::setConfidenceMeasure
AcquiaLiftReportBase::__construct function Constructs an AcquiaLiftReport object