From cba9b7e64358ea106cdc4393fea9c017bf9aa1fa Mon Sep 17 00:00:00 2001 From: frankknoll Date: Thu, 23 Mar 2023 17:44:51 +0100 Subject: [PATCH] starting SmartSearch --- src/SmartSearch.py | 25 +++++++++++++++++++++++++ src/SmartSearchTest.py | 15 +++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/SmartSearch.py create mode 100644 src/SmartSearchTest.py diff --git a/src/SmartSearch.py b/src/SmartSearch.py new file mode 100644 index 00000000000..d4a8d6ec1ca --- /dev/null +++ b/src/SmartSearch.py @@ -0,0 +1,25 @@ +import re + + +class SmartSearch: + + def __init__(self, searchTerm): + self.regexp = _SmartRegexpFactory().createSmartRegexp(searchTerm) + + def matches(self, str): + return True if re.match(self.regexp, str, flags=re.IGNORECASE) else False + + +class _SmartRegexpFactory: + + def createSmartRegexp(self, searchTerm): + return rf'^{self.assertContainsWords(self.getWords(searchTerm))}.*$' + + def getWords(self, searchTerm): + return re.split(r'\s+', searchTerm) + + def assertContainsWords(self, words): + return ''.join([self.assertContainsWord(word) for word in words]) + + def assertContainsWord(self, word): + return f'(?=.*?{word})' diff --git a/src/SmartSearchTest.py b/src/SmartSearchTest.py new file mode 100644 index 00000000000..1fec6ef5ffc --- /dev/null +++ b/src/SmartSearchTest.py @@ -0,0 +1,15 @@ +import unittest +from SmartSearch import SmartSearch + + +class SmartSearchTest(unittest.TestCase): + + def test_smartSearch(self): + self.assertEqual(SmartSearch(searchTerm = 'one two three').matches('one two three'), True) + self.assertEqual(SmartSearch(searchTerm = 'one two three').matches('ONE two ThReE'), True) + self.assertEqual(SmartSearch(searchTerm = 'one two three').matches('one two'), False) + self.assertEqual(SmartSearch(searchTerm = 'one two three').matches('three two'), False) + self.assertEqual(SmartSearch(searchTerm = 'one two three').matches('three two one'), True) + self.assertEqual(SmartSearch(searchTerm = 'one two three').matches('TESTone twoTEST TESTthreeTEST'), True) + self.assertEqual(SmartSearch(searchTerm = 'eins zwei drei').matches('drei, EINS oder zwei?'), True) + self.assertEqual(SmartSearch(searchTerm = 'eins zwei drei').matches('drei, ONE oder zwei?'), False)