summaryrefslogtreecommitdiff
path: root/inboxapp-service/app/search
diff options
context:
space:
mode:
authorOla Bini <ola.bini@gmail.com>2014-07-31 19:38:52 -0300
committerOla Bini <ola.bini@gmail.com>2014-07-31 19:38:52 -0300
commitb3d05d37063530e354d7b23b462e7418d7faf6e0 (patch)
tree41cacaba61fbe4f4d42f479b65298a79efe34216 /inboxapp-service/app/search
parent831efaa8e2bd3544b045308a8a83e388c804c385 (diff)
Add inboxapp temporary service
Diffstat (limited to 'inboxapp-service/app/search')
-rw-r--r--inboxapp-service/app/search/__init__.py44
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