Skip to content

Commit 2824f7d

Browse files
committed
[c++/m] Add Tag referencesFilter
1 parent 0e9741b commit 2824f7d

File tree

5 files changed

+92
-0
lines changed

5 files changed

+92
-0
lines changed

+nix/Tag.m

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,11 @@
7777
c = nix_mx('Tag::referenceCount', obj.nix_handle);
7878
end
7979

80+
function filtered = filter_references(obj, filter, val)
81+
filtered = nix.Utils.filter(obj, filter, val, ...
82+
'Tag::referencesFiltered', @nix.DataArray);
83+
end
84+
8085
% ------------------
8186
% Features methods
8287
% ------------------

nix_mx.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,7 @@ void mexFunction(int nlhs,
324324
methods->add("Tag::openSourceIdx", nixtag::openSourceIdx);
325325
methods->add("Tag::compare", nixtag::compare);
326326
methods->add("Tag::sourcesFiltered", nixtag::sourcesFiltered);
327+
methods->add("Tag::referencesFiltered", nixtag::referencesFiltered);
327328

328329
classdef<nix::MultiTag>("MultiTag", methods)
329330
.desc(&nixmultitag::describe)

src/nixtag.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,4 +112,13 @@ namespace nixtag {
112112
output.set(0, res);
113113
}
114114

115+
void referencesFiltered(const extractor &input, infusor &output) {
116+
nix::Tag currObj = input.entity<nix::Tag>(1);
117+
std::vector<nix::DataArray> res = filterEntity<nix::DataArray>(input,
118+
[currObj](const nix::util::Filter<nix::DataArray>::type &filter) {
119+
return currObj.references(filter);
120+
});
121+
output.set(0, res);
122+
}
123+
115124
} // namespace nixtag

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 sourcesFiltered(const extractor &input, infusor &output);
4141

42+
void referencesFiltered(const extractor &input, infusor &output);
43+
4244
} // namespace nixtag
4345

4446
#endif

tests/TestTag.m

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
funcs{end+1} = @test_has_reference;
4242
funcs{end+1} = @test_compare;
4343
funcs{end+1} = @test_filter_source;
44+
funcs{end+1} = @test_filter_reference;
4445
end
4546

4647
%% Test: Add sources by entity and id
@@ -728,3 +729,77 @@
728729
assert(size(filtered, 1) == 1);
729730
assert(strcmp(filtered{1}.name, mainName));
730731
end
732+
733+
%% Test: filter references
734+
function [] = test_filter_reference( varargin )
735+
filterName = 'filterMe';
736+
filterType = 'filterType';
737+
f = nix.File(fullfile(pwd, 'tests', 'testRW.h5'), nix.FileMode.Overwrite);
738+
b = f.create_block('testBlock', 'nixBlock');
739+
t = b.create_tag('testTag', 'nixTag', [1 2 3]);
740+
d = b.create_data_array(filterName, 'nixDataArray', nix.DataType.Double, [1 2]);
741+
t.add_reference(d);
742+
filterID = d.id;
743+
d = b.create_data_array('testDataArray1', filterType, nix.DataType.Double, [1 2]);
744+
t.add_reference(d);
745+
filterIDs = {filterID, d.id};
746+
d = b.create_data_array('testDataArray2', filterType, nix.DataType.Double, [1 2]);
747+
t.add_reference(d);
748+
749+
% test empty id filter
750+
assert(isempty(f.blocks{1}.tags{1}.filter_references(nix.Filter.id, 'IdoNotExist')));
751+
752+
% test nix.Filter.accept_all
753+
filtered = f.blocks{1}.tags{1}.filter_references(nix.Filter.accept_all, '');
754+
assert(size(filtered, 1) == 3);
755+
756+
% test nix.Filter.id
757+
filtered = f.blocks{1}.tags{1}.filter_references(nix.Filter.id, filterID);
758+
assert(size(filtered, 1) == 1);
759+
assert(strcmp(filtered{1}.id, filterID));
760+
761+
% test nix.Filter.ids
762+
filtered = f.blocks{1}.tags{1}.filter_references(nix.Filter.ids, filterIDs);
763+
assert(size(filtered, 1) == 2);
764+
assert(strcmp(filtered{1}.id, filterIDs{1}) || strcmp(filtered{1}.id, filterIDs{2}));
765+
766+
% test nix.Filter.name
767+
filtered = f.blocks{1}.tags{1}.filter_references(nix.Filter.name, filterName);
768+
assert(size(filtered, 1) == 1);
769+
assert(strcmp(filtered{1}.name, filterName));
770+
771+
% test nix.Filter.type
772+
filtered = f.blocks{1}.tags{1}.filter_references(nix.Filter.type, filterType);
773+
assert(size(filtered, 1) == 2);
774+
775+
% test nix.Filter.metadata
776+
mainName = 'testSubSection';
777+
main = b.create_data_array(mainName, 'nixDataArray', nix.DataType.Bool, [2 2]);
778+
t.add_reference(main);
779+
subName = 'testSubSection1';
780+
s = f.create_section(subName, 'nixSection');
781+
main.set_metadata(s);
782+
subID = s.id;
783+
784+
assert(isempty(f.blocks{1}.tags{1}.filter_references(nix.Filter.metadata, 'Do not exist')));
785+
filtered = f.blocks{1}.tags{1}.filter_references(nix.Filter.metadata, subID);
786+
assert(size(filtered, 1) == 1);
787+
assert(strcmp(filtered{1}.name, mainName));
788+
789+
% test nix.Filter.source
790+
mainName = 'testSubSource';
791+
main = b.create_data_array(mainName, 'nixDataArray', nix.DataType.Bool, [2 2]);
792+
t.add_reference(main);
793+
mainID = main.id;
794+
subName = 'testSubSource1';
795+
s = b.create_source(subName, 'nixSource');
796+
main.add_source(s);
797+
subID = s.id;
798+
799+
assert(isempty(f.blocks{1}.tags{1}.filter_references(nix.Filter.source, 'Do not exist')));
800+
801+
% filter works only for ID, not for name
802+
filtered = f.blocks{1}.tags{1}.filter_references(nix.Filter.source, subID);
803+
assert(size(filtered, 1) == 1);
804+
assert(strcmp(filtered{1}.name, mainName));
805+
end

0 commit comments

Comments
 (0)