sdk-examples icon indicating copy to clipboard operation
sdk-examples copied to clipboard

How can someone creates a Query object or a LookWithQuery object in Ruby?

Open alan-krumholz opened this issue 5 years ago • 9 comments

How can someone creates a Query object or a LookWithQuery object in Ruby?

In python you show that these can be created by using:

from looker_sdk import models
models.WriteQuery(...)

However, I couldn't find any examples on how to do this in Ruby and they are needed to call run_inline_query() or update_look()

Thanks!

alan-krumholz avatar May 12 '20 19:05 alan-krumholz

the looker-sdk-ruby package just uses hashes instead of class objects or any other strong types. so

query = {model: "mymodel", view: "myview", fields: ["mymodel.somefield"]}
sdk.create_query(query)

we will eventually release a new (strongly typed) version of the ruby sdk using our sdk-codgen project which will probably have something like query = WriteQuery.new(...)

joeldodge79 avatar May 12 '20 23:05 joeldodge79

I see, let me give that a try! thanks @joeldodge79 !

alan-krumholz avatar May 13 '20 00:05 alan-krumholz

@joeldodge79 Could you please let me know if this is what you meant? I get validation failed error :(

require 'looker-sdk'

sdk = LookerSDK::Client.new(
  :client_id => "cccccc",
  :client_secret => "pppppp",
  :api_endpoint => "https://xxxxxxx.looker.com:19999/api/3.1"
)

look = sdk.look(1)

output = sdk.run_inline_query(
    "csv",
    {
        "model" => look.query.model,
        "view" => look.query.view,
        "fields" => look.query.fields,
        "pivots" => look.query.pivots,
        "fill_fields" => look.query.fill_fields,
        "filters" => look.query.filters,
        "sorts" => look.query.sorts,
        "limit" => look.query.limit,
        "column_limit" => look.query.column_limit,
        "total" => look.query.total,
        "row_total" => look.query.row_total,
        "subtotals" => look.query.subtotals,
        "dynamic_fields" => look.query.dynamic_fields,
        "query_timezone" => look.query.query_timezone
    })

print output 

alan-krumholz avatar May 13 '20 00:05 alan-krumholz

What's the error message?

joeldodge79 avatar May 13 '20 14:05 joeldodge79

@joeldodge79 seems like it can't find such method: method_missing Validation Failed (LookerSDK::UnprocessableEntity)

aceback (most recent call last):
        12: from test.rb:11:in `<main>'
        11: from /Library/Ruby/Gems/2.6.0/gems/looker-sdk-0.0.7/lib/looker-sdk/client/dynamic.rb:106:in `method_missing'
        10: from /Library/Ruby/Gems/2.6.0/gems/looker-sdk-0.0.7/lib/looker-sdk/client/dynamic.rb:146:in `invoke_remote'
         9: from /Library/Ruby/Gems/2.6.0/gems/looker-sdk-0.0.7/lib/looker-sdk/client.rb:108:in `post'
         8: from /Library/Ruby/Gems/2.6.0/gems/looker-sdk-0.0.7/lib/looker-sdk/client.rb:304:in `request'
         7: from /Library/Ruby/Gems/2.6.0/gems/sawyer-0.8.2/lib/sawyer/agent.rb:94:in `call'
         6: from /Library/Ruby/Gems/2.6.0/gems/faraday-0.17.3/lib/faraday/connection.rb:175:in `post'
         5: from /Library/Ruby/Gems/2.6.0/gems/faraday-0.17.3/lib/faraday/connection.rb:387:in `run_request'
         4: from /Library/Ruby/Gems/2.6.0/gems/faraday-0.17.3/lib/faraday/rack_builder.rb:143:in `build_response'
         3: from /Library/Ruby/Gems/2.6.0/gems/faraday-0.17.3/lib/faraday/response.rb:8:in `call'
         2: from /Library/Ruby/Gems/2.6.0/gems/faraday-0.17.3/lib/faraday/response.rb:61:in `on_complete'
         1: from /Library/Ruby/Gems/2.6.0/gems/faraday-0.17.3/lib/faraday/response.rb:9:in `block in call'
/Library/Ruby/Gems/2.6.0/gems/looker-sdk-0.0.7/lib/looker-sdk/response/raise_error.rb:39:in `on_complete': Validation Failed (LookerSDK::UnprocessableEntity)

alan-krumholz avatar May 13 '20 14:05 alan-krumholz

that's a misleading line in the stack trace - the sdk implementation relies on "missing_method" to dynamically dispatch to the correct api call.

The Validation Failed (LookerSDK::UnprocessableEntity) is actually being returned by API - which is funny because you're just supplying the values from the look.query - I suspect that maybe look.query.query_timezone isn't in the correct format that query_timezone wants. Try leaving it off to check. If that's not in then you can bisect the query body to identify which query property(ies) you're passing in that our API doesn't like

joeldodge79 avatar May 13 '20 15:05 joeldodge79

@joeldodge79 query_timezone seems fine. The problem seems to be with "filters" => look.query.filters

I'll play around with this one to see if I can make it work

alan-krumholz avatar May 13 '20 15:05 alan-krumholz

@joeldodge79
Maybe it is a bug but I don't need to copy the filter over anyways (this is the thing I do want to change :))

and that seems to work fine for me:

output = sdk.run_inline_query(
    "csv",
    {
        "model" => look.query.model,
        "view" => look.query.view,
        "fields" => look.query.fields,
        "pivots" => look.query.pivots,
        "fill_fields" => look.query.fill_fields,
        "filters" => {
            'x.id' => '255'},
        "sorts" => look.query.sorts,
        "limit" => look.query.limit,
        "column_limit" => look.query.column_limit,
        "total" => look.query.total,
        "row_total" => look.query.row_total,
        "subtotals" => look.query.subtotals,
        "dynamic_fields" => look.query.dynamic_fields,
        "query_timezone" => look.query.query_timezone
    })

Thank you

alan-krumholz avatar May 13 '20 16:05 alan-krumholz

interesting, ok well glad you're unblocked

joeldodge79 avatar May 13 '20 18:05 joeldodge79