Skip to content

Commit f64c6c0

Browse files
committed
[c++/m] Add MultiTag sourcesFilter
1 parent 34a1a26 commit f64c6c0

File tree

4 files changed

+92
-2
lines changed

4 files changed

+92
-2
lines changed

nix_mx.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,7 @@ void mexFunction(int nlhs,
371371
methods->add("MultiTag::openFeatureIdx", nixmultitag::openFeatureIdx);
372372
methods->add("MultiTag::openSourceIdx", nixmultitag::openSourceIdx);
373373
methods->add("MultiTag::compare", nixmultitag::compare);
374+
methods->add("MultiTag::sourcesFiltered", nixmultitag::sourcesFiltered);
374375

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

src/nixmultitag.cc

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@
77
// LICENSE file in the root of the Project.
88

99
#include "nixmultitag.h"
10-
#include "mkarray.h"
1110

1211
#include "mex.h"
1312

1413
#include <nix.hpp>
1514

16-
#include "handle.h"
1715
#include "arguments.h"
16+
#include "filters.h"
17+
#include "handle.h"
18+
#include "mkarray.h"
1819
#include "struct.h"
1920

2021
namespace nixmultitag {
@@ -107,4 +108,13 @@ namespace nixmultitag {
107108
output.set(0, currObj.compare(other));
108109
}
109110

111+
void sourcesFiltered(const extractor &input, infusor &output) {
112+
nix::MultiTag currObj = input.entity<nix::MultiTag>(1);
113+
std::vector<nix::Source> res = filterEntity<nix::Source>(input,
114+
[currObj](const nix::util::Filter<nix::Source>::type &filter) {
115+
return currObj.sources(filter);
116+
});
117+
output.set(0, res);
118+
}
119+
110120
} // namespace nixmultitag

src/nixmultitag.h

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

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

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

4446
#endif

tests/TestMultiTag.m

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
funcs{end+1} = @test_set_units;
4646
funcs{end+1} = @test_attrs;
4747
funcs{end+1} = @test_compare;
48+
funcs{end+1} = @test_filter_source;
4849
end
4950

5051
%% Test: Add sources by entity and id
@@ -779,3 +780,79 @@
779780
assert(t2.compare(t1) > 0);
780781
assert(t1.compare(t3) ~= 0);
781782
end
783+
784+
%% Test: filter sources
785+
function [] = test_filter_source( varargin )
786+
filterName = 'filterMe';
787+
filterType = 'filterType';
788+
f = nix.File(fullfile(pwd, 'tests', 'testRW.h5'), nix.FileMode.Overwrite);
789+
b = f.create_block('testBlock', 'nixBlock');
790+
d = b.create_data_array('testDataArray', 'nixDataArray', nix.DataType.Double, [2 3]);
791+
t = b.create_multi_tag('testMultiTag', 'nixMultiTag', d);
792+
s = b.create_source(filterName, 'nixSource');
793+
t.add_source(s);
794+
filterID = s.id;
795+
s = b.create_source('testSource1', filterType);
796+
t.add_source(s);
797+
filterIDs = {filterID, s.id};
798+
s = b.create_source('testSource2', filterType);
799+
t.add_source(s);
800+
801+
% test empty id filter
802+
assert(isempty(f.blocks{1}.multiTags{1}.filter_sources(nix.Filter.id, 'IdoNotExist')));
803+
804+
% test nix.Filter.accept_all
805+
filtered = f.blocks{1}.multiTags{1}.filter_sources(nix.Filter.accept_all, '');
806+
assert(size(filtered, 1) == 3);
807+
808+
% test nix.Filter.id
809+
filtered = f.blocks{1}.multiTags{1}.filter_sources(nix.Filter.id, filterID);
810+
assert(size(filtered, 1) == 1);
811+
assert(strcmp(filtered{1}.id, filterID));
812+
813+
% test nix.Filter.ids
814+
filtered = f.blocks{1}.multiTags{1}.filter_sources(nix.Filter.ids, filterIDs);
815+
assert(size(filtered, 1) == 2);
816+
assert(strcmp(filtered{1}.id, filterIDs{1}) || strcmp(filtered{1}.id, filterIDs{2}));
817+
818+
% test nix.Filter.name
819+
filtered = f.blocks{1}.multiTags{1}.filter_sources(nix.Filter.name, filterName);
820+
assert(size(filtered, 1) == 1);
821+
assert(strcmp(filtered{1}.name, filterName));
822+
823+
% test nix.Filter.type
824+
filtered = f.blocks{1}.multiTags{1}.filter_sources(nix.Filter.type, filterType);
825+
assert(size(filtered, 1) == 2);
826+
827+
% test nix.Filter.metadata
828+
mainName = 'testSubSection';
829+
mainSource = b.create_source(mainName, 'nixSource');
830+
t.add_source(mainSource);
831+
subName = 'testSubSection1';
832+
s = f.create_section(subName, 'nixSection');
833+
mainSource.set_metadata(s);
834+
subID = s.id;
835+
836+
assert(isempty(f.blocks{1}.multiTags{1}.filter_sources(nix.Filter.metadata, 'Do not exist')));
837+
filtered = f.blocks{1}.multiTags{1}.filter_sources(nix.Filter.metadata, subID);
838+
assert(size(filtered, 1) == 1);
839+
assert(strcmp(filtered{1}.name, mainName));
840+
841+
% test nix.Filter.source
842+
mainName = 'testSubSource';
843+
main = b.create_source(mainName, 'nixSource');
844+
t.add_source(main);
845+
mainID = main.id;
846+
subName = 'testSubSource1';
847+
s = main.create_source(subName, 'nixSource');
848+
subID = s.id;
849+
850+
assert(isempty(f.blocks{1}.multiTags{1}.filter_sources(nix.Filter.source, 'Do not exist')));
851+
filtered = f.blocks{1}.multiTags{1}.filter_sources(nix.Filter.source, subName);
852+
assert(size(filtered, 1) == 1);
853+
assert(strcmp(filtered{1}.id, mainID));
854+
855+
filtered = f.blocks{1}.multiTags{1}.filter_sources(nix.Filter.source, subID);
856+
assert(size(filtered, 1) == 1);
857+
assert(strcmp(filtered{1}.name, mainName));
858+
end

0 commit comments

Comments
 (0)