Skip to content

Commit 1450d11

Browse files
committed
[c++/m] Add MultiTag referencesFilter
1 parent f64c6c0 commit 1450d11

File tree

5 files changed

+93
-0
lines changed

5 files changed

+93
-0
lines changed

+nix/MultiTag.m

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

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

nix_mx.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,7 @@ void mexFunction(int nlhs,
372372
methods->add("MultiTag::openSourceIdx", nixmultitag::openSourceIdx);
373373
methods->add("MultiTag::compare", nixmultitag::compare);
374374
methods->add("MultiTag::sourcesFiltered", nixmultitag::sourcesFiltered);
375+
methods->add("MultiTag::referencesFiltered", nixmultitag::referencesFiltered);
375376

376377
classdef<nix::Section>("Section", methods)
377378
.desc(&nixsection::describe)

src/nixmultitag.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,4 +117,13 @@ namespace nixmultitag {
117117
output.set(0, res);
118118
}
119119

120+
void referencesFiltered(const extractor &input, infusor &output) {
121+
nix::MultiTag currObj = input.entity<nix::MultiTag>(1);
122+
std::vector<nix::DataArray> res = filterEntity<nix::DataArray>(input,
123+
[currObj](const nix::util::Filter<nix::DataArray>::type &filter) {
124+
return currObj.references(filter);
125+
});
126+
output.set(0, res);
127+
}
128+
120129
} // namespace nixmultitag

src/nixmultitag.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ namespace nixmultitag {
4141

4242
void sourcesFiltered(const extractor &input, infusor &output);
4343

44+
void referencesFiltered(const extractor &input, infusor &output);
45+
4446
} // namespace nixmultitag
4547

4648
#endif

tests/TestMultiTag.m

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
funcs{end+1} = @test_attrs;
4747
funcs{end+1} = @test_compare;
4848
funcs{end+1} = @test_filter_source;
49+
funcs{end+1} = @test_filter_reference;
4950
end
5051

5152
%% Test: Add sources by entity and id
@@ -856,3 +857,78 @@
856857
assert(size(filtered, 1) == 1);
857858
assert(strcmp(filtered{1}.name, mainName));
858859
end
860+
861+
%% Test: filter references
862+
function [] = test_filter_reference( varargin )
863+
filterName = 'filterMe';
864+
filterType = 'filterType';
865+
f = nix.File(fullfile(pwd, 'tests', 'testRW.h5'), nix.FileMode.Overwrite);
866+
b = f.create_block('testBlock', 'nixBlock');
867+
d = b.create_data_array('testDataArray', 'nixDataArray', nix.DataType.Double, [2 7]);
868+
t = b.create_multi_tag('testMultiTag', 'nixMultiTag', d);
869+
d = b.create_data_array(filterName, 'nixDataArray', nix.DataType.Double, [1 2]);
870+
t.add_reference(d);
871+
filterID = d.id;
872+
d = b.create_data_array('testDataArray1', filterType, nix.DataType.Double, [1 2]);
873+
t.add_reference(d);
874+
filterIDs = {filterID, d.id};
875+
d = b.create_data_array('testDataArray2', filterType, nix.DataType.Double, [1 2]);
876+
t.add_reference(d);
877+
878+
% test empty id filter
879+
assert(isempty(f.blocks{1}.multiTags{1}.filter_references(nix.Filter.id, 'IdoNotExist')));
880+
881+
% test nix.Filter.accept_all
882+
filtered = f.blocks{1}.multiTags{1}.filter_references(nix.Filter.accept_all, '');
883+
assert(size(filtered, 1) == 3);
884+
885+
% test nix.Filter.id
886+
filtered = f.blocks{1}.multiTags{1}.filter_references(nix.Filter.id, filterID);
887+
assert(size(filtered, 1) == 1);
888+
assert(strcmp(filtered{1}.id, filterID));
889+
890+
% test nix.Filter.ids
891+
filtered = f.blocks{1}.multiTags{1}.filter_references(nix.Filter.ids, filterIDs);
892+
assert(size(filtered, 1) == 2);
893+
assert(strcmp(filtered{1}.id, filterIDs{1}) || strcmp(filtered{1}.id, filterIDs{2}));
894+
895+
% test nix.Filter.name
896+
filtered = f.blocks{1}.multiTags{1}.filter_references(nix.Filter.name, filterName);
897+
assert(size(filtered, 1) == 1);
898+
assert(strcmp(filtered{1}.name, filterName));
899+
900+
% test nix.Filter.type
901+
filtered = f.blocks{1}.multiTags{1}.filter_references(nix.Filter.type, filterType);
902+
assert(size(filtered, 1) == 2);
903+
904+
% test nix.Filter.metadata
905+
mainName = 'testSubSection';
906+
main = b.create_data_array(mainName, 'nixDataArray', nix.DataType.Bool, [2 2]);
907+
t.add_reference(main);
908+
subName = 'testSubSection1';
909+
s = f.create_section(subName, 'nixSection');
910+
main.set_metadata(s);
911+
subID = s.id;
912+
913+
assert(isempty(f.blocks{1}.multiTags{1}.filter_references(nix.Filter.metadata, 'Do not exist')));
914+
filtered = f.blocks{1}.multiTags{1}.filter_references(nix.Filter.metadata, subID);
915+
assert(size(filtered, 1) == 1);
916+
assert(strcmp(filtered{1}.name, mainName));
917+
918+
% test nix.Filter.source
919+
mainName = 'testSubSource';
920+
main = b.create_data_array(mainName, 'nixDataArray', nix.DataType.Bool, [2 2]);
921+
t.add_reference(main);
922+
mainID = main.id;
923+
subName = 'testSubSource1';
924+
s = b.create_source(subName, 'nixSource');
925+
main.add_source(s);
926+
subID = s.id;
927+
928+
assert(isempty(f.blocks{1}.multiTags{1}.filter_references(nix.Filter.source, 'Do not exist')));
929+
930+
% filter works only for ID, not for name
931+
filtered = f.blocks{1}.multiTags{1}.filter_references(nix.Filter.source, subID);
932+
assert(size(filtered, 1) == 1);
933+
assert(strcmp(filtered{1}.name, mainName));
934+
end

0 commit comments

Comments
 (0)