Skip to content

Commit a13b3f9

Browse files
committed
[c++/m] Add nix.Tag retrieveData function
1 parent 8befd60 commit a13b3f9

File tree

5 files changed

+57
-0
lines changed

5 files changed

+57
-0
lines changed

+nix/Tag.m

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,14 @@
6363
'Tag::openReferenceIdx', idx, @nix.DataArray);
6464
end;
6565

66+
function data = retrieve_data(obj, id_or_name)
67+
tmp = nix_mx('Tag::retrieveData', obj.nix_handle, id_or_name);
68+
69+
% data must agree with file & dimensions
70+
% see mkarray.cc(42)
71+
data = permute(tmp, length(size(tmp)):-1:1);
72+
end;
73+
6674
function data = retrieve_data_idx(obj, idx)
6775
tmp = nix_mx('Tag::retrieveDataIdx', obj.nix_handle, idx);
6876

nix_mx.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,7 @@ void mexFunction(int nlhs,
329329
methods->add("Tag::sourcesFiltered", nixtag::sourcesFiltered);
330330
methods->add("Tag::referencesFiltered", nixtag::referencesFiltered);
331331
methods->add("Tag::featuresFiltered", nixtag::featuresFiltered);
332+
methods->add("Tag::retrieveData", nixtag::retrieveData);
332333
methods->add("Tag::retrieveDataIdx", nixtag::retrieveDataIdx);
333334
methods->add("Tag::featureRetrieveDataIdx", nixtag::retrieveFeatureDataIdx);
334335

src/nixtag.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,14 @@ namespace nixtag {
114114
output.set(0, res);
115115
}
116116

117+
void retrieveData(const extractor &input, infusor &output) {
118+
nix::Tag currObj = input.entity<nix::Tag>(1);
119+
std::string name_id = input.str(2);
120+
121+
mxArray *data = make_mx_array_from_ds(currObj.retrieveData(name_id));
122+
output.set(0, data);
123+
}
124+
117125
void retrieveDataIdx(const extractor &input, infusor &output) {
118126
nix::Tag currObj = input.entity<nix::Tag>(1);
119127
nix::ndsize_t idx = (nix::ndsize_t)input.num<double>(2);

src/nixtag.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ namespace nixtag {
3939

4040
void featuresFiltered(const extractor &input, infusor &output);
4141

42+
void retrieveData(const extractor &input, infusor &output);
43+
4244
void retrieveDataIdx(const extractor &input, infusor &output);
4345

4446
void retrieveFeatureDataIdx(const extractor &input, infusor &output);

tests/TestTag.m

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
funcs{end+1} = @test_open_reference_idx;
3535
funcs{end+1} = @test_set_metadata;
3636
funcs{end+1} = @test_open_metadata;
37+
funcs{end+1} = @test_retrieve_data;
3738
funcs{end+1} = @test_retrieve_data_idx;
3839
funcs{end+1} = @test_retrieve_feature_data_idx;
3940
funcs{end+1} = @test_attrs;
@@ -524,6 +525,43 @@
524525
assert(strcmp(t.open_metadata.name, 'testSection'));
525526
end
526527

528+
%% Test: Retrieve referenced data by name and id
529+
function [] = test_retrieve_data( varargin )
530+
f = nix.File(fullfile(pwd, 'tests', 'testRW.h5'), nix.FileMode.Overwrite);
531+
b = f.create_block('testBlock', 'nixBlock');
532+
tagStartPos = [3];
533+
t = b.create_tag('testTag', 'nixTag', tagStartPos);
534+
t.extent = [3];
535+
536+
rawName = [1, 2, 3, 4, 5, 6, 7, 8, 9];
537+
rawID = [11, 12, 13, 14, 15, 16, 17];
538+
d = b.create_data_array_from_data('testDataArrayName', 'nixDataArray', rawName);
539+
d.append_sampled_dimension(1);
540+
t.add_reference(d);
541+
542+
d = b.create_data_array_from_data('testDataArrayID', 'nixDataArray', rawID);
543+
d.append_sampled_dimension(1);
544+
t.add_reference(d);
545+
546+
% test get non existent
547+
try
548+
retData = t.retrieve_data('I do not exist, dont hate me!');
549+
catch ME
550+
assert(~isempty(strfind(ME.message, 'no DataArray with the specified name')), ...
551+
'Non existent check fail');
552+
end
553+
554+
% test get referenced data by name
555+
retData = t.retrieve_data('testDataArrayName');
556+
assert(size(retData, 2) == t.extent, 'Get by name extent check fail');
557+
assert(retData(1) == rawName(t.position + 1), 'Get by name position check fail');
558+
559+
% test get referenced data by id
560+
retData = t.retrieve_data(d.id);
561+
assert(size(retData, 2) == t.extent, 'Get by id extent check fail');
562+
assert(retData(1) == rawID(t.position + 1), 'Get by id position check fail');
563+
end
564+
527565
%% Test: Retrieve referenced data by index
528566
function [] = test_retrieve_data_idx( varargin )
529567
f = nix.File(fullfile(pwd, 'tests', 'testRW.h5'), nix.FileMode.Overwrite);

0 commit comments

Comments
 (0)