]> git.phdru.name Git - m_librarian.git/blob - m_librarian/search.py
Fix a bug
[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, join_expressions=None):
44     if join_expressions is None:
45         join_expressions = []
46     return _mk_search_conditions_with_operator(
47         table, case_sensitive, _search_conditions_dict[search_type],
48         values, expressions) + join_expressions
49
50
51 def _search(table, search_type, case_sensitive, values,
52             expressions=None, join_expressions=None, orderBy=None):
53     conditions = mk_search_conditions(
54         table, search_type, case_sensitive, values, expressions=expressions,
55         join_expressions=join_expressions)
56     return table.select(AND(*conditions), orderBy=orderBy)
57
58
59 def search_authors(search_type, case_sensitive, values,
60                    expressions=None, orderBy=None):
61     return _search(Author, search_type, case_sensitive, values,
62                    expressions=expressions, orderBy=orderBy)
63
64
65 def search_books(search_type, case_sensitive, values, join_expressions=None,
66                  orderBy=None):
67     return _search(Book, search_type, case_sensitive, values,
68                    join_expressions=join_expressions, orderBy=orderBy)
69
70
71 def search_extensions(search_type, case_sensitive, values, orderBy=None):
72     return _search(Extension, search_type, case_sensitive, values,
73                    orderBy=orderBy)
74
75
76 def search_genres(search_type, case_sensitive, values, orderBy=None):
77     return _search(Genre, search_type, case_sensitive, values,
78                    orderBy=orderBy)
79
80
81 def search_languages(search_type, case_sensitive, values, orderBy=None):
82     return _search(Language, search_type, case_sensitive, values,
83                    orderBy=orderBy)