class PgExecArrayParams::Rewriters::AExpr

Constants

KIND

Private Instance Methods

assign_param_via_eq?() click to toggle source

$1

{“kind”=>0, “{”str“=>”=“}}”>name“=>,

"lexpr"=>{"ColumnRef"=>{"fields"=>[{"String"=>{"str"=>"companies"}}, {"String"=>{"str"=>"id"}}],
                        "location"=>1242}},
"rexpr"=>{"ParamRef"=>{"number"=>4, "location"=>1261}}, "location"=>1259}
# File lib/pg_exec_array_params/rewriters/a_expr.rb, line 50
def assign_param_via_eq?
  (value[KIND] == EQ_KIND) && value[REXPR].is_a?(Hash) && value[REXPR].key?(PARAM_REF)
end
assign_param_via_in?() click to toggle source

IN ($1), returns number of nested REFs

# File lib/pg_exec_array_params/rewriters/a_expr.rb, line 55
def assign_param_via_in?
  (value[KIND] == IN_KIND) && value[REXPR].is_a?(Array) && value[REXPR].count { |vexpr| vexpr.key?(PARAM_REF) }
end
refs_at() click to toggle source
# File lib/pg_exec_array_params/rewriters/a_expr.rb, line 59
def refs_at
  first_ref = wrap_array(value[REXPR]).find { |vexpr| vexpr.key?(PARAM_REF) }&.fetch(PARAM_REF, {})
  last_ref = wrap_array(value[REXPR]).reverse.find { |vexpr| vexpr.key?(PARAM_REF) }&.fetch(PARAM_REF, {})
  return unless (start_ref_loc = first_ref[LOCATION])

  return unless (end_ref_loc = last_ref[LOCATION])

  started = start_ref_loc + 1
  ended = end_ref_loc + last_ref.fetch(NUMBER, '').to_s.size
  [started, ended - started]
end
rewrite!() click to toggle source
# File lib/pg_exec_array_params/rewriters/a_expr.rb, line 25
def rewrite!
  # puts({value_before: value}.inspect)
  old_ref_idx = value[REXPR][PARAM_REF][NUMBER] - 1 # one based
  unless (new_ref_idx = ref_idx[old_ref_idx])
    raise Error.new("No parameter for $#{old_ref_idx + 1}", nil, self)
  end

  if new_ref_idx.is_a?(Array)
    value[KIND] = IN_KIND
    value[REXPR] = Range.new(*new_ref_idx).map do |param_ref_idx|
      { PARAM_REF => { NUMBER => param_ref_idx } }
    end
  else
    value[REXPR][PARAM_REF][NUMBER] = new_ref_idx
    # nested_refs == 1 unwraps, wrap it back
    value[REXPR] = [value[REXPR]] if value[KIND] == IN_KIND
  end
  # puts({value_after_: value}.inspect)
end
should_rewrite?() click to toggle source
# File lib/pg_exec_array_params/rewriters/a_expr.rb, line 10
def should_rewrite?
  return true if assign_param_via_eq?

  if (nested_refs = assign_param_via_in?)
    if nested_refs == 1
      value[REXPR] = value[REXPR].first
      return true
    else
      suggest_n = value[REXPR].first[PARAM_REF][NUMBER]
      raise Error.new("Leave only `= $#{suggest_n}` and pass an array", nil, self)
    end
  end
  false
end
wrap_array(object) click to toggle source
# File lib/pg_exec_array_params/rewriters/a_expr.rb, line 71
def wrap_array(object)
  if object.respond_to?(:to_ary)
    object.to_ary || [object]
  else
    [object]
  end
end