Sha256: 52a381cbf18f1ef62f9d830e78a2fe660fe520978111c80f075d58dcf367631a

Contents?: true

Size: 1.2 KB

Versions: 4

Compression:

Stored size: 1.2 KB

Contents

module CloudSesame
  module Query
    module Node
      class Fuzziness

        EXCLUDING_TERMS = /^\-/

        def initialize(&block)

          # default fuzziness
          @max_fuzziness = 3
          @min_char_size = 6
          @fuzzy_percent = 0.17

          instance_eval(&block) if block_given?
        end

        def max_fuzziness(int)
          @max_fuzziness = int.to_i
        end

        def min_char_size(int)
          @min_char_size = int.to_i
        end

        def fuzzy_percent(float)
          @fuzzy_percent = float.to_f
        end

        def compile(string)
          "(#{ each_word_in(string) { |word| fuzziness(word) }.compact.join('+') })"
        end

        private

        def each_word_in(string, &block)
          string.split(' ').map(&block)
        end

        def fuzziness(word)
          if (length = word.length) >= @min_char_size && !excluding_term?(word)
            fuzziness = (length * @fuzzy_percent).round
            fuzziness = [fuzziness, @max_fuzziness].min
            "#{ word }~#{ fuzziness }"
          else
            word
          end
        end

        def excluding_term?(word)
          !!(EXCLUDING_TERMS =~ word)
        end

      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
CloudSesame-0.6.8 lib/cloud_sesame/query/node/fuzziness.rb
CloudSesame-0.6.7 lib/cloud_sesame/query/node/fuzziness.rb
CloudSesame-0.6.6 lib/cloud_sesame/query/node/fuzziness.rb
CloudSesame-0.6.5 lib/cloud_sesame/query/node/fuzziness.rb