66import numpy as np
77
88from larray .tests .common import assert_array_equal , assert_nparray_equal
9- from larray import Axis , LGroup , IGroup , read_hdf
9+ from larray import Axis , LGroup , IGroup , read_hdf , X
10+ from larray .core .axis import AxisReference
1011
1112
1213def test_init ():
@@ -98,7 +99,7 @@ def test_translate():
9899
99100def test_getitem_lgroup_keys ():
100101 def group_equal (g1 , g2 ):
101- return ( g1 .key == g2 .key and g1 .name == g2 .name and g1 .axis is g2 .axis )
102+ return g1 .key == g2 .key and g1 .name == g2 .name and g1 .axis is g2 .axis
102103
103104 age = Axis (range (100 ), 'age' )
104105 ages = [1 , 5 , 9 ]
@@ -119,93 +120,125 @@ def group_equal(g1, g2):
119120def test_getitem_group_keys ():
120121 a = Axis ('a=a0..a2' )
121122 alt_a = Axis ('a=a1..a3' )
123+
122124 key = a ['a1' ]
125+
123126 g = a [key ]
124127 assert g .key == 'a1'
125128 assert g .axis is a
129+
126130 g = alt_a [key ]
127131 assert g .key == 'a1'
128132 assert g .axis is alt_a
133+
129134 key = a ['a1' :'a2' ]
135+
130136 g = a [key ]
131137 assert g .key == slice ('a1' , 'a2' )
132138 assert g .axis is a
139+
133140 g = alt_a [key ]
134141 assert g .key == slice ('a1' , 'a2' )
135142 assert g .axis is alt_a
143+
136144 key = a [['a1' , 'a2' ]]
145+
137146 g = a [key ]
138147 assert g .key == ['a1' , 'a2' ]
139148 assert g .axis is a
149+
140150 g = alt_a [key ]
141151 assert g .key == ['a1' , 'a2' ]
142152 assert g .axis is alt_a
153+
143154 key = a .i [1 ]
155+
144156 g = a [key ]
145157 assert isinstance (g , LGroup )
146158 assert g .key == 'a1'
147159 assert g .axis is a
160+
148161 g = alt_a [key ]
149162 assert isinstance (g , LGroup )
150163 assert g .key == 'a1'
151164 assert g .axis is alt_a
165+
152166 key = a .i [1 :3 ]
167+
153168 g = a [key ]
154169 assert isinstance (g , LGroup )
155170 assert g .key == slice ('a1' , 'a2' )
156171 assert g .axis is a
172+
157173 g = alt_a [key ]
158174 assert isinstance (g , LGroup )
159175 assert g .key == slice ('a1' , 'a2' )
160176 assert g .axis is alt_a
177+
161178 key = a .i [[1 , 2 ]]
179+
162180 g = a [key ]
163181 assert isinstance (g , LGroup )
164182 assert list (g .key ) == ['a1' , 'a2' ]
165183 assert g .axis is a
184+
166185 g = alt_a [key ]
167186 assert isinstance (g , LGroup )
168187 assert list (g .key ) == ['a1' , 'a2' ]
169188 assert g .axis is alt_a
189+
170190 lg_a1 = a ['a1' ]
171191 lg_a2 = a ['a2' ]
192+
172193 g = a [lg_a1 :lg_a2 ]
173194 assert isinstance (g , LGroup )
174195 assert g .key == slice ('a1' , 'a2' )
175196 assert g .axis is a
197+
176198 g = alt_a [lg_a1 :lg_a2 ]
177199 assert isinstance (g , LGroup )
178200 assert g .key == slice ('a1' , 'a2' )
179201 assert g .axis is alt_a
202+
180203 pg_a1 = a .i [1 ]
181204 pg_a2 = a .i [2 ]
205+
182206 g = a [pg_a1 :pg_a2 ]
183207 assert isinstance (g , LGroup )
184208 assert g .key == slice ('a1' , 'a2' )
185209 assert g .axis is a
210+
186211 g = alt_a [pg_a1 :pg_a2 ]
187212 assert isinstance (g , LGroup )
188213 assert g .key == slice ('a1' , 'a2' )
189214 assert g .axis is alt_a
215+
190216 key = [a ['a1' ], a ['a2' ]]
217+
191218 g = a [key ]
192219 assert isinstance (g , LGroup )
193220 assert g .key == ['a1' , 'a2' ]
194221 assert g .axis is a
222+
195223 g = alt_a [key ]
196224 assert isinstance (g , LGroup )
197225 assert g .key == ['a1' , 'a2' ]
198226 assert g .axis is alt_a
227+
199228 key = [a .i [1 ], a .i [2 ]]
229+
200230 g = a [key ]
201231 assert isinstance (g , LGroup )
202232 assert g .key == ['a1' , 'a2' ]
203233 assert g .axis is a
234+
204235 g = alt_a [key ]
205236 assert isinstance (g , LGroup )
206237 assert g .key == ['a1' , 'a2' ]
207238 assert g .axis is alt_a
239+
208240 key = [a ['a1' , 'a2' ], a ['a2' , 'a1' ]]
241+
209242 g = a [key ]
210243 assert isinstance (g , list )
211244 assert isinstance (g [0 ], LGroup )
@@ -214,6 +247,7 @@ def test_getitem_group_keys():
214247 assert g [1 ].key == ['a2' , 'a1' ]
215248 assert g [0 ].axis is a
216249 assert g [1 ].axis is a
250+
217251 g = alt_a [key ]
218252 assert isinstance (g , list )
219253 assert isinstance (g [0 ], LGroup )
@@ -222,7 +256,9 @@ def test_getitem_group_keys():
222256 assert g [1 ].key == ['a2' , 'a1' ]
223257 assert g [0 ].axis is alt_a
224258 assert g [1 ].axis is alt_a
259+
225260 key = (a .i [1 , 2 ], a .i [2 , 1 ])
261+
226262 g = a [key ]
227263 assert isinstance (g , tuple )
228264 assert isinstance (g [0 ], LGroup )
@@ -231,6 +267,7 @@ def test_getitem_group_keys():
231267 assert list (g [1 ].key ) == ['a2' , 'a1' ]
232268 assert g [0 ].axis is a
233269 assert g [1 ].axis is a
270+
234271 g = alt_a [key ]
235272 assert isinstance (g , tuple )
236273 assert isinstance (g [0 ], LGroup )
@@ -239,25 +276,33 @@ def test_getitem_group_keys():
239276 assert list (g [1 ].key ) == ['a2' , 'a1' ]
240277 assert g [0 ].axis is alt_a
241278 assert g [1 ].axis is alt_a
279+
242280 key = (a ['a1' ], a ['a2' ])
281+
243282 g = a [key ]
244283 assert isinstance (g , LGroup )
245284 assert g .key == ['a1' , 'a2' ]
246285 assert g .axis is a
286+
247287 g = alt_a [key ]
248288 assert isinstance (g , LGroup )
249289 assert g .key == ['a1' , 'a2' ]
250290 assert g .axis is alt_a
291+
251292 key = (a .i [1 ], a .i [2 ])
293+
252294 g = a [key ]
253295 assert isinstance (g , LGroup )
254296 assert g .key == ['a1' , 'a2' ]
255297 assert g .axis is a
298+
256299 g = alt_a [key ]
257300 assert isinstance (g , LGroup )
258301 assert g .key == ['a1' , 'a2' ]
259302 assert g .axis is alt_a
303+
260304 key = (a ['a1' , 'a2' ], a ['a2' , 'a1' ])
305+
261306 g = a [key ]
262307 assert isinstance (g , tuple )
263308 assert isinstance (g [0 ], LGroup )
@@ -266,6 +311,7 @@ def test_getitem_group_keys():
266311 assert g [1 ].key == ['a2' , 'a1' ]
267312 assert g [0 ].axis is a
268313 assert g [1 ].axis is a
314+
269315 g = alt_a [key ]
270316 assert isinstance (g , tuple )
271317 assert isinstance (g [0 ], LGroup )
@@ -274,7 +320,9 @@ def test_getitem_group_keys():
274320 assert g [1 ].key == ['a2' , 'a1' ]
275321 assert g [0 ].axis is alt_a
276322 assert g [1 ].axis is alt_a
323+
277324 key = (a .i [1 , 2 ], a .i [2 , 1 ])
325+
278326 g = a [key ]
279327 assert isinstance (g , tuple )
280328 assert isinstance (g [0 ], LGroup )
@@ -283,6 +331,7 @@ def test_getitem_group_keys():
283331 assert list (g [1 ].key ) == ['a2' , 'a1' ]
284332 assert g [0 ].axis is a
285333 assert g [1 ].axis is a
334+
286335 g = alt_a [key ]
287336 assert isinstance (g , tuple )
288337 assert isinstance (g [0 ], LGroup )
@@ -293,6 +342,55 @@ def test_getitem_group_keys():
293342 assert g [1 ].axis is alt_a
294343
295344
345+ def test_axis_ref_getitem_group_keys ():
346+ # test that we can retarget a key to another axis using an axis ref
347+
348+ # a) when the name of the axis is different
349+ axis1 = Axis ('axis1=a0..a2' )
350+
351+ g = X .axis2 [axis1 ['a1' ]]
352+ assert isinstance (g .key , str ) and g .key == 'a1'
353+ assert isinstance (g .axis , AxisReference )
354+ assert g .axis .name == 'axis2'
355+
356+ g = X .axis2 [axis1 ['a1' ], axis1 ['a2' ]]
357+ assert isinstance (g .key , list ) and g .key == ['a1' , 'a2' ]
358+ assert isinstance (g .axis , AxisReference )
359+ assert g .axis .name == 'axis2'
360+
361+ g = X .axis2 [[axis1 ['a1' ], axis1 ['a2' ]]]
362+ assert isinstance (g .key , list ) and g .key == ['a1' , 'a2' ]
363+ assert isinstance (g .axis , AxisReference )
364+ assert g .axis .name == 'axis2'
365+
366+ g = X .axis2 [axis1 ['a1' :'a2' ]]
367+ assert isinstance (g .key , slice ) and g .key == slice ('a1' , 'a2' )
368+ assert isinstance (g .axis , AxisReference )
369+ assert g .axis .name == 'axis2'
370+
371+ # b) when the name of the axis is the same (i.e. when the retarget is useless)
372+ # this is what issue #787 was all about
373+ g = X .axis1 [axis1 ['a1' ]]
374+ assert isinstance (g .key , str ) and g .key == 'a1'
375+ assert isinstance (g .axis , AxisReference )
376+ assert g .axis .name == 'axis1'
377+
378+ g = X .axis1 [axis1 ['a1' ], axis1 ['a2' ]]
379+ assert isinstance (g .key , list ) and g .key == ['a1' , 'a2' ]
380+ assert isinstance (g .axis , AxisReference )
381+ assert g .axis .name == 'axis1'
382+
383+ g = X .axis1 [[axis1 ['a1' ], axis1 ['a2' ]]]
384+ assert isinstance (g .key , list ) and g .key == ['a1' , 'a2' ]
385+ assert isinstance (g .axis , AxisReference )
386+ assert g .axis .name == 'axis1'
387+
388+ g = X .axis1 [axis1 ['a1' :'a2' ]]
389+ assert isinstance (g .key , slice ) and g .key == slice ('a1' , 'a2' )
390+ assert isinstance (g .axis , AxisReference )
391+ assert g .axis .name == 'axis1'
392+
393+
296394def test_init_from_group ():
297395 code = Axis ('code=C01..C03' )
298396 code_group = code [:'C02' ]
0 commit comments