]> git.phdru.name Git - m_librarian.git/blob - m_librarian/search.py
Refactoring: allow expressions to be None
[m_librarian.git] / m_librarian / search.py
1
2 __all__ = [
3     'mk_search_conditions',
4     'search_authors', 'search_books', 'search_extensions',
5     'search_genres', 'search_languages',
6 ]
7
8 from sqlobject.sqlbuilder import AND, func
9 from .db import Author, Book, Extension, Genre, Language
10
11
12 def _mk_search_conditions_with_operator(table, case_sensitive, comparison_op,
13                                         values, expressions):
14     if expressions is None:
15         expressions = []
16     _expressions = []
17     if case_sensitive:
18         for column, value in values.items():
19             _expressions.append(
20                 getattr(getattr(table.q, column), comparison_op)(value))
21         for expr, value in expressions:
22             _expressions.append(
23                 getattr(expr, comparison_op)(value))
24     else:
25         for column, value in values.items():
26             _expressions.append(
27                 getattr(func.lower(
28                     getattr(table.q, column)), comparison_op)(value.lower()))
29         for expr, value in expressions:
30             _expressions.append(
31                 getattr(func.lower(expr), comparison_op)(value.lower()))
32     return _expressions
33
34
35 _search_conditions_dict = {
36     'start': 'startswith',
37     'substring': 'contains',
38     'full': '__eq__',
39 }
40
41
42 def mk_search_conditions(table, search_type, case_sensitive, values,
43                          expressions=None):
44     return _mk_search_conditions_with_operator(
45         table, case_sensitive, _search_conditions_dict[search_type],
46         values, expressions)
47
48
49 def _search(table, search_type, case_sensitive, values,
50             expressions=None, orderBy=None):
51     conditions = mk_search_conditions(
52         table, search_type, case_sensitive, values, expressions=expressions)
53     return table.select(AND(*conditions), orderBy=orderBy)
54
55
56 def search_authors(search_type, case_sensitive, values,
57                    expressions=None, orderBy=None):
58     return _search(Author, search_type, case_sensitive, values,
59                    expressions=None, orderBy=orderBy)
60
61
62 def search_books(search_type, case_sensitive, values, orderBy=None):
63     return _search(Book, search_type, case_sensitive, values,
64                    orderBy=orderBy)
65
66
67 def search_extensions(search_type, case_sensitive, values, orderBy=None):
68     return _search(Extension, search_type, case_sensitive, values,
69                    orderBy=orderBy)
70
71
72 def search_genres(search_type, case_sensitive, values, orderBy=None):
73     return _search(Genre, search_type, case_sensitive, values,
74                    orderBy=orderBy)
75
76
77 def search_languages(search_type, case_sensitive, values, orderBy=None):
78     return _search(Language, search_type, case_sensitive, values,
79                    orderBy=orderBy)