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