Skip to content

Commit 34a1a26

Browse files
committed
[c++/m] Add DataArray sourcesFilter
1 parent 459b126 commit 34a1a26

File tree

4 files changed

+94
-4
lines changed

4 files changed

+94
-4
lines changed

nix_mx.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ void mexFunction(int nlhs,
262262
methods->add("DataArray::openSourceIdx", nixdataarray::openSourceIdx);
263263
methods->add("DataArray::openDimensionIdx", nixdataarray::openDimensionIdx);
264264
methods->add("DataArray::compare", nixdataarray::compare);
265+
methods->add("DataArray::sourcesFiltered", nixdataarray::sourcesFiltered);
265266

266267
classdef<nix::Source>("Source", methods)
267268
.desc(&nixsource::describe)

src/nixdataarray.cc

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,17 @@
88

99
#include "nixdataarray.h"
1010
#include "nixdimensions.h"
11-
#include "mkarray.h"
11+
1212
#include "mex.h"
1313

1414
#include <nix.hpp>
1515

16-
#include "handle.h"
1716
#include "arguments.h"
18-
#include "struct.h"
17+
#include "filters.h"
18+
#include "handle.h"
19+
#include "mkarray.h"
1920
#include "mknix.h"
21+
#include "struct.h"
2022

2123
namespace nixdataarray {
2224

@@ -176,4 +178,13 @@ namespace nixdataarray {
176178
output.set(0, currObj.compare(other));
177179
}
178180

181+
void sourcesFiltered(const extractor &input, infusor &output) {
182+
nix::DataArray currObj = input.entity<nix::DataArray>(1);
183+
std::vector<nix::Source> res = filterEntity<nix::Source>(input,
184+
[currObj](const nix::util::Filter<nix::Source>::type &filter) {
185+
return currObj.sources(filter);
186+
});
187+
output.set(0, res);
188+
}
189+
179190
} // namespace nixdataarray

src/nixdataarray.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ namespace nixdataarray {
4747

4848
void compare(const extractor &input, infusor &output);
4949

50+
void sourcesFiltered(const extractor &input, infusor &output);
51+
5052
} // namespace nixdataarray
5153

5254
#endif

tests/TestDataArray.m

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
funcs{end+1} = @test_datatype;
3434
funcs{end+1} = @test_set_data_extent;
3535
funcs{end+1} = @test_compare;
36+
funcs{end+1} = @test_filter_source;
3637
end
3738

3839
function [] = test_attrs( varargin )
@@ -595,4 +596,79 @@
595596
assert(d1.compare(d1) == 0);
596597
assert(d2.compare(d1) > 0);
597598
assert(d1.compare(d3) ~= 0);
598-
end
599+
end
600+
601+
%% Test: filter sources
602+
function [] = test_filter_source( varargin )
603+
filterName = 'filterMe';
604+
filterType = 'filterType';
605+
f = nix.File(fullfile(pwd, 'tests', 'testRW.h5'), nix.FileMode.Overwrite);
606+
b = f.create_block('testBlock', 'nixBlock');
607+
d = b.create_data_array('testDataArray', 'nixDataArray', nix.DataType.Double, [3 2 3]);
608+
s = b.create_source(filterName, 'nixSource');
609+
d.add_source(s);
610+
filterID = s.id;
611+
s = b.create_source('testSource1', filterType);
612+
d.add_source(s);
613+
filterIDs = {filterID, s.id};
614+
s = b.create_source('testSource2', filterType);
615+
d.add_source(s);
616+
617+
% test empty id filter
618+
assert(isempty(f.blocks{1}.dataArrays{1}.filter_sources(nix.Filter.id, 'IdoNotExist')));
619+
620+
% test nix.Filter.accept_all
621+
filtered = f.blocks{1}.dataArrays{1}.filter_sources(nix.Filter.accept_all, '');
622+
assert(size(filtered, 1) == 3);
623+
624+
% test nix.Filter.id
625+
filtered = f.blocks{1}.dataArrays{1}.filter_sources(nix.Filter.id, filterID);
626+
assert(size(filtered, 1) == 1);
627+
assert(strcmp(filtered{1}.id, filterID));
628+
629+
% test nix.Filter.ids
630+
filtered = f.blocks{1}.dataArrays{1}.filter_sources(nix.Filter.ids, filterIDs);
631+
assert(size(filtered, 1) == 2);
632+
assert(strcmp(filtered{1}.id, filterIDs{1}) || strcmp(filtered{1}.id, filterIDs{2}));
633+
634+
% test nix.Filter.name
635+
filtered = f.blocks{1}.dataArrays{1}.filter_sources(nix.Filter.name, filterName);
636+
assert(size(filtered, 1) == 1);
637+
assert(strcmp(filtered{1}.name, filterName));
638+
639+
% test nix.Filter.type
640+
filtered = f.blocks{1}.dataArrays{1}.filter_sources(nix.Filter.type, filterType);
641+
assert(size(filtered, 1) == 2);
642+
643+
% test nix.Filter.metadata
644+
mainName = 'testSubSection';
645+
mainSource = b.create_source(mainName, 'nixSource');
646+
d.add_source(mainSource);
647+
subName = 'testSubSection1';
648+
s = f.create_section(subName, 'nixSection');
649+
mainSource.set_metadata(s);
650+
subID = s.id;
651+
652+
assert(isempty(f.blocks{1}.dataArrays{1}.filter_sources(nix.Filter.metadata, 'Do not exist')));
653+
filtered = f.blocks{1}.dataArrays{1}.filter_sources(nix.Filter.metadata, subID);
654+
assert(size(filtered, 1) == 1);
655+
assert(strcmp(filtered{1}.name, mainName));
656+
657+
% test nix.Filter.source
658+
mainName = 'testSubSource';
659+
main = b.create_source(mainName, 'nixSource');
660+
d.add_source(main);
661+
mainID = main.id;
662+
subName = 'testSubSource1';
663+
s = main.create_source(subName, 'nixSource');
664+
subID = s.id;
665+
666+
assert(isempty(f.blocks{1}.dataArrays{1}.filter_sources(nix.Filter.source, 'Do not exist')));
667+
filtered = f.blocks{1}.dataArrays{1}.filter_sources(nix.Filter.source, subName);
668+
assert(size(filtered, 1) == 1);
669+
assert(strcmp(filtered{1}.id, mainID));
670+
671+
filtered = f.blocks{1}.dataArrays{1}.filter_sources(nix.Filter.source, subID);
672+
assert(size(filtered, 1) == 1);
673+
assert(strcmp(filtered{1}.name, mainName));
674+
end

0 commit comments

Comments
 (0)