Skip to content

Commit 75c62cd

Browse files
committed
[c++/m] Add Block findSources function
1 parent f754f70 commit 75c62cd

File tree

5 files changed

+153
-0
lines changed

5 files changed

+153
-0
lines changed

+nix/Block.m

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,30 @@
184184
'Block::sourcesFiltered', @nix.Source);
185185
end
186186

187+
% maxdepth is an index
188+
function sec = find_sources(obj, max_depth)
189+
sec = obj.find_filtered_sources(max_depth, nix.Filter.accept_all, '');
190+
end
191+
192+
% maxdepth is an index
193+
function sec = find_filtered_sources(obj, max_depth, filter, val)
194+
if (~isnumeric(max_depth))
195+
error('Provide a valid search depth');
196+
end
197+
198+
valid = nix.Utils.valid_filter(filter, val);
199+
if(~isempty(valid))
200+
error(valid);
201+
end
202+
203+
ret = nix_mx('Block::findSources', obj.nix_handle, ...
204+
max_depth, uint8(filter), val);
205+
sec = cell(length(ret), 1);
206+
for i = 1:length(ret)
207+
sec{i} = nix.Source(ret{i});
208+
end;
209+
end
210+
187211
% -----------------
188212
% Tags methods
189213
% -----------------

nix_mx.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ void mexFunction(int nlhs,
174174
methods->add("Block::tagsFiltered", nixblock::tagsFiltered);
175175
methods->add("Block::multiTagsFiltered", nixblock::multiTagsFiltered);
176176
methods->add("Block::dataArraysFiltered", nixblock::dataArraysFiltered);
177+
methods->add("Block::findSources", nixblock::findSources);
177178

178179
classdef<nix::Group>("Group", methods)
179180
.desc(&nixgroup::describe)

src/nixblock.cc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,4 +142,17 @@ namespace nixblock {
142142
output.set(0, res);
143143
}
144144

145+
void findSources(const extractor &input, infusor &output) {
146+
nix::Block currObj = input.entity<nix::Block>(1);
147+
size_t max_depth = (size_t)input.num<double>(2);
148+
uint8_t filter_id = input.num<uint8_t>(3);
149+
150+
std::vector<nix::Source> res = filterFullEntity<nix::Source>(input, filter_id, 4, max_depth,
151+
[currObj](const nix::util::Filter<nix::Source>::type &filter, size_t &md) {
152+
return currObj.findSources(filter, md);
153+
});
154+
155+
output.set(0, res);
156+
}
157+
145158
} // namespace nixblock

src/nixblock.h

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

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

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

4850
#endif

tests/TestBlock.m

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@
5555
funcs{end+1} = @test_filter_tag;
5656
funcs{end+1} = @test_filter_multi_tag;
5757
funcs{end+1} = @test_filter_data_array;
58+
funcs{end+1} = @test_find_source;
59+
funcs{end+1} = @test_find_source_filtered;
5860
end
5961

6062
function [] = test_attrs( varargin )
@@ -1095,3 +1097,114 @@
10951097
assert(size(filtered, 1) == 1);
10961098
assert(strcmp(filtered{1}.name, mainName));
10971099
end
1100+
1101+
%% Test: Find source w/o filter
1102+
function [] = test_find_source
1103+
f = nix.File(fullfile(pwd, 'tests', 'testRW.h5'), nix.FileMode.Overwrite);
1104+
b = f.create_block('testBlock', 'nixBlock');
1105+
sl1 = b.create_source('sourceLvl1', 'nixSource');
1106+
1107+
sl21 = sl1.create_source('sourceLvl2_1', 'nixSource');
1108+
sl22 = sl1.create_source('sourceLvl2_2', 'nixSource');
1109+
1110+
sl31 = sl21.create_source('sourceLvl3_1', 'nixSource');
1111+
sl32 = sl21.create_source('sourceLvl3_2', 'nixSource');
1112+
sl33 = sl21.create_source('sourceLvl3_3', 'nixSource');
1113+
1114+
sl41 = sl31.create_source('sourceLvl4_1', 'nixSource');
1115+
sl42 = sl31.create_source('sourceLvl4_2', 'nixSource');
1116+
sl43 = sl31.create_source('sourceLvl4_3', 'nixSource');
1117+
sl44 = sl31.create_source('sourceLvl4_4', 'nixSource');
1118+
1119+
% Check invalid entry
1120+
err = 'Provide a valid search depth';
1121+
try
1122+
b.find_sources('hurra');
1123+
catch ME
1124+
assert(strcmp(ME.message, err));
1125+
end
1126+
1127+
% find all
1128+
filtered = b.find_sources(4);
1129+
assert(size(filtered, 1) == 10);
1130+
1131+
% find until level 4
1132+
filtered = b.find_sources(3);
1133+
assert(size(filtered, 1) == 10);
1134+
1135+
% find until level 3
1136+
filtered = b.find_sources(2);
1137+
assert(size(filtered, 1) == 6);
1138+
1139+
% find until level 2
1140+
filtered = b.find_sources(1);
1141+
assert(size(filtered, 1) == 3);
1142+
1143+
% find until level 1
1144+
filtered = b.find_sources(0);
1145+
assert(size(filtered, 1) == 1);
1146+
end
1147+
1148+
%% Test: Find sources with filters
1149+
function [] = test_find_source_filtered
1150+
findSource = 'nixFindSection';
1151+
f = nix.File(fullfile(pwd, 'tests', 'testRW.h5'), nix.FileMode.Overwrite);
1152+
b = f.create_block('testBlock', 'nixBlock');
1153+
sl1 = b.create_source('sourceLvl1', 'nixSource');
1154+
1155+
sl21 = sl1.create_source('sourceLvl2_1', 'nixSource');
1156+
sl22 = sl1.create_source('sourceLvl2_2', findSource);
1157+
1158+
sl31 = sl21.create_source('sourceLvl3_1', findSource);
1159+
sl32 = sl21.create_source('sourceLvl3_2', 'nixSource');
1160+
sl33 = sl21.create_source('sourceLvl3_3', 'nixSource');
1161+
1162+
sl41 = sl31.create_source('sourceLvl4_1', findSource);
1163+
sl42 = sl31.create_source('sourceLvl4_2', 'nixSource');
1164+
sl43 = sl31.create_source('sourceLvl4_3', 'nixSource');
1165+
sl44 = sl31.create_source('sourceLvl4_4', 'nixSource');
1166+
1167+
% test find by id
1168+
filtered = b.find_filtered_sources(0, nix.Filter.id, sl41.id);
1169+
assert(isempty(filtered));
1170+
filtered = b.find_filtered_sources(3, nix.Filter.id, sl41.id);
1171+
assert(size(filtered, 1) == 1);
1172+
assert(strcmp(filtered{1}.id, sl41.id));
1173+
1174+
% test find by ids
1175+
filterids = {sl1.id, sl41.id};
1176+
filtered = b.find_filtered_sources(0, nix.Filter.ids, filterids);
1177+
assert(size(filtered, 1) == 1);
1178+
filtered = b.find_filtered_sources(3, nix.Filter.ids, filterids);
1179+
assert(size(filtered, 1) == 2);
1180+
1181+
% test find by name
1182+
filtered = b.find_filtered_sources(0, nix.Filter.name, sl41.name);
1183+
assert(isempty(filtered));
1184+
filtered = b.find_filtered_sources(3, nix.Filter.name, sl41.name);
1185+
assert(size(filtered, 1) == 1);
1186+
assert(strcmp(filtered{1}.name, sl41.name));
1187+
1188+
% test find by type
1189+
filtered = b.find_filtered_sources(0, nix.Filter.type, findSource);
1190+
assert(isempty(filtered));
1191+
filtered = b.find_filtered_sources(3, nix.Filter.type, findSource);
1192+
assert(size(filtered, 1) == 3);
1193+
assert(strcmp(filtered{1}.type, findSource));
1194+
1195+
% test nix.Filter.metadata
1196+
sec = f.create_section('testSection', 'nixSection');
1197+
sl43.set_metadata(sec);
1198+
filtered = b.find_filtered_sources(0, nix.Filter.metadata, sec.id);
1199+
assert(isempty(filtered));
1200+
filtered = b.find_filtered_sources(3, nix.Filter.metadata, sec.id);
1201+
assert(size(filtered, 1) == 1);
1202+
strcmp(filtered{1}.id, sl43.id);
1203+
1204+
% test nix.Filter.source
1205+
filtered = b.find_filtered_sources(0, nix.Filter.source, sl44.id);
1206+
assert(isempty(filtered));
1207+
filtered = b.find_filtered_sources(3, nix.Filter.source, sl44.id);
1208+
assert(size(filtered, 1) == 1);
1209+
assert(strcmp(filtered{1}.id, sl31.id));
1210+
end

0 commit comments

Comments
 (0)