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