+ def limit_database_read
+ limit_columns = self.class.limit_index_columns_read
+ limit_columns &= model_class.columns_for_attributes(@select) if @select
+ return if limit_columns.empty?
+ model_class.transaction do
+ limit_query = @objects.
+ except(:select).
+ select("(%s) as read_length" %
+ limit_columns.map { |s| "octet_length(#{s})" }.join(" + "))
+ new_limit = 0
+ read_total = 0
+ limit_query.each do |record|
+ new_limit += 1
+ read_total += record.read_length.to_i
+ if read_total >= Rails.configuration.max_index_database_read
+ new_limit -= 1 if new_limit > 1
+ break
+ elsif new_limit >= @limit
+ break
+ end
+ end
+ @limit = new_limit
+ @objects = @objects.limit(@limit)
+ # Force @objects to run its query inside this transaction.
+ @objects.each { |_| break }
+ end
+ end
+