Kaynağa Gözat

crud, SQL: implement order, group, limit and offset in get() request

ArnAud 8 yıl önce
ebeveyn
işleme
b1b13f4afa

+ 15
- 4
DataSource/MySQL/leapidatasource.py Dosyayı Görüntüle

@@ -42,7 +42,8 @@ class LeDataSourceSQL(DummyDatasource):
42 42
     # @todo this only works with LeObject.get(), LeClass.get() and LeType.get()
43 43
     # @todo for speed get rid of all_to_dicts
44 44
     # @todo filters: all use cases are not implemented
45
-    def select(self, target_cls, field_list, filters, rel_filters=None):
45
+    # @todo group: mosql does not permit direction in group_by clause, it should, so for now we don't use direction in group clause
46
+    def select(self, target_cls, field_list, filters, rel_filters=None, order=None, group=None, limit=None, offset=None):
46 47
 
47 48
         joins = []
48 49
         # it is a LeObject, query only on main table
@@ -61,10 +62,20 @@ class LeDataSourceSQL(DummyDatasource):
61 62
             joins = [left_join(class_table, {main_lodel_id:class_lodel_id})]
62 63
             fields = [(main_table, common_fields), (class_table, main_class.fieldlist())]
63 64
 
64
-        # prefix column name in field list
65
+        # prefix column name in fields list
65 66
         prefixed_field_list = [self.datasource_utils.find_prefix(name, fields) for name in field_list]
66 67
 
67
-        # @todo implement that
68
+        kwargs = {}
69
+        if group:
70
+            kwargs['group_by'] = (self.datasource_utils.find_prefix(column, fields) for column, direction in group)
71
+        if order:
72
+            kwargs['order_by'] = (self.datasource_utils.find_prefix(column, fields) + ' ' + direction for column, direction in order)
73
+        if limit:
74
+            kwargs['limit'] = limit
75
+        if offset:
76
+            kwargs['offset'] = offset
77
+
78
+       # @todo implement that
68 79
         #if rel_filters is not None and len(rel_filters) > 0:
69 80
             #rel_filters = self._prepare_rel_filters(rel_filters)
70 81
             #for rel_filter in rel_filters:
@@ -78,7 +89,7 @@ class LeDataSourceSQL(DummyDatasource):
78 89
 
79 90
         # prefix filters'' column names, and prepare dict for mosql where {(fieldname, op): value}
80 91
         wheres = {(self.datasource_utils.find_prefix(name, fields), op):value for name,op,value in filters}
81
-        query = select(main_table, select=prefixed_field_list, where=wheres, joins=joins)
92
+        query = select(main_table, select=prefixed_field_list, where=wheres, joins=joins, **kwargs)
82 93
         #print ('SQL', query)
83 94
 
84 95
         # Executing the query

+ 6
- 2
DataSource/dummy/leapidatasource.py Dosyayı Görüntüle

@@ -10,13 +10,17 @@ class DummyDatasource(object):
10 10
         self.module = module
11 11
         self.conn_args = conn_args
12 12
         self.conn_kargs = conn_kargs
13
-    
13
+
14 14
     ## @brief select lodel editorial components given filters
15 15
     # @param target_cls LeCrud(class) : The component class concerned by the insert (a LeCrud child class (not instance !) )
16 16
     # @param filters list : List of filters (see @ref leobject_filters )
17 17
     # @param rel_filters list : List of relationnal filters (see @ref leobject_filters )
18
+    # @param group list of tupple: List of column to group together.  group = [('titre', 'ASC'), ]
19
+    # @param order list of tupple : List of column to order.  order = [('titre', 'ASC'), ]
20
+    # @param limit int : Number of row to be returned
21
+    # @param offset int : Used with limit to choose the start row
18 22
     # @return a list of LeCrud child classes
19
-    def select(self, target_cls, field_list, filters, rel_filters):
23
+    def select(self, target_cls, field_list, filters, rel_filters=None, order=None, group=None, limit=None, offset=0):
20 24
         pass
21 25
 
22 26
     ## @brief delete lodel editorial components given filters

+ 2
- 2
leapi/leclass.py Dosyayı Görüntüle

@@ -37,6 +37,6 @@ class _LeClass(_LeObject):
37 37
         return cls.fieldtypes().keys()
38 38
 
39 39
     @classmethod
40
-    def get(cls, query_filters, field_list = None):
40
+    def get(cls, query_filters, field_list=None, order=None, group=None, limit=None, offset=0):
41 41
         query_filters.append(('class_id', '=', cls._class_id))
42
-        return super().get(query_filters, field_list)
42
+        return super().get(query_filters, field_list, order=order, group=group, limit=limit, offset=offset)

+ 9
- 13
leapi/lecrud.py Dosyayı Görüntüle

@@ -257,7 +257,7 @@ class _LeCrud(object):
257 257
     # @return A list of lodel editorial components instance
258 258
     # @todo think about LeObject and LeClass instanciation (partial instanciation, etc)
259 259
     @classmethod
260
-    def get(cls, query_filters, field_list = None, order = None, groups = None, limit = None, offset = 0):
260
+    def get(cls, query_filters, field_list=None, order=None, group=None, limit=None, offset=0):
261 261
         if field_list is None or len(field_list) == 0:
262 262
             #default field_list
263 263
             field_list = cls.fieldlist()
@@ -268,20 +268,16 @@ class _LeCrud(object):
268 268
         filters, relational_filters = cls._prepare_filters(query_filters)
269 269
         
270 270
         #preparing order
271
-        if order is None:
272
-            order = []
273
-        else:
274
-            order = self._prepare_order_fields(order)
271
+        if order:
272
+            order = cls._prepare_order_fields(order)
275 273
             if isinstance(order, Exception):
276 274
                 raise order #can be buffered and raised later, but _prepare_filters raise when fails
277 275
 
278
-        #preparing groups
279
-        if groups is None:
280
-            groups = []
281
-        else:
282
-            groups = cls._order_fields(groups)
283
-            if isinstance(groups, Exception):
284
-                raise groups # can also be buffered and raised later
276
+        #preparing group
277
+        if group:
278
+            group = cls._prepare_order_fields(group)
279
+            if isinstance(group, Exception):
280
+                raise group # can also be buffered and raised later
285 281
 
286 282
         #checking limit and offset values
287 283
         if not (limit is None):
@@ -292,7 +288,7 @@ class _LeCrud(object):
292 288
                 raise ValueError("Invalid offset given : %d"%offset)
293 289
 
294 290
         #Fetching editorial components from datasource
295
-        results = cls._datasource.select(cls, field_list, filters, relational_filters, order, groups, limit, offset)
291
+        results = cls._datasource.select(cls, field_list, filters, relational_filters, order=order, group=group, limit=limit, offset=offset)
296 292
 
297 293
         return results
298 294
 

+ 1
- 1
leapi/test/test_lecrud.py Dosyayı Görüntüle

@@ -299,7 +299,7 @@ class LeCrudTestCase(TestCase):
299 299
 
300 300
         for callcls, field_list, filters, fl_ds, filters_ds, rfilters_ds in args:
301 301
             callcls.get(filters, field_list)
302
-            dsmock.assert_called_with(callcls, fl_ds, filters_ds, rfilters_ds, [], [], None, 0)
302
+            dsmock.assert_called_with(callcls, fl_ds, filters_ds, rfilters_ds, order=None, group=None, limit=None, offset=0)
303 303
             dsmock.reset_mock()
304 304
     
305 305
     #

Loading…
İptal
Kaydet