Class | DataMapper::Query |
In: |
lib/data_mapper/query.rb
lib/data_mapper/query.rb |
Parent: | Object |
This class handles option parsing and SQL generation.
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 |
# 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
# 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
Parameters for query
# File lib/data_mapper/query.rb, line 86 86: def parameters 87: @parameters 88: end
Parameters for query
# File lib/data_mapper/query.rb, line 86 86: def parameters 87: @parameters 88: end
SQL for query
# 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
# 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