7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED |
7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED |
8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS |
9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS |
10 # FOR A PARTICULAR PURPOSE. |
10 # FOR A PARTICULAR PURPOSE. |
11 # |
11 # |
12 from pyams_utils.list import random_iter |
|
13 |
12 |
14 __docformat__ = 'restructuredtext' |
13 __docformat__ = 'restructuredtext' |
15 |
14 |
16 |
15 |
17 # import standard library |
16 # import standard library |
58 """Views concatenate merge mode""" |
57 """Views concatenate merge mode""" |
59 |
58 |
60 label = _("Concatenate views items in order") |
59 label = _("Concatenate views items in order") |
61 |
60 |
62 @classmethod |
61 @classmethod |
63 def get_results(cls, views, context): |
62 def get_results(cls, views, context, ignore_cache=False): |
64 results = (view.get_results(context) for view in views) |
63 results = (view.get_results(context, ignore_cache=ignore_cache) for view in views) |
65 yield from chain(*results) |
64 yield from chain(*results) |
66 |
65 |
67 |
66 |
68 @utility_config(name='random', provides=IViewsMerger) |
67 @utility_config(name='random', provides=IViewsMerger) |
69 class ViewsRandomMergeMode(object): |
68 class ViewsRandomMergeMode(object): |
70 """Views random merge mode""" |
69 """Views random merge mode""" |
71 |
70 |
72 label = _("Extract items randomly") |
71 label = _("Extract items randomly") |
73 |
72 |
74 @classmethod |
73 @classmethod |
75 def get_results(cls, views, context): |
74 def get_results(cls, views, context, ignore_cache=False): |
76 results = (view.get_results(context) for view in views) |
75 results = (view.get_results(context, ignore_cache=ignore_cache) for view in views) |
77 results = list(chain(*results)) |
76 results = list(chain(*results)) |
78 shuffle(results) |
77 shuffle(results) |
79 yield from iter(results) |
78 yield from iter(results) |
80 |
79 |
81 |
80 |
84 """Views zip merge mode""" |
83 """Views zip merge mode""" |
85 |
84 |
86 label = _("Take items from views one by one, in views order") |
85 label = _("Take items from views one by one, in views order") |
87 |
86 |
88 @classmethod |
87 @classmethod |
89 def get_results(cls, views, context): |
88 def get_results(cls, views, context, ignore_cache=False): |
90 results = (view.get_results(context) for view in views) |
89 results = (view.get_results(context, ignore_cache=ignore_cache) for view in views) |
91 for array in zip_longest(*results): |
90 for array in zip_longest(*results): |
92 yield from filter(lambda x: x is not None, array) |
91 yield from filter(lambda x: x is not None, array) |
93 |
92 |
94 |
93 |
95 @utility_config(name='zip_random', provides=IViewsMerger) |
94 @utility_config(name='zip_random', provides=IViewsMerger) |
97 """Views random zip merge mode""" |
96 """Views random zip merge mode""" |
98 |
97 |
99 label = _("Take items from views one by one, in random order") |
98 label = _("Take items from views one by one, in random order") |
100 |
99 |
101 @classmethod |
100 @classmethod |
102 def get_results(cls, views, context): |
101 def get_results(cls, views, context, ignore_cache=False): |
103 results = [view.get_results(context) for view in views] |
102 results = [view.get_results(context, ignore_cache=ignore_cache) for view in views] |
104 shuffle(results) |
103 shuffle(results) |
105 for array in zip_longest(*results): |
104 for array in zip_longest(*results): |
106 yield from filter(lambda x: x is not None, array) |
105 yield from filter(lambda x: x is not None, array) |
107 |
106 |
108 |
107 |
111 |
110 |
112 sort_index = None |
111 sort_index = None |
113 sort_key = None |
112 sort_key = None |
114 |
113 |
115 @classmethod |
114 @classmethod |
116 def get_results(cls, views, context): |
115 def get_results(cls, views, context, ignore_cache=False): |
117 results = (view.get_results(context, |
116 results = (view.get_results(context, |
118 sort_index=cls.sort_index, |
117 sort_index=cls.sort_index, |
119 reverse=True) |
118 reverse=True, |
|
119 ignore_cache=ignore_cache) |
120 for view in views) |
120 for view in views) |
121 yield from merge(*results, key=cls.sort_key) |
121 yield from merge(*results, key=cls.sort_key) |
122 |
122 |
123 |
123 |
124 @utility_config(name='{0}.sort'.format(CREATION_DATE_ORDER), provides=IViewsMerger) |
124 @utility_config(name='{0}.sort'.format(CREATION_DATE_ORDER), provides=IViewsMerger) |