Skip to content

Commit 459b126

Browse files
committed
[c++/m] Add Source sourcesFilter
1 parent ec20b29 commit 459b126

File tree

5 files changed

+90
-1
lines changed

5 files changed

+90
-1
lines changed

+nix/Source.m

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,5 +73,10 @@
7373
retObj = nix.Utils.fetchObjList('Source::referringMultiTags', ...
7474
obj.nix_handle, @nix.MultiTag);
7575
end
76+
77+
function filtered = filter_sources(obj, filter, val)
78+
filtered = nix.Utils.filter(obj, filter, val, ...
79+
'Source::sourcesFiltered', @nix.Source);
80+
end
7681
end;
7782
end

nix_mx.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,7 @@ void mexFunction(int nlhs,
283283
.reg("referringMultiTags", GETTER(std::vector<nix::MultiTag>, nix::Source, referringMultiTags));
284284
methods->add("Source::openSourceIdx", nixsource::openSourceIdx);
285285
methods->add("Source::compare", nixsource::compare);
286+
methods->add("Source::sourcesFiltered", nixsource::sourcesFiltered);
286287

287288
classdef<nix::Tag>("Tag", methods)
288289
.desc(&nixtag::describe)

src/nixsource.cc

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@
1212

1313
#include <nix.hpp>
1414

15-
#include "handle.h"
1615
#include "arguments.h"
16+
#include "filters.h"
17+
#include "handle.h"
1718
#include "struct.h"
1819

1920
namespace nixsource {
@@ -39,4 +40,13 @@ namespace nixsource {
3940
output.set(0, currObj.compare(other));
4041
}
4142

43+
void sourcesFiltered(const extractor &input, infusor &output) {
44+
nix::Source currObj = input.entity<nix::Source>(1);
45+
std::vector<nix::Source> res = filterEntity<nix::Source>(input,
46+
[currObj](const nix::util::Filter<nix::Source>::type &filter) {
47+
return currObj.sources(filter);
48+
});
49+
output.set(0, res);
50+
}
51+
4252
} // namespace nixsource

src/nixsource.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ namespace nixsource {
1919

2020
void compare(const extractor &input, infusor &output);
2121

22+
void sourcesFiltered(const extractor &input, infusor &output);
23+
2224
} // namespace nixsource
2325

2426
#endif

tests/TestSource.m

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
funcs{end+1} = @test_referring_tags;
2727
funcs{end+1} = @test_referring_multi_tags;
2828
funcs{end+1} = @test_compare;
29+
funcs{end+1} = @test_filter_source;
2930
end
3031

3132
%% Test: fetch sources
@@ -298,3 +299,73 @@
298299
assert(s2.compare(s1) > 0);
299300
assert(s1.compare(s3) ~= 0);
300301
end
302+
303+
%% Test: filter sources
304+
function [] = test_filter_source( varargin )
305+
filterName = 'filterMe';
306+
filterType = 'filterType';
307+
f = nix.File(fullfile(pwd, 'tests', 'testRW.h5'), nix.FileMode.Overwrite);
308+
b = f.create_block('testBlock', 'nixBlock');
309+
ms = b.create_source('testSource', 'nixSource');
310+
s = ms.create_source(filterName, 'nixSource');
311+
filterID = s.id;
312+
s = ms.create_source('testSource1', filterType);
313+
filterIDs = {filterID, s.id};
314+
s = ms.create_source('testSource2', filterType);
315+
316+
% test empty id filter
317+
assert(isempty(f.blocks{1}.sources{1}.filter_sources(nix.Filter.id, 'IdoNotExist')));
318+
319+
% test nix.Filter.accept_all
320+
filtered = f.blocks{1}.sources{1}.filter_sources(nix.Filter.accept_all, '');
321+
assert(size(filtered, 1) == 3);
322+
323+
% test nix.Filter.id
324+
filtered = f.blocks{1}.sources{1}.filter_sources(nix.Filter.id, filterID);
325+
assert(size(filtered, 1) == 1);
326+
assert(strcmp(filtered{1}.id, filterID));
327+
328+
% test nix.Filter.ids
329+
filtered = f.blocks{1}.sources{1}.filter_sources(nix.Filter.ids, filterIDs);
330+
assert(size(filtered, 1) == 2);
331+
assert(strcmp(filtered{1}.id, filterIDs{1}) || strcmp(filtered{1}.id, filterIDs{2}));
332+
333+
% test nix.Filter.name
334+
filtered = f.blocks{1}.sources{1}.filter_sources(nix.Filter.name, filterName);
335+
assert(size(filtered, 1) == 1);
336+
assert(strcmp(filtered{1}.name, filterName));
337+
338+
% test nix.Filter.type
339+
filtered = f.blocks{1}.sources{1}.filter_sources(nix.Filter.type, filterType);
340+
assert(size(filtered, 1) == 2);
341+
342+
% test nix.Filter.metadata
343+
mainName = 'testSubSection';
344+
mainSource = ms.create_source(mainName, 'nixSource');
345+
subName = 'testSubSection1';
346+
s = f.create_section(subName, 'nixSection');
347+
mainSource.set_metadata(s);
348+
subID = s.id;
349+
350+
assert(isempty(f.blocks{1}.sources{1}.filter_sources(nix.Filter.metadata, 'Do not exist')));
351+
filtered = f.blocks{1}.sources{1}.filter_sources(nix.Filter.metadata, subID);
352+
assert(size(filtered, 1) == 1);
353+
assert(strcmp(filtered{1}.name, mainName));
354+
355+
% test nix.Filter.source
356+
mainName = 'testSubSource';
357+
main = ms.create_source(mainName, 'nixSource');
358+
mainID = main.id;
359+
subName = 'testSubSource1';
360+
s = main.create_source(subName, 'nixSource');
361+
subID = s.id;
362+
363+
assert(isempty(f.blocks{1}.sources{1}.filter_sources(nix.Filter.source, 'Do not exist')));
364+
filtered = f.blocks{1}.sources{1}.filter_sources(nix.Filter.source, subName);
365+
assert(size(filtered, 1) == 1);
366+
assert(strcmp(filtered{1}.id, mainID));
367+
368+
filtered = f.blocks{1}.sources{1}.filter_sources(nix.Filter.source, subID);
369+
assert(size(filtered, 1) == 1);
370+
assert(strcmp(filtered{1}.name, mainName));
371+
end

0 commit comments

Comments
 (0)