Class: AnalyticsOps::Clients::BigQuery
- Inherits:
-
Object
- Object
- AnalyticsOps::Clients::BigQuery
- 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 =
Instance Method Summary collapse
-
#initialize(settings:, service_account: nil, client: nil, timeout: nil, logger: nil) ⇒ BigQuery
constructor
A new instance of BigQuery.
- #run(definition) ⇒ AnalyticsOps::BigQuery::Result
- #run_funnel(definition, start_suffix:, end_suffix:) ⇒ Object
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 = 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 |