class Graffiti::SquishSelect

Public Class Methods

new(config, query) click to toggle source
Calls superclass method Graffiti::SquishQuery::new
# File lib/graffiti/squish.rb, line 267
def initialize(config, query)
  super(config, query)

  if @key   # initialized from a String, not a Hash
    'SELECT' == @key or raise ProgrammingError,
      'Wrong query type: SELECT expected intead of ' + @key

    @nodes = @nodes.split(/\s*,\s*/).map {|node|
      validate_expression(node)
    }
  end
end

Public Instance Methods

to_sql() click to toggle source

translate Squish SELECT query to SQL

# File lib/graffiti/squish.rb, line 282
def to_sql
  where = @sql_mapper.where

  select = @nodes.dup
  select.push(@order) unless @order.empty? or @nodes.include?(@order)

  # now put it all together
  sql = %{\nFROM #{@sql_mapper.from}}
  sql << %{\nWHERE #{where}} unless where.empty?
  sql << %{\nGROUP BY #{@group}} unless @group.empty?
  sql << %{\nORDER BY #{@order} #{@order_dir}} unless @order.empty?

  select = select.map do |expr|
    bind_blank_nodes(expr) + (BN.match(expr) ? (' AS ' + $1) : '')
  end
  sql = 'SELECT DISTINCT ' << select.join(', ') << bind_blank_nodes(sql)

  sql =~ /\?/ and raise ProgrammingError,
    "Unexpected '?' in translated query (probably, caused by unmapped blank node): #{sql.gsub(/\s+/, ' ')};"

  substitute_literals(sql)
end

Private Instance Methods

bind_blank_nodes(sql) click to toggle source

replace blank node names with bindings

# File lib/graffiti/squish.rb, line 309
def bind_blank_nodes(sql)
  sql.gsub(BN_SCAN) {|node| @sql_mapper.bind(node) }
end