Class DataMapper::Query
In: lib/data_mapper/query.rb
lib/data_mapper/query.rb
Parent: Object

This class handles option parsing and SQL generation.

Methods

new   new   parameters   parameters   to_sql   to_sql  

Constants

OPTIONS = [ :select, :offset, :limit, :include, :reload, :conditions, :join, :order, :after_row_materialization   These are the standard finder options
OPTIONS = [ :select, :offset, :limit, :include, :reload, :conditions, :join, :order, :after_row_materialization   These are the standard finder options

Public Class methods

[Source]

    # File lib/data_mapper/query.rb, line 11
11:     def initialize(adapter, klass, options = {})
12:       # Set some of the standard options
13:       @adapter, @klass = adapter, klass
14:       @from = @adapter.table(@klass)
15:       @parameters = []
16:       @joins = []
17:       
18:       # Parse simple options
19:       @limit =          options.fetch(:limit, nil)
20:       @offset =         options.fetch(:offset, nil)
21:       @reload =         options.fetch(:reload, false)
22:       @order =          options.fetch(:order, nil)
23:       @after_row_materialization = options.fetch(:after_row_materialization, nil)
24:       
25:       # Parse :include option
26:       @includes = case include_options = options[:include]
27:         when Array then include_options.dup
28:         when Symbol then [include_options]
29:         when NilClass then []
30:         else raise ArgumentError.new(":include must be an Array, Symbol or nil, but was #{include_options.inspect}")
31:       end
32:       
33:       # Include lazy columns if specified in :include option
34:       @columns = @from.columns.select do |column|
35:         !column.lazy? || @includes.delete(column.name)
36:       end
37:       
38:       # Qualify columns with their table name if joins are present
39:       @qualify = !@includes.empty?
40:       
41:       # Generate SQL for joins
42:       @includes.each do |association_name|
43:         association = @from.associations[association_name]
44:         @joins << association.to_sql
45:         @columns += association.associated_table.columns.select do |column|
46:           !column.lazy?
47:         end
48:       end
49:       
50:       # Prepare conditions for parsing
51:       @conditions = []
52:       
53:       # Each non-standard option is assumed to be a column
54:       options.each_pair do |k,v|
55:         unless OPTIONS.include?(k)
56:           append_condition(k, v)
57:         end
58:       end
59:       
60:       # If a :conditions option is present, parse it
61:       if conditions_option = options[:conditions]
62:         if conditions_option.is_a?(String)
63:           @conditions << conditions_option
64:         else
65:           append_condition(*conditions_option)
66:         end
67:       end
68:       
69:       # If the table is paranoid, add a filter to the conditions
70:       if @from.paranoid?
71:         @conditions << "#{@from.paranoid_column.to_sql(qualify?)} IS NULL OR #{@from.paranoid_column.to_sql(qualify?)} > #{@adapter.class::SYNTAX[:now]}"
72:       end
73:       
74:     end

[Source]

    # File lib/data_mapper/query.rb, line 11
11:     def initialize(adapter, klass, options = {})
12:       # Set some of the standard options
13:       @adapter, @klass = adapter, klass
14:       @from = @adapter.table(@klass)
15:       @parameters = []
16:       @joins = []
17:       
18:       # Parse simple options
19:       @limit =          options.fetch(:limit, nil)
20:       @offset =         options.fetch(:offset, nil)
21:       @reload =         options.fetch(:reload, false)
22:       @order =          options.fetch(:order, nil)
23:       @after_row_materialization = options.fetch(:after_row_materialization, nil)
24:       
25:       # Parse :include option
26:       @includes = case include_options = options[:include]
27:         when Array then include_options.dup
28:         when Symbol then [include_options]
29:         when NilClass then []
30:         else raise ArgumentError.new(":include must be an Array, Symbol or nil, but was #{include_options.inspect}")
31:       end
32:       
33:       # Include lazy columns if specified in :include option
34:       @columns = @from.columns.select do |column|
35:         !column.lazy? || @includes.delete(column.name)
36:       end
37:       
38:       # Qualify columns with their table name if joins are present
39:       @qualify = !@includes.empty?
40:       
41:       # Generate SQL for joins
42:       @includes.each do |association_name|
43:         association = @from.associations[association_name]
44:         @joins << association.to_sql
45:         @columns += association.associated_table.columns.select do |column|
46:           !column.lazy?
47:         end
48:       end
49:       
50:       # Prepare conditions for parsing
51:       @conditions = []
52:       
53:       # Each non-standard option is assumed to be a column
54:       options.each_pair do |k,v|
55:         unless OPTIONS.include?(k)
56:           append_condition(k, v)
57:         end
58:       end
59:       
60:       # If a :conditions option is present, parse it
61:       if conditions_option = options[:conditions]
62:         if conditions_option.is_a?(String)
63:           @conditions << conditions_option
64:         else
65:           append_condition(*conditions_option)
66:         end
67:       end
68:       
69:       # If the table is paranoid, add a filter to the conditions
70:       if @from.paranoid?
71:         @conditions << "#{@from.paranoid_column.to_sql(qualify?)} IS NULL OR #{@from.paranoid_column.to_sql(qualify?)} > #{@adapter.class::SYNTAX[:now]}"
72:       end
73:       
74:     end

Public Instance methods

Parameters for query

[Source]

    # File lib/data_mapper/query.rb, line 86
86:     def parameters
87:       @parameters
88:     end

Parameters for query

[Source]

    # File lib/data_mapper/query.rb, line 86
86:     def parameters
87:       @parameters
88:     end

SQL for query

[Source]

    # File lib/data_mapper/query.rb, line 77
77:     def to_sql
78:       sql = "SELECT #{columns.map { |column| column.to_sql(qualify?) }.join(', ')} FROM #{from.to_sql}"
79:       
80:       sql << " " << joins.join($/) unless joins.empty?
81:       sql << " WHERE (#{conditions.join(") AND (")})" unless conditions.empty?
82:       return sql
83:     end

SQL for query

[Source]

    # File lib/data_mapper/query.rb, line 77
77:     def to_sql
78:       sql = "SELECT #{columns.map { |column| column.to_sql(qualify?) }.join(', ')} FROM #{from.to_sql}"
79:       
80:       sql << " " << joins.join($/) unless joins.empty?
81:       sql << " WHERE (#{conditions.join(") AND (")})" unless conditions.empty?
82:       return sql
83:     end

[Validate]