lib/sunspot/data_extractor.rb in sunspot-2.3.0 vs lib/sunspot/data_extractor.rb in sunspot-2.4.0
- old
+ new
@@ -3,48 +3,78 @@
# DataExtractors present an internal API for the indexer to use to extract
# field values from models for indexing. They must implement the #value_for
# method, which takes an object and returns the value extracted from it.
#
module DataExtractor #:nodoc: all
+ #
+ # Abstract extractor to perform common actions on extracted values
+ #
+ class AbstractExtractor
+ BLACKLIST_REGEXP = /[\x0-\x8\xB\xC\xE-\x1F\x7f]/
+
+ def value_for(object)
+ extract_value_from(object)
+ end
+
+ private
+
+ def extract_value_from(object)
+ case object
+ when String
+ remove_blacklisted_chars(object)
+ when Array
+ object.map { |o| extract_value_from(o) }
+ when Hash
+ object.inject({}) { |h, (k, v)| h.merge(extract_value_from(k) => extract_value_from(v)) }
+ else
+ object
+ end
+ end
+
+ def remove_blacklisted_chars(object)
+ object.gsub(BLACKLIST_REGEXP, '')
+ end
+ end
+
#
# AttributeExtractors extract data by simply calling a method on the block.
#
- class AttributeExtractor
+ class AttributeExtractor < AbstractExtractor
def initialize(attribute_name)
@attribute_name = attribute_name
end
def value_for(object)
- object.send(@attribute_name)
+ super object.send(@attribute_name)
end
end
#
# BlockExtractors extract data by evaluating a block in the context of the
# object instance, or if the block takes an argument, by passing the object
# as the argument to the block. Either way, the return value of the block is
# the value returned by the extractor.
#
- class BlockExtractor
+ class BlockExtractor < AbstractExtractor
def initialize(&block)
@block = block
end
def value_for(object)
- Util.instance_eval_or_call(object, &@block)
+ super Util.instance_eval_or_call(object, &@block)
end
end
#
# Constant data extractors simply return the same value for every object.
#
- class Constant
+ class Constant < AbstractExtractor
def initialize(value)
@value = value
end
def value_for(object)
- @value
+ super @value
end
end
end
end