lib/dm-do-adapter/adapter.rb in ardm-do-adapter-1.2.0 vs lib/dm-do-adapter/adapter.rb in ardm-do-adapter-1.2.1

- old
+ new

@@ -308,23 +308,43 @@ # This module is just for organization. The methods are included into the # Adapter below. module SQL #:nodoc: IDENTIFIER_MAX_LENGTH = 128 + QUESTION_MARK = '?'.freeze + GT_OPERATOR = '>'.freeze + LT_OPERATOR = '<'.freeze + GTE_OPERATOR = '>='.freeze + LTE_OPERATOR = '<='.freeze + IS_OPERATOR = 'IS'.freeze + EQ_OPERATOR = '='.freeze + IN_OPERATOR = 'IN'.freeze + BETWEEN_OPERATOR = 'BETWEEN'.freeze + REGEXP_OPERATOR = '~'.freeze + LIKE_OPERATOR = 'LIKE'.freeze + NULL_KEYWORD = 'NULL'.freeze + AND_KEYWORD = ' AND '.freeze + ON_KEYWORD = 'ON'.freeze + COLUMN_SEPARATOR = ', '.freeze + SPACE = ' '.freeze + ONE_EQ_ZERO = '1 = 0'.freeze + SINGLE_QUOTE = /"/.freeze + DOUBLE_QUOTE = '""'.freeze # @api semipublic def property_to_column_name(property, qualify) - column_name = '' + column_name = quote_name(property.field) case qualify - when true - column_name << "#{quote_name(property.model.storage_name(name))}." - when String - column_name << "#{quote_name(qualify)}." + when true + "#{quote_name(property.model.storage_name(name))}.#{column_name}" + when String + "#{quote_name(qualify)}.#{column_name}" + else + column_name end - column_name << quote_name(property.field) end private # Adapters requiring a RETURNING syntax for INSERT statements @@ -394,13 +414,13 @@ if supports_default_values? && properties.empty? statement << default_values_clause else statement << DataMapper::Ext::String.compress_lines(<<-SQL) - (#{properties.map { |property| quote_name(property.field) }.join(', ')}) + (#{properties.map { |property| quote_name(property.field) }.join(COLUMN_SEPARATOR)}) VALUES - (#{(['?'] * properties.size).join(', ')}) + (#{([QUESTION_MARK] * properties.size).join(COLUMN_SEPARATOR)}) SQL end if supports_returning? && serial statement << returning_clause(serial) @@ -436,11 +456,11 @@ else conditions_statement(query.conditions) end statement = "UPDATE #{quote_name(model.storage_name(name))}" - statement << " SET #{properties.map { |property| "#{quote_name(property.field)} = ?" }.join(', ')}" + statement << " SET #{properties.map { |property| "#{quote_name(property.field)} = ?" }.join(COLUMN_SEPARATOR)}" statement << " WHERE #{conditions_statement}" unless DataMapper::Ext.blank?(conditions_statement) return statement, bind_values end @@ -471,11 +491,11 @@ # @return [String] # list of fields as a string # # @api private def columns_statement(properties, qualify) - properties.map { |property| property_to_column_name(property, qualify) }.join(', ') + properties.map { |property| property_to_column_name(property, qualify) }.join(COLUMN_SEPARATOR) end # Constructs joins clause # # @return [String] @@ -502,26 +522,26 @@ statements << quote_name(source_alias) else seen[source_alias] = 0 end - statements << 'ON' + statements << ON_KEYWORD add_join_conditions(relationship, target_alias, source_alias, statements) add_extra_join_conditions(relationship, target_alias, statements, join_bind_values) end # prepend the join bind values to the statement bind values bind_values.unshift(*join_bind_values) - statements.join(' ') + statements.join(SPACE) end def add_join_conditions(relationship, target_alias, source_alias, statements) statements << relationship.target_key.zip(relationship.source_key).map do |target_property, source_property| "#{property_to_column_name(target_property, target_alias)} = #{property_to_column_name(source_property, source_alias)}" - end.join(' AND ') + end.join(AND_KEYWORD) end def add_extra_join_conditions(relationship, target_alias, statements, bind_values) conditions = DataMapper.repository(name).scope do relationship.target_model.all(relationship.query).query.conditions @@ -573,14 +593,14 @@ select_statement, bind_values = select_statement(query) statement = if target_key.size == 1 property_to_column_name(target_key.first, qualify) else - "(#{target_key.map { |property| property_to_column_name(property, qualify) }.join(', ')})" + "(#{target_key.map { |property| property_to_column_name(property, qualify) }.join(COLUMN_SEPARATOR)})" end - statement << " IN (#{select_statement})" + statement = "#{statement} IN (#{select_statement})" return statement, bind_values end # @api private @@ -590,11 +610,11 @@ conditions = Query.target_conditions(sources, source_key, target_key) if conditions.valid? conditions_statement(conditions, qualify) else - [ '1 = 0', [] ] + [ ONE_EQ_ZERO, [] ] end end # @api private def subquery_keys(subject) @@ -624,15 +644,15 @@ # # @api private def order_statement(order, qualify) statements = order.map do |direction| statement = property_to_column_name(direction.target, qualify) - statement << ' DESC' if direction.operator == :desc + statement = "#{statement} DESC" if direction.operator == :desc statement end - statements.join(', ') + statements.join(COLUMN_SEPARATOR) end # @api private def negate_operation(operand, qualify) statement, bind_values = conditions_statement(operand, qualify) @@ -697,14 +717,14 @@ operator = comparison_operator(comparison) column_name = property_to_column_name(subject, qualify) # if operator return value contains ? then it means that it is function call # and it contains placeholder (%s) for property name as well (used in Oracle adapter for regexp operator) - if operator.include?('?') + if operator.include?(QUESTION_MARK) return operator % column_name, [ value ] else - return "#{column_name} #{operator} #{value.nil? ? 'NULL' : '?'}", [ value ].compact + return "#{column_name} #{operator} #{value.nil? ? NULL_KEYWORD : QUESTION_MARK}", [ value ].compact end end def comparison_operator(comparison) subject = comparison.subject @@ -713,42 +733,42 @@ case comparison.slug when :eql then equality_operator(subject, value) when :in then include_operator(subject, value) when :regexp then regexp_operator(value) when :like then like_operator(value) - when :gt then '>' - when :lt then '<' - when :gte then '>=' - when :lte then '<=' + when :gt then GT_OPERATOR + when :lt then LT_OPERATOR + when :gte then GTE_OPERATOR + when :lte then LTE_OPERATOR end end # @api private def equality_operator(property, operand) - operand.nil? ? 'IS' : '=' + operand.nil? ? IS_OPERATOR : EQ_OPERATOR end # @api private def include_operator(property, operand) case operand - when Array then 'IN' - when Range then 'BETWEEN' + when Array then IN_OPERATOR + when Range then BETWEEN_OPERATOR end end # @api private def regexp_operator(operand) - '~' + REGEXP_OPERATOR end # @api private def like_operator(operand) - 'LIKE' + LIKE_OPERATOR end # @api private def quote_name(name) - "\"#{name[0, self.class::IDENTIFIER_MAX_LENGTH].gsub('"', '""')}\"" + "\"#{name[0, self.class::IDENTIFIER_MAX_LENGTH].gsub(SINGLE_QUOTE,DOUBLE_QUOTE)}\"" end end include SQL