Skip to content

Commit ec20b29

Browse files
committed
[c++/m] Add Tag featuresFilter
1 parent 8b42758 commit ec20b29

File tree

5 files changed

+79
-0
lines changed

5 files changed

+79
-0
lines changed

+nix/Tag.m

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,5 +128,10 @@
128128
function c = feature_count(obj)
129129
c = nix_mx('Tag::featureCount', obj.nix_handle);
130130
end
131+
132+
function filtered = filter_features(obj, filter, val)
133+
filtered = nix.Utils.filter(obj, filter, val, ...
134+
'Tag::featuresFiltered', @nix.Feature);
135+
end
131136
end;
132137
end

nix_mx.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ void mexFunction(int nlhs,
325325
methods->add("Tag::compare", nixtag::compare);
326326
methods->add("Tag::sourcesFiltered", nixtag::sourcesFiltered);
327327
methods->add("Tag::referencesFiltered", nixtag::referencesFiltered);
328+
methods->add("Tag::featuresFiltered", nixtag::featuresFiltered);
328329

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

src/nixtag.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,4 +121,13 @@ namespace nixtag {
121121
output.set(0, res);
122122
}
123123

124+
void featuresFiltered(const extractor &input, infusor &output) {
125+
nix::Tag currObj = input.entity<nix::Tag>(1);
126+
std::vector<nix::Feature> res = filterFeature<nix::Feature>(input,
127+
[currObj](const nix::util::Filter<nix::Feature>::type &filter) {
128+
return currObj.features(filter);
129+
});
130+
output.set(0, res);
131+
}
132+
124133
} // namespace nixtag

src/nixtag.h

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

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

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

4648
#endif

tests/TestTag.m

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
funcs{end+1} = @test_compare;
4343
funcs{end+1} = @test_filter_source;
4444
funcs{end+1} = @test_filter_reference;
45+
funcs{end+1} = @test_filter_feature;
4546
end
4647

4748
%% Test: Add sources by entity and id
@@ -803,3 +804,64 @@
803804
assert(size(filtered, 1) == 1);
804805
assert(strcmp(filtered{1}.name, mainName));
805806
end
807+
808+
%% Test: filter features
809+
function [] = test_filter_feature( varargin )
810+
f = nix.File(fullfile(pwd, 'tests', 'testRW.h5'), nix.FileMode.Overwrite);
811+
b = f.create_block('testBlock', 'nixBlock');
812+
t = b.create_tag('testTag', 'nixTag', [1 2 3]);
813+
d = b.create_data_array('testDataArray1', 'nixDataArray', nix.DataType.Double, [1 2]);
814+
feat = t.add_feature(d, nix.LinkType.Tagged);
815+
filterID = feat.id;
816+
d = b.create_data_array('testDataArray2', 'nixDataArray', nix.DataType.Double, [1 2]);
817+
feat = t.add_feature(d, nix.LinkType.Tagged);
818+
filterIDs = {filterID, feat.id};
819+
820+
% test empty id filter
821+
assert(isempty(f.blocks{1}.tags{1}.filter_features(nix.Filter.id, 'IdoNotExist')));
822+
823+
% test nix.Filter.accept_all
824+
filtered = f.blocks{1}.tags{1}.filter_features(nix.Filter.accept_all, '');
825+
assert(size(filtered, 1) == 2);
826+
827+
% test nix.Filter.id
828+
filtered = f.blocks{1}.tags{1}.filter_features(nix.Filter.id, filterID);
829+
assert(size(filtered, 1) == 1);
830+
assert(strcmp(filtered{1}.id, filterID));
831+
832+
% test nix.Filter.ids
833+
filtered = f.blocks{1}.tags{1}.filter_features(nix.Filter.ids, filterIDs);
834+
assert(size(filtered, 1) == 2);
835+
assert(strcmp(filtered{1}.id, filterIDs{1}) || strcmp(filtered{1}.id, filterIDs{2}));
836+
837+
% test fail on nix.Filter.name
838+
err = 'unknown or unsupported filter';
839+
try
840+
f.blocks{1}.tags{1}.filter_features(nix.Filter.name, 'someName');
841+
catch ME
842+
assert(strcmp(ME.message, err));
843+
end
844+
845+
% test fail on nix.Filter.type
846+
err = 'unknown or unsupported filter';
847+
try
848+
f.blocks{1}.tags{1}.filter_features(nix.Filter.type, 'someType');
849+
catch ME
850+
assert(strcmp(ME.message, err));
851+
end
852+
853+
% test fail on nix.Filter.metadata
854+
err = 'unknown or unsupported filter';
855+
try
856+
f.blocks{1}.tags{1}.filter_features(nix.Filter.metadata, 'someMetadata');
857+
catch ME
858+
assert(strcmp(ME.message, err));
859+
end
860+
861+
% test fail on nix.Filter.source
862+
try
863+
f.blocks{1}.tags{1}.filter_features(nix.Filter.source, 'someSource');
864+
catch ME
865+
assert(strcmp(ME.message, err));
866+
end
867+
end

0 commit comments

Comments
 (0)