summaryrefslogtreecommitdiff
path: root/lib/gitlab/sql/pattern.rb
diff options
context:
space:
mode:
authorDouwe Maan <douwe@gitlab.com>2017-09-05 16:06:31 +0000
committerDouwe Maan <douwe@gitlab.com>2017-09-05 16:06:31 +0000
commit4c6898bdcf0bff6a0a3b288215271be4e916b27c (patch)
tree13db382a777a55c8220fcbdd85ebf5bf4cedeb03 /lib/gitlab/sql/pattern.rb
parentae9b771797cceee76c18376910519e9e71628acc (diff)
parent063e285e6a8c26a95809873fb32fefc54fe9bdb6 (diff)
downloadgitlab-ce-36860-migrate-issues-author.tar.gz
Merge branch 'master' into '36860-migrate-issues-author'36860-migrate-issues-author
# Conflicts: # db/schema.rb
Diffstat (limited to 'lib/gitlab/sql/pattern.rb')
-rw-r--r--lib/gitlab/sql/pattern.rb23
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/gitlab/sql/pattern.rb b/lib/gitlab/sql/pattern.rb
index b42bc67ccfc..7c2d1d8f887 100644
--- a/lib/gitlab/sql/pattern.rb
+++ b/lib/gitlab/sql/pattern.rb
@@ -4,6 +4,7 @@ module Gitlab
extend ActiveSupport::Concern
MIN_CHARS_FOR_PARTIAL_MATCHING = 3
+ REGEX_QUOTED_WORD = /(?<=^| )"[^"]+"(?= |$)/
class_methods do
def to_pattern(query)
@@ -17,6 +18,28 @@ module Gitlab
def partial_matching?(query)
query.length >= MIN_CHARS_FOR_PARTIAL_MATCHING
end
+
+ def to_fuzzy_arel(column, query)
+ words = select_fuzzy_words(query)
+
+ matches = words.map { |word| arel_table[column].matches(to_pattern(word)) }
+
+ matches.reduce { |result, match| result.and(match) }
+ end
+
+ def select_fuzzy_words(query)
+ quoted_words = query.scan(REGEX_QUOTED_WORD)
+
+ query = quoted_words.reduce(query) { |q, quoted_word| q.sub(quoted_word, '') }
+
+ words = query.split(/\s+/)
+
+ quoted_words.map! { |quoted_word| quoted_word[1..-2] }
+
+ words.concat(quoted_words)
+
+ words.select { |word| partial_matching?(word) }
+ end
end
end
end