lib/dusen/util.rb in dusen-0.2.2 vs lib/dusen/util.rb in dusen-0.3.0
- old
+ new
@@ -6,14 +6,39 @@
def like_expression(phrase)
"%#{escape_for_like_query(phrase)}%"
end
+ def escape_with_backslash(phrase, characters)
+ characters << '\\'
+ pattern = /[#{characters.collect(&Regexp.method(:quote)).join('')}]/
+ # debugger
+ phrase.gsub(pattern) do |match|
+ "\\#{match}"
+ end
+ end
+
def escape_for_like_query(phrase)
- phrase.gsub("%", "\\%").gsub("_", "\\_")
+ # phrase.gsub("%", "\\%").gsub("_", "\\_")
+ escape_with_backslash(phrase, ['%', '_'])
end
+ def escape_for_boolean_fulltext_query(phrase)
+ escape_with_backslash(phrase, ['+', '-', '<', '>', '(', ')', '~', '*', '"'])
+ end
+
+ def boolean_fulltext_query(phrases)
+ phrases.collect do |word|
+ escaped_word = Dusen::Util.escape_for_boolean_fulltext_query(word)
+ if escaped_word =~ /\s/
+ %{+"#{escaped_word}"} # no prefixed wildcard possible for phrases
+ else
+ %{+#{escaped_word}*}
+ end
+ end.join(' ')
+ end
+
def qualify_column_name(model, column_name)
column_name = column_name.to_s
unless column_name.include?('.')
quoted_table_name = model.connection.quote_table_name(model.table_name)
quoted_column_name = model.connection.quote_column_name(column_name)
@@ -29,8 +54,68 @@
else
# Rails 2
scope.scoped(:conditions => conditions)
end
end
+
+ def select_scope_fields(scope, fields)
+ if scope.respond_to?(:select)
+ # Rails 3
+ scope.select(fields)
+ else
+ # Rails 2
+ scope.scoped(:select => fields)
+ end
+ end
+
+ def drop_all_tables
+ connection = ::ActiveRecord::Base.connection
+ connection.tables.each do |table|
+ connection.drop_table table
+ end
+ end
+
+ def migrate_test_database
+ print "\033[30m" # dark gray text
+ drop_all_tables
+ ::ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate")
+ print "\033[0m"
+ end
+
+ #def scope_to_sql(scope)
+ # query = if scope.respond_to?(:to_sql)
+ # scope.to_sql
+ # else
+ # scope.construct_finder_sql({})
+ # end
+ #end
+
+ def scope_to_sql(options = {})
+ if Rails.version < '3'
+ scope.construct_finder_sql(options)
+ else
+ scope.scoped(options).to_sql
+ end
+ end
+
+ def collect_column(scope, column_name, find_options = {})
+ distinct = find_options.delete(:distinct)
+ qualified_column_name = "`#{scope.table_name}`.`#{column_name}`"
+ select = distinct ? "DISTINCT #{qualified_column_name}" : qualified_column_name
+ query = if Rails.version.to_i < 3
+ scope.construct_finder_sql(find_options.merge(:select => select))
+ else
+ scope.scoped(find_options.merge(:select => select)).to_sql
+ end
+ raw_values = scope.connection.select_values(query)
+ column = scope.columns_hash[column_name.to_s] or raise "Could not retrieve column information: #{column_name}"
+ raw_values.collect { |value| column.type_cast(value) }
+ end
+
+ #def collect_ids(scope)
+ # scope = select_scope_fields(scope, "`#{scope.table_name}`.`id`")
+ # query = scope_to_sql(scope)
+ # ::ActiveRecord::Base.connection.select_values(query).collect(&:to_i)
+ #end
end
end