class Graphlyte::Query

Attributes

name[R]

Public Class Methods

new(query_name=nil, **hargs) click to toggle source
Calls superclass method Graphlyte::Fieldset::new
# File lib/graphlyte/query.rb, line 7
def initialize(query_name=nil, **hargs)
  @name = query_name
  super(**hargs)
end

Public Instance Methods

flatten(fields, new_fields = {}) click to toggle source
# File lib/graphlyte/query.rb, line 79
def flatten(fields, new_fields = {})
  fields.each do |field|
    if field.class.eql?(Fragment)
      new_fields[field.fragment] = field
      unless field.empty?
        flatten(field.fields, new_fields)
      end
    else
      if field.fieldset.class.eql?(Fragment)
        new_fields[field.fieldset.fragment] = field.fieldset
      end
      flatten(field.fieldset.fields, new_fields) unless field.atomic?
    end
  end
  new_fields
end
flatten_variables(fields, variables=[]) click to toggle source
# File lib/graphlyte/query.rb, line 67
def flatten_variables(fields, variables=[])
  fields.each do |field|
    variables.concat field.inputs.extract_variables unless field.class.eql?(Fragment)
    if field.class.eql?(Fragment)
      flatten_variables(field.fields, variables)
    else
      flatten_variables(field.fieldset.fields, variables)
    end
  end
  variables
end
format_fragments() click to toggle source
# File lib/graphlyte/query.rb, line 57
def format_fragments
  str = "\n"
  flatten(builder.>>).each do |_, fragment|
    str += "\nfragment #{fragment.fragment}"
    str += " on #{fragment.model_name}" unless fragment.model_name.nil?
    str += " {\n#{fragment.fields.map {|f| f.to_s(1) }.join("\n")}\n}"
  end
  str
end
merge_variable_types(variables=[], hargs) click to toggle source
# File lib/graphlyte/query.rb, line 36
def merge_variable_types(variables=[], hargs)
  variables.inject([]) do |memo, var|
    unless var.formal?
      if hargs[var.value].is_a? String
        memo << [var.value.to_camel_case, "String"]
      elsif [TrueClass, FalseClass].include? hargs[var.value].class
        memo << [var.value ,"Boolean"]
      elsif hargs[var.value].is_a? Float
        memo << [var.value, "Float"]
      elsif hargs[var.value].is_a? Integer
        memo << [var.value, "Int"]
      elsif hargs[var.value].is_a? Array
        memo <<  "[#{merge_variable_types(var.value, hargs).first}]"
      end
    else
      memo << [var.value.placeholder, var.value.name]
    end
    memo
  end
end
placeholders() click to toggle source
# File lib/graphlyte/query.rb, line 12
def placeholders
  flatten_variables(builder.>>).map do |value|
    ":#{value.value.placeholder} of #{value.value.name}"
  end.join("\n")
end
to_json(name="anonymousQuery", **hargs) click to toggle source
# File lib/graphlyte/query.rb, line 18
def to_json(name="anonymousQuery", **hargs)
  variables = flatten_variables(builder.>>)
  types = merge_variable_types(variables, hargs)

  str = "query #{name}"
  unless types.empty?
    type_new = types.map do |type_arr|
      "$#{type_arr[0].to_camel_case}: #{type_arr[1]}"
    end
    str += "(#{type_new.join(", ")})"
  end
  { query: "#{str} #{to_s(1)}", variables: Arguments::Set.new(hargs).to_h }.to_json
end
to_s(indent=0) click to toggle source
# File lib/graphlyte/query.rb, line 32
def to_s(indent=0)
  "{\n#{super(indent + 1)}\n}#{format_fragments}"
end