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