Class: Trevl::DataSource::Cube

Inherits:
Base
  • Object
show all
Includes:
HTTParty
Defined in:
lib/trevl/data_source/cube.rb

Overview

Generic CubeJS data source.

Trevl::DataSource.register("cube", Trevl::DataSource::Cube.new(
url: "https://cube.example.com/cubejs-api/v1",
token: ENV["CUBE_TOKEN"]
))

Constant Summary collapse

EMPTY_RESULT =
{"data" => [], "meta" => {}}.freeze
QUERY_KEYS =
%w[dimensions measures filters timeDimensions order limit].freeze

Instance Method Summary collapse

Methods inherited from Base

#field_names

Constructor Details

#initialize(url:, token: nil) ⇒ Cube

Returns a new instance of Cube.



20
21
22
23
24
# File 'lib/trevl/data_source/cube.rb', line 20

def initialize(url:, token: nil, **)
  super()
  @url = url.to_s.chomp("/")
  @token = token
end

Instance Method Details

#fetch(endpoint, params = {}, resource: nil) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/trevl/data_source/cube.rb', line 26

def fetch(endpoint, params = {}, resource: nil)
  query = build_query(params)
  headers = {"Content-Type" => "application/json", "Accept" => "application/json"}
  headers["Authorization"] = @token if @token

  Trevl.logger.info("[Trevl::DataSource::Cube] Querying #{@url}/load")

  response = self.class.post(
    "#{@url}/load",
    body: {query: query}.to_json,
    headers: headers,
    timeout: 30
  )

  unless response.success?
    Trevl.logger.error("[Trevl::DataSource::Cube] HTTP #{response.code}: #{response.body}")
    return EMPTY_RESULT.dup
  end

  data = JSON.parse(response.body)
  rows = Array(data["data"]).map { |row| flatten_keys(row) }
  {"data" => rows, "meta" => {}}
rescue JSON::ParserError, Timeout::Error, Errno::ECONNREFUSED => e
  Trevl.logger.error("[Trevl::DataSource::Cube] Error: #{e.message}")
  EMPTY_RESULT.dup
end