class HuggORM::Query

Attributes

_command[R]
_limit[R]
_offset[R]
_order[R]
_returning[R]
_where[R]
column_name[R]
table[R]
values[R]

Public Class Methods

new(table, column_name = 'data') click to toggle source
# File lib/hugg_orm/query.rb, line 6
def initialize(table, column_name = 'data')
  @table = table
  @column_name = column_name
  @values = []
end

Public Instance Methods

count() click to toggle source
# File lib/hugg_orm/query.rb, line 52
def count
  @_command = "SELECT COUNT(*) FROM #{@table}"
  run.getvalue(0, 0).to_i
end
delete() click to toggle source
# File lib/hugg_orm/query.rb, line 47
def delete
  @_command = "DELETE FROM #{@table}"
  run.cmd_tuples
end
insert(data) click to toggle source
# File lib/hugg_orm/query.rb, line 22
def insert(data)
  @_command = "INSERT INTO #{@table} (#{@column_name}) VALUES (#{next_placeholder})"
  @values << data.to_json
  pg_result = run
  pg_result.cmd_tuples
end
limit(limit, offset = nil) click to toggle source
# File lib/hugg_orm/query.rb, line 64
def limit(limit, offset = nil)
  @_limit = "LIMIT #{next_placeholder}"
  @values << limit
  self.offset(offset) if offset
  self
end
offset(offset) click to toggle source
# File lib/hugg_orm/query.rb, line 71
def offset(offset)
  @_offset = "OFFSET #{next_placeholder}"
  @values << offset
  self
end
order(*args) click to toggle source
# File lib/hugg_orm/query.rb, line 77
def order(*args)
  fields = []
  args.first.each_pair { |field, order| fields << "#{wrap_json(field)} #{order}" }
  @_order = "ORDER BY #{fields.join(', ')}"
  self
end
run() click to toggle source
# File lib/hugg_orm/query.rb, line 12
def run
  HuggORM::Connection.db.exec_params(to_sql, @values)
end
select() click to toggle source
# File lib/hugg_orm/query.rb, line 41
def select
  @_command = "SELECT #{@column_name} FROM #{@table}"
  pg_result = run
  pg_result.map { |tuple| deserialize(tuple["#{@column_name}"]) }
end
to_sql() click to toggle source
# File lib/hugg_orm/query.rb, line 16
def to_sql
  sql = "#{@_command} #{@_where} #{@_order} #{@_limit} #{@_offset} #{@_returning}".strip
  sql.gsub!(/\s{2,}/, ' ')
  sql
end
update(data, return_data = false) click to toggle source
# File lib/hugg_orm/query.rb, line 29
def update(data, return_data = false)
  @_command = "UPDATE #{@table} SET #{@column_name} = #{@column_name} || #{next_placeholder}::jsonb"
  @values << data.to_json

  if return_data
    @_returning = "RETURNING #{@column_name}"
    return run.map { |tuple| deserialize(tuple["#{@column_name}"]) }
  end

  run.cmd_tuples
end
where(conditions, values = []) click to toggle source
# File lib/hugg_orm/query.rb, line 57
def where(conditions, values = [])
  values.size.times { |i| conditions.sub!(/\?/, next_placeholder(i + 1)) }
  @_where = "WHERE #{conditions}"
  @values += values
  self
end

Private Instance Methods

deserialize(data) click to toggle source
# File lib/hugg_orm/query.rb, line 86
def deserialize(data)
  JSON.parse(data, symbolize_names: true)
end
next_placeholder(offset = 1) click to toggle source
# File lib/hugg_orm/query.rb, line 90
def next_placeholder(offset = 1)
  "$#{@values.size + offset}"
end
wrap_json(field) click to toggle source
# File lib/hugg_orm/query.rb, line 94
def wrap_json(field)
  "#{@column_name}->>'#{field}'"
end