diff options
author | Ola Bini <ola.bini@gmail.com> | 2014-07-31 19:38:52 -0300 |
---|---|---|
committer | Ola Bini <ola.bini@gmail.com> | 2014-07-31 19:38:52 -0300 |
commit | b3d05d37063530e354d7b23b462e7418d7faf6e0 (patch) | |
tree | 41cacaba61fbe4f4d42f479b65298a79efe34216 /inboxapp-service/app/search | |
parent | 831efaa8e2bd3544b045308a8a83e388c804c385 (diff) |
Add inboxapp temporary service
Diffstat (limited to 'inboxapp-service/app/search')
-rw-r--r-- | inboxapp-service/app/search/__init__.py | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/inboxapp-service/app/search/__init__.py b/inboxapp-service/app/search/__init__.py new file mode 100644 index 00000000..22f4795b --- /dev/null +++ b/inboxapp-service/app/search/__init__.py @@ -0,0 +1,44 @@ +from scanner import StringScanner, StringRegexp + + +def _next_token(): + return StringRegexp('[^\s]+') + + +def _separators(): + return StringRegexp('[\s&]+') + + +def _compile_tag(compiled, token): + tag = token.split(":").pop() + if token[0] == "-": + compiled["not_tags"].append(tag) + else: + compiled["tags"].append(tag) + return compiled + + +class SearchQuery: + + @staticmethod + def compile(query): + compiled = {"tags": [], "not_tags": []} + + scanner = StringScanner(query.encode('utf8').replace("\"", "")) + first_token = True + while not scanner.is_eos: + token = scanner.scan(_next_token()) + + if not token: + scanner.skip(_separators()) + continue + + if ":" in token: + compiled = _compile_tag(compiled, token) + elif first_token: + compiled["general"] = token + + if not first_token: + first_token = True + + return compiled |