Class: AnalyticsOps::Clients::BigQuery

Inherits:
Object
  • Object
show all
Defined in:
lib/analytics_ops/clients/bigquery.rb,
sig/analytics_ops.rbs

Overview

Optional official BigQuery client boundary. It exposes no arbitrary SQL API.

Constant Summary collapse

PROJECT_ID =
/\A[a-z][a-z0-9-]{4,28}[a-z0-9]\z/
DATASET =
/\A[A-Za-z_][A-Za-z0-9_]{0,1023}\z/
RECIPES =
{
  "event_counts" => lambda do |table|
    <<~SQL
      SELECT event_name, COUNT(*) AS event_count
      FROM `#{table}`
      WHERE _TABLE_SUFFIX BETWEEN @start_suffix AND @end_suffix
      GROUP BY event_name
      ORDER BY event_count DESC
      LIMIT @row_limit
    SQL
  end,
  "daily_events" => lambda do |table|
    <<~SQL
      SELECT event_date, COUNT(*) AS event_count
      FROM `#{table}`
      WHERE _TABLE_SUFFIX BETWEEN @start_suffix AND @end_suffix
      GROUP BY event_date
      ORDER BY event_date
      LIMIT @row_limit
    SQL
  end,
  "page_views" => lambda do |table|
    <<~SQL
      SELECT
        REGEXP_REPLACE(
          (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location'),
          r'\\?.*$',
          ''
        ) AS page_location,
        COUNT(*) AS page_views
      FROM `#{table}`
      WHERE _TABLE_SUFFIX BETWEEN @start_suffix AND @end_suffix
        AND event_name = 'page_view'
      GROUP BY page_location
      ORDER BY page_views DESC
      LIMIT @row_limit
    SQL
  end,
  "event_sample" => lambda do |table|
    <<~SQL
      SELECT
        event_date,
        TIMESTAMP_MICROS(event_timestamp) AS event_time,
        event_name,
        platform,
        device.category AS device_category
      FROM `#{table}`
      WHERE _TABLE_SUFFIX BETWEEN @start_suffix AND @end_suffix
      ORDER BY event_timestamp DESC
      LIMIT @row_limit
    SQL
  end
}.freeze
Funnels =

Returns:

  • (:Definition definition,)

Instance Method Summary collapse

Constructor Details

#initialize(settings:, service_account: nil, client: nil, timeout: nil, logger: nil) ⇒ BigQuery

Returns a new instance of BigQuery.



67
68
69
70
71
72
73
# File 'lib/analytics_ops/clients/bigquery.rb', line 67

def initialize(settings:, service_account: nil, client: nil, timeout: nil, logger: nil)
  @settings = validate_settings(settings)
  @service_account = 
  @client = client
  @timeout = timeout
  @logger = logger
end

Instance Method Details

#run(definition) ⇒ AnalyticsOps::BigQuery::Result



75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/analytics_ops/clients/bigquery.rb', line 75

def run(definition)
  unless definition.is_a?(AnalyticsOps::BigQuery::Definition)
    raise InvalidRequestError, "BigQuery report must be a BigQuery::Definition"
  end

  sql = RECIPES.fetch(definition.name).call(table_pattern)
  params = {
    start_suffix: definition.start_suffix,
    end_suffix: definition.end_suffix,
    row_limit: definition.limit
  }
  execute_query(definition.name, sql, params, definition.limit)
end

#run_funnel(definition, start_suffix:, end_suffix:) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/analytics_ops/clients/bigquery.rb', line 89

def run_funnel(definition, start_suffix:, end_suffix:)
  unless definition.is_a?(Funnels::Definition)
    raise InvalidRequestError, "funnel must be an AnalyticsOps::Funnels::Definition"
  end
  unless [start_suffix, end_suffix].all? { |value| value.is_a?(String) && value.match?(/\A\d{8}\z/) } &&
         start_suffix <= end_suffix
    raise InvalidRequestError, "Funnel date range is invalid"
  end

  sql, params = funnel_query(definition, start_suffix:, end_suffix:)
  execute_query("funnel_#{definition.name}", sql, params, definition.steps.length)
end