|
@@ -1,13 +1,89 @@
|
1
|
1
|
# -*- coding: utf-8 -*-
|
2
|
2
|
|
|
3
|
+import pymongo
|
|
4
|
+
|
3
|
5
|
collection_prefix = {
|
4
|
6
|
'relation': 'rel_',
|
5
|
7
|
'collection': 'class_'
|
6
|
8
|
}
|
7
|
9
|
|
|
10
|
+# TODO Ajouter ici les conversions vers les opérateurs MongoDB correspondants
|
|
11
|
+LODEL_OPERATORS_MAP = {
|
|
12
|
+ '=': {'name': '$eq', 'value_type': None},
|
|
13
|
+ '<=': {'name': '$lte', 'value_type': None},
|
|
14
|
+ '>=': {'name': '$gte', 'value_type': None},
|
|
15
|
+ '!=': {'name': '$ne', 'value_type': None},
|
|
16
|
+ '<': {'name': '$lt', 'value_type': None},
|
|
17
|
+ '>': {'name': '$gt', 'value_type': None},
|
|
18
|
+ ' in ': {'name': '$in', 'value_type': list},
|
|
19
|
+ ' not in ': {'name': '$nin', 'value_type': list},
|
|
20
|
+ ' like ': {'name': '$eq', 'value_type': str},
|
|
21
|
+ ' not like ': {'name': '', 'value_type': str}, # TODO Add the operator
|
|
22
|
+ 'OR': {'name': '$or', 'value_type': list},
|
|
23
|
+ 'AND': {'name': '$and', 'value_type': list}
|
|
24
|
+}
|
|
25
|
+
|
|
26
|
+LODEL_SORT_OPERATORS_MAP = {
|
|
27
|
+ 'ASC': pymongo.ASCENDING,
|
|
28
|
+ 'DESC': pymongo.DESCENDING
|
|
29
|
+}
|
|
30
|
+
|
8
|
31
|
|
9
|
32
|
## @brief Returns a collection name given a Emclass name
|
10
|
33
|
# @param class_name str : The class name
|
11
|
34
|
# @return str
|
12
|
35
|
def object_collection_name(class_name):
|
13
|
36
|
return ("%s%s" % (collection_prefix['object'], class_name)).lower()
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+## @brief converts the query filters into MongoDB filters
|
|
40
|
+# @param query_filters list
|
|
41
|
+# @return dict
|
|
42
|
+# @todo refactor this function by adding a return_type argument (default= dict) which can be a dict or a list, then delete the convert_filter_list function
|
|
43
|
+def parse_query_filters(query_filters):
|
|
44
|
+ filters_dict = dict()
|
|
45
|
+ for query_filter in query_filters:
|
|
46
|
+ if isinstance(query_filter, tuple):
|
|
47
|
+ filters_dict.update(convert_filter(query_filter))
|
|
48
|
+ elif isinstance(query_filter, dict):
|
|
49
|
+ query_item = list(query_filter.items())[0]
|
|
50
|
+ key = LODEL_OPERATORS_MAP[query_item[0]]
|
|
51
|
+ filters_dict.update({key: convert_filter_list(query_item[1])})
|
|
52
|
+ else:
|
|
53
|
+ # TODO Add an exception management here in case the filter is neither a tuple nor a dict
|
|
54
|
+ pass
|
|
55
|
+ return filters_dict
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+## @brief converts a query filters list into MongoDB filters list
|
|
59
|
+# It is used mainly in case of an "AND" or an "OR"
|
|
60
|
+# @param filters_list list
|
|
61
|
+# @return list
|
|
62
|
+def convert_filter_list(filters_list):
|
|
63
|
+ converted_filters_list = list()
|
|
64
|
+ for filter_list_item in filters_list:
|
|
65
|
+ if isinstance(filter_list_item, tuple):
|
|
66
|
+ converted_filters_list.append(convert_filter(filter_list_item))
|
|
67
|
+ elif isinstance(filter_list_item, dict):
|
|
68
|
+ query_item = list(filter_list_item.items())[0]
|
|
69
|
+ key = LODEL_OPERATORS_MAP[query_item[0]]['name']
|
|
70
|
+ converted_filters_list.append({key: convert_filter_list(query_item[1])})
|
|
71
|
+ return converted_filters_list
|
|
72
|
+
|
|
73
|
+## @brief converts a Lodel query filter into a MongoDB filter
|
|
74
|
+# @param filter tuple : (FIELD, OPERATOR, VALUE) representing the query filter to convert
|
|
75
|
+# @return dict : {KEY: {OPERATOR:VALUE}}
|
|
76
|
+# @todo Add an error management for the operator mismatch
|
|
77
|
+# @todo Add the checks for the type of values authorized in certain mongodb operators, such "$in" for example which takes a list
|
|
78
|
+def convert_filter(filter):
|
|
79
|
+ key, operator, value = filter
|
|
80
|
+ converted_operator = LODEL_OPERATORS_MAP[operator]['name']
|
|
81
|
+ converted_filter = {key: {converted_operator: value}}
|
|
82
|
+ return converted_filter
|
|
83
|
+
|
|
84
|
+## @brief Returns a list of sorting options
|
|
85
|
+# @param query_filters_order list
|
|
86
|
+# @return list
|
|
87
|
+def parse_query_order(query_filters_order):
|
|
88
|
+ ordering = list()
|
|
89
|
+ return ordering
|