Class: Jaql::SqlGeneration::Query
- Inherits:
-
Object
- Object
- Jaql::SqlGeneration::Query
- Includes:
- QueryParsing
- Defined in:
- lib/jaql/sql_generation/query.rb
Direct Known Subclasses
Constant Summary collapse
- ARRAY_RETURN_TYPE =
:array- ROW_RETURN_TYPE =
:row
Instance Attribute Summary collapse
-
#table_name_alias ⇒ Object
readonly
public.
Instance Method Summary collapse
- #fields_sql ⇒ Object
-
#initialize(run_context, spec, resolver, table_name_alias = nil) ⇒ Query
constructor
A new instance of Query.
- #json_array_sql(cte, display_name) ⇒ Object
- #json_row_sql(cte, display_name) ⇒ Object
- #json_sql(cte, display_name, return_type) ⇒ Object
- #scope_options ⇒ Object
Constructor Details
#initialize(run_context, spec, resolver, table_name_alias = nil) ⇒ Query
10 11 12 13 14 15 16 17 18 19 |
# File 'lib/jaql/sql_generation/query.rb', line 10 def initialize(run_context, spec, resolver, table_name_alias=nil) @run_context = run_context or fail "#{self.class} must be initialized with a run_context" @resolver = resolver or fail "#{self.class} must be initialized with a resolver" @table_name_alias = table_name_alias # TODO deep stringify keys when spec is a hash hash_spec = spec.is_a?(String) ? JSON.parse(spec) : spec || {} validate!(hash_spec) @spec = hash_spec end |
Instance Attribute Details
#table_name_alias ⇒ Object (readonly)
public
6 7 8 |
# File 'lib/jaql/sql_generation/query.rb', line 6 def table_name_alias @table_name_alias end |
Instance Method Details
#fields_sql ⇒ Object
50 51 52 53 54 |
# File 'lib/jaql/sql_generation/query.rb', line 50 def fields_sql return "#{query_table_name}.*" if fields.empty? fields.map {|field| field.to_sql}.join(",\n") end |
#json_array_sql(cte, display_name) ⇒ Object
42 43 44 |
# File 'lib/jaql/sql_generation/query.rb', line 42 def json_array_sql(cte, display_name) json_sql(cte, display_name, ARRAY_RETURN_TYPE) end |
#json_row_sql(cte, display_name) ⇒ Object
46 47 48 |
# File 'lib/jaql/sql_generation/query.rb', line 46 def json_row_sql(cte, display_name) json_sql(cte, display_name, ROW_RETURN_TYPE) end |
#json_sql(cte, display_name, return_type) ⇒ Object
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/jaql/sql_generation/query.rb', line 24 def json_sql(cte, display_name, return_type) display_name or raise "display_name cannot be blank" rel = run_context.tmp_relation_name select_sql = case return_type when ARRAY_RETURN_TYPE "coalesce(json_agg(#{rel}), '[]'::JSON)" when ROW_RETURN_TYPE "row_to_json(#{rel})" # uncomment this to return {} instead of nil for empty rows # "coalesce(row_to_json(#{rel}), '{}'::JSON)" else fail "unknown return type: '#{return_type}'" end %Q{( SELECT #{select_sql} AS "#{display_name}" FROM (#{cte}) #{rel} )} end |
#scope_options ⇒ Object
56 57 58 |
# File 'lib/jaql/sql_generation/query.rb', line 56 def spec.slice(*ASSOCIATION_SCOPE_OPTION_KEYS) end |