Class: Trevl::DataSource::Cube
- 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
- #fetch(endpoint, params = {}, resource: nil) ⇒ Object
-
#initialize(url:, token: nil) ⇒ Cube
constructor
A new instance of Cube.
Methods inherited from Base
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.}") EMPTY_RESULT.dup end |