class OpalORM::QueryBuilder

Constants

DATATYPES

Attributes

query[R]

Public Class Methods

create_table_query(name, &prc) click to toggle source
# File lib/opal_orm/query_builder.rb, line 12
def self.create_table_query(name, &prc)
  manager = new(name)
  prc.call(manager)

  manager.build!
end
new(name) click to toggle source
# File lib/opal_orm/query_builder.rb, line 21
def initialize(name)
  @table_name = name
  @columns = []
  @foreign_keys = []
end

Public Instance Methods

build!() click to toggle source

def foreign_key(ref_name)

@foreign_keys << ref_name

end

# File lib/opal_orm/query_builder.rb, line 47
def build!
  query_start = "CREATE TABLE #{@table_name} ("
  
  column_queries = @columns.map do |col_info|
    result = ["#{col_info[:name]}"]
    result << get_datatype_string(col_info[:type])

    unless col_info[:options].nil?
      col_info[:options].each do |key|
        case col_info[:options]
        when :null
          result << "NOT NULL" unless col_info[:options][:null]
        end
      end
    end

    result.join(" ")
  end
  column_queries.unshift("id INTEGER PRIMARY KEY")

  foreign_keys = @foreign_keys.map do |ref_name|
    if foreign_key_valid?(ref_name)
      "FOREIGN KEY(#{ref_name}) REFERENCES #{@table_name.singularize}(id)"
    else
      raise ForeignKeyMissingError, "Error adding foreign key constraint for #{ref_name}: couldn't find column named #{ref_name}."
    end
  end

  query_end = ");"

  @query = query_start + column_queries.concat(foreign_keys).join(",\n") + query_end
  @query
end
float(name, *options) click to toggle source
# File lib/opal_orm/query_builder.rb, line 35
def float(name, *options)
  @columns << {type: :float, name: name, options: options}
end
foreign_key_valid?(key) click to toggle source
# File lib/opal_orm/query_builder.rb, line 85
def foreign_key_valid?(key)
  @columns.any? {|col| key == col[:name]}
end
get_datatype_string(type) click to toggle source
# File lib/opal_orm/query_builder.rb, line 81
def get_datatype_string(type)
  DATATYPES[type]
end
integer(name, *options) click to toggle source
# File lib/opal_orm/query_builder.rb, line 31
def integer(name, *options)
  @columns << {type: :integer, name: name, options: options}
end
string(name, *options) click to toggle source
# File lib/opal_orm/query_builder.rb, line 27
def string(name, *options)
  @columns << {type: :string, name: name, options: options}
end
text(name, *options) click to toggle source
# File lib/opal_orm/query_builder.rb, line 39
def text(name, *options)
  @columns << {type: :text, name: name, options: options}
end