Skip to content

Commit 9eb187c

Browse files
committed
[c++/m] Add MultiTag featuresFilter
1 parent 1450d11 commit 9eb187c

File tree

5 files changed

+80
-0
lines changed

5 files changed

+80
-0
lines changed

+nix/MultiTag.m

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,11 @@
132132
c = nix_mx('MultiTag::featureCount', obj.nix_handle);
133133
end
134134

135+
function filtered = filter_features(obj, filter, val)
136+
filtered = nix.Utils.filter(obj, filter, val, ...
137+
'MultiTag::featuresFiltered', @nix.Feature);
138+
end
139+
135140
% ------------------
136141
% Positions methods
137142
% ------------------

nix_mx.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,7 @@ void mexFunction(int nlhs,
373373
methods->add("MultiTag::compare", nixmultitag::compare);
374374
methods->add("MultiTag::sourcesFiltered", nixmultitag::sourcesFiltered);
375375
methods->add("MultiTag::referencesFiltered", nixmultitag::referencesFiltered);
376+
methods->add("MultiTag::featuresFiltered", nixmultitag::featuresFiltered);
376377

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

src/nixmultitag.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,4 +126,13 @@ namespace nixmultitag {
126126
output.set(0, res);
127127
}
128128

129+
void featuresFiltered(const extractor &input, infusor &output) {
130+
nix::MultiTag currObj = input.entity<nix::MultiTag>(1);
131+
std::vector<nix::Feature> res = filterFeature<nix::Feature>(input,
132+
[currObj](const nix::util::Filter<nix::Feature>::type &filter) {
133+
return currObj.features(filter);
134+
});
135+
output.set(0, res);
136+
}
137+
129138
} // namespace nixmultitag

src/nixmultitag.h

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

4444
void referencesFiltered(const extractor &input, infusor &output);
4545

46+
void featuresFiltered(const extractor &input, infusor &output);
47+
4648
} // namespace nixmultitag
4749

4850
#endif

tests/TestMultiTag.m

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
funcs{end+1} = @test_compare;
4848
funcs{end+1} = @test_filter_source;
4949
funcs{end+1} = @test_filter_reference;
50+
funcs{end+1} = @test_filter_feature;
5051
end
5152

5253
%% Test: Add sources by entity and id
@@ -932,3 +933,65 @@
932933
assert(size(filtered, 1) == 1);
933934
assert(strcmp(filtered{1}.name, mainName));
934935
end
936+
937+
%% Test: filter features
938+
function [] = test_filter_feature( varargin )
939+
f = nix.File(fullfile(pwd, 'tests', 'testRW.h5'), nix.FileMode.Overwrite);
940+
b = f.create_block('testBlock', 'nixBlock');
941+
d = b.create_data_array('testDataArray', 'nixDataArray', nix.DataType.Double, [2 7]);
942+
t = b.create_multi_tag('testMultiTag', 'nixMultiTag', d);
943+
d = b.create_data_array('testDataArray1', 'nixDataArray', nix.DataType.Double, [1 2]);
944+
feat = t.add_feature(d, nix.LinkType.Tagged);
945+
filterID = feat.id;
946+
d = b.create_data_array('testDataArray2', 'nixDataArray', nix.DataType.Double, [1 2]);
947+
feat = t.add_feature(d, nix.LinkType.Tagged);
948+
filterIDs = {filterID, feat.id};
949+
950+
% test empty id filter
951+
assert(isempty(f.blocks{1}.multiTags{1}.filter_features(nix.Filter.id, 'IdoNotExist')));
952+
953+
% test nix.Filter.accept_all
954+
filtered = f.blocks{1}.multiTags{1}.filter_features(nix.Filter.accept_all, '');
955+
assert(size(filtered, 1) == 2);
956+
957+
% test nix.Filter.id
958+
filtered = f.blocks{1}.multiTags{1}.filter_features(nix.Filter.id, filterID);
959+
assert(size(filtered, 1) == 1);
960+
assert(strcmp(filtered{1}.id, filterID));
961+
962+
% test nix.Filter.ids
963+
filtered = f.blocks{1}.multiTags{1}.filter_features(nix.Filter.ids, filterIDs);
964+
assert(size(filtered, 1) == 2);
965+
assert(strcmp(filtered{1}.id, filterIDs{1}) || strcmp(filtered{1}.id, filterIDs{2}));
966+
967+
% test fail on nix.Filter.name
968+
err = 'unknown or unsupported filter';
969+
try
970+
f.blocks{1}.multiTags{1}.filter_features(nix.Filter.name, 'someName');
971+
catch ME
972+
assert(strcmp(ME.message, err));
973+
end
974+
975+
% test fail on nix.Filter.type
976+
err = 'unknown or unsupported filter';
977+
try
978+
f.blocks{1}.multiTags{1}.filter_features(nix.Filter.type, 'someType');
979+
catch ME
980+
assert(strcmp(ME.message, err));
981+
end
982+
983+
% test fail on nix.Filter.metadata
984+
err = 'unknown or unsupported filter';
985+
try
986+
f.blocks{1}.multiTags{1}.filter_features(nix.Filter.metadata, 'someMetadata');
987+
catch ME
988+
assert(strcmp(ME.message, err));
989+
end
990+
991+
% test fail on nix.Filter.source
992+
try
993+
f.blocks{1}.multiTags{1}.filter_features(nix.Filter.source, 'someSource');
994+
catch ME
995+
assert(strcmp(ME.message, err));
996+
end
997+
end

0 commit comments

Comments
 (0)