Skip to content

Commit fa633e6

Browse files
authored
Fix 306 by using an ND slice (#308)
Negative start/end points are re-interpreted when the 3-integer array getter is used
1 parent b1ed871 commit fa633e6

File tree

2 files changed

+39
-25
lines changed

2 files changed

+39
-25
lines changed

org.eclipse.january.test/src/org/eclipse/january/metadata/internal/AxesMetadataTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,4 +301,30 @@ public void testBroadcastWithErrors() throws DatasetException {
301301
ErrorMetadata em = ax.getSlice().getFirstMetadata(ErrorMetadata.class);
302302
assertTrue(em == null);
303303
}
304+
305+
@Test
306+
public void testReversedSlice() throws DatasetException {
307+
final int[] shape = new int[] {3, 10};
308+
309+
ILazyDataset dataset = Random.lazyRand(shape);
310+
Dataset ax = Random.rand(shape[0]);
311+
Dataset bx = Random.rand(shape[1]);
312+
313+
AxesMetadata amd = MetadataFactory.createMetadata(AxesMetadata.class, shape.length);
314+
amd.setAxis(0, ax);
315+
amd.setAxis(1, bx);
316+
dataset.setMetadata(amd);
317+
318+
IDataset slice;
319+
320+
slice = dataset.getSlice((Slice) null, new Slice(null, 7));
321+
amd = slice.getFirstMetadata(AxesMetadata.class);
322+
assertEquals(ax.getSize(), amd.getAxes()[0].getSize());
323+
assertEquals(7, amd.getAxes()[1].getSize());
324+
325+
slice = dataset.getSlice((Slice) null, new Slice(7, null, -1));
326+
amd = slice.getFirstMetadata(AxesMetadata.class);
327+
assertEquals(ax.getSize(), amd.getAxes()[0].getSize());
328+
assertEquals(8, amd.getAxes()[1].getSize());
329+
}
304330
}

org.eclipse.january/src/org/eclipse/january/dataset/LazyDatasetBase.java

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ protected static ConcurrentMap<Class<? extends MetadataType>, List<MetadataType>
314314

315315
/**
316316
* Copy metadata. If oMetadata is not null, then copy from that when it has the corresponding items
317-
* @since 2.1.2
317+
* @since 2.1
318318
* @param metadata
319319
* @param oMetadata can be null
320320
* @return
@@ -378,18 +378,14 @@ interface MetadatasetAnnotationOperation {
378378

379379
class MdsSlice implements MetadatasetAnnotationOperation {
380380
private boolean asView;
381-
private int[] start;
382-
private int[] stop;
383-
private int[] step;
381+
private SliceND slice;
384382
private int[] oShape;
385383
private long oSize;
386384

387-
public MdsSlice(boolean asView, final int[] start, final int[] stop, final int[] step, final int[] oShape) {
385+
public MdsSlice(boolean asView, SliceND slice) {
388386
this.asView = asView;
389-
this.start = start;
390-
this.stop = stop;
391-
this.step = step;
392-
this.oShape = oShape;
387+
this.slice = slice;
388+
oShape = slice.getSourceShape();
393389
oSize = ShapeUtils.calcLongSize(oShape);
394390
}
395391

@@ -416,38 +412,30 @@ public int getNewRank() {
416412
@Override
417413
public ILazyDataset run(ILazyDataset lz) {
418414
int rank = lz.getRank();
419-
if (start.length != rank) {
415+
if (slice.getStart().length != rank) {
420416
throw new IllegalArgumentException("Slice dimensions do not match dataset!");
421417
}
422418

423419
int[] shape = lz.getShape();
424-
int[] stt;
425-
int[] stp;
426-
int[] ste;
420+
SliceND nslice;
427421
if (lz.getSize() == oSize) {
428-
stt = start;
429-
stp = stop;
430-
ste = step;
422+
nslice = slice;
431423
} else {
432-
stt = start.clone();
433-
stp = stop.clone();
434-
ste = step.clone();
424+
nslice = slice.clone();
435425
for (int i = 0; i < rank; i++) {
436426
if (shape[i] >= oShape[i]) continue;
437427
if (shape[i] == 1) {
438-
stt[i] = 0;
439-
stp[i] = 1;
440-
ste[i] = 1;
428+
nslice.setSlice(i, 0, 1, 1);
441429
} else {
442430
throw new IllegalArgumentException("Sliceable dataset has invalid size!");
443431
}
444432
}
445433
}
446434

447435
if (asView || (lz instanceof IDataset))
448-
return lz.getSliceView(stt, stp, ste);
436+
return lz.getSliceView(nslice);
449437
try {
450-
return lz.getSlice(stt, stp, ste);
438+
return lz.getSlice(nslice);
451439
} catch (DatasetException e) {
452440
logger.error("Could not slice dataset in metadata", e);
453441
return null;
@@ -780,7 +768,7 @@ public ILazyDataset run(ILazyDataset lz) {
780768
* @param slice
781769
*/
782770
protected void sliceMetadata(boolean asView, final SliceND slice) {
783-
processAnnotatedMetadata(new MdsSlice(asView, slice.getStart(), slice.getStop(), slice.getStep(), slice.getSourceShape()), true);
771+
processAnnotatedMetadata(new MdsSlice(asView, slice), true);
784772
}
785773

786774
/**

0 commit comments

Comments
 (0)