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