Current File : /var/www/pediatribu/wp-content/plugins/independent-analytics/IAWP/Rows/Rows.php |
<?php
namespace IAWP\Rows;
use IAWP\Date_Range\Date_Range;
use IAWP\Form_Submissions\Form;
use IAWP\Illuminate_Builder;
use IAWP\Query;
use IAWP\Sort_Configuration;
use IAWP\Tables;
use IAWPSCOPED\Illuminate\Database\Query\Builder;
/** @internal */
abstract class Rows
{
protected $tables = Tables::class;
protected $date_range;
protected $number_of_rows;
/** @var Filter[] */
protected $filters;
protected $sort_configuration;
private $rows = null;
public function __construct(Date_Range $date_range, ?int $number_of_rows = null, ?array $filters = null, ?Sort_Configuration $sort_configuration = null)
{
$this->date_range = $date_range;
$this->number_of_rows = $number_of_rows;
$this->filters = $filters ?? [];
$this->sort_configuration = $sort_configuration ?? new Sort_Configuration('visitors');
}
protected abstract function fetch_rows() : array;
public abstract function attach_filters(Builder $query) : void;
public function rows()
{
if (\is_array($this->rows)) {
return $this->rows;
}
$this->rows = $this->fetch_rows();
return $this->rows;
}
/**
* @return string[]
*/
protected function calculated_columns() : array
{
$calculated_columns = ['comments', 'exit_percent', 'views_per_session', 'views_growth', 'visitors_growth', 'bounce_rate', 'wc_net_sales', 'wc_conversion_rate', 'wc_earnings_per_visitor', 'wc_average_order_volume', 'form_conversion_rate'];
foreach (Form::get_forms() as $form) {
$calculated_columns[] = $form->conversion_rate_column();
}
return $calculated_columns;
}
protected function is_a_calculated_column(string $column_name) : bool
{
return \in_array($column_name, $this->calculated_columns());
}
protected function is_using_a_calculated_column() : bool
{
$is_using_a_calculated_column = \false;
foreach ($this->filters as $filter) {
if (\in_array($filter->column(), $this->calculated_columns())) {
$is_using_a_calculated_column = \true;
}
}
if (\in_array($this->sort_configuration->column(), $this->calculated_columns())) {
$is_using_a_calculated_column = \true;
}
return $is_using_a_calculated_column;
}
protected function get_current_period_iso_range() : array
{
return [$this->date_range->iso_start(), $this->date_range->iso_end()];
}
protected function appears_to_be_for_real_time_analytics() : bool
{
$difference_in_seconds = $this->date_range->end()->getTimestamp() - $this->date_range->start()->getTimestamp();
$one_hour_in_seconds = 3600;
return $difference_in_seconds < $one_hour_in_seconds;
}
protected function get_previous_period_iso_range() : array
{
return [$this->date_range->previous_period()->iso_start(), $this->date_range->previous_period()->iso_end()];
}
protected function get_form_submissions_query() : Builder
{
$form_submissions_table = Query::get_table_name(Query::FORM_SUBMISSIONS);
return Illuminate_Builder::new()->select(['form_id', 'view_id'])->selectRaw('COUNT(*) AS form_submissions')->from($form_submissions_table, 'form_submissions')->whereBetween('created_at', $this->get_current_period_iso_range())->groupBy(['form_id', 'view_id']);
}
}