in src/ServerClient/HierarchyDelegate.ts [104:268]
async getInstancesPathSearch(payload: PathSearchPayload) {
var result = {
children: [],
tags: [],
};
if (
payload.searchString &&
payload.hierarchies?.expand?.kind == HierarchiesExpandKind.UntilChildren
) {
const tableName = "TrenderHierarchySearch";
const tagsTableName = "HierarchyTags";
const query = `
declare query_parameters(SearchString:string, Path: dynamic);
GetPathToTimeseriesId(Path, SearchString) | as ${tableName};
Search_ExactPath(Path, SearchString) | as ${tagsTableName};
`;
const result = await this.client.executeQuery(query, {
parameters: {
Path: `dynamic(${JSON.stringify(payload.path)})`,
SearchString: payload.searchString,
},
});
const unfoldedHierarchy = result.unfoldTable<TagValue>(result.getTable(tableName));
const fullHierarchy: HierachyLevel = {
hits: 1,
name: "ROOT",
children: {},
};
unfoldedHierarchy.forEach((hit) => {
const path = hit.Path;
var pointer = fullHierarchy;
for (const element of payload.path) {
if (path[0] == element) {
path.shift();
} else {
break;
}
}
path.forEach((level) => {
if (level in pointer.children) {
pointer.children[level].hits++;
} else {
pointer.children[level] = {
hits: 1,
name: level,
children: {},
};
}
pointer = pointer.children[level];
});
});
const unfoldedTags = result.unfoldTable<TagValue>(result.getTable(tagsTableName));
return {
instances: {
hits: unfoldedTags.map(tag => tagToHit(tag, payload.searchString)),
hitCount: unfoldedTags.length,
},
hierarchyNodes: convertHierarchy(fullHierarchy).hierarchyNodes,
}
} else if (payload.searchString && payload.instances.recursive) {
result.tags = await this.client.getChildrenTags(payload);
} else if (payload.searchString) {
console.log("level");
result = {
children: [],
tags: await this.client.searchTagsAtPath(payload),
};
} else if (payload.searchString) {
console.log("level");
result = {
children: [],
tags: await this.client.searchTagsAtPath(payload),
};
} else {
result = await this.client.getHierarchyLevel(payload);
}
return {
hierarchyNodes: {
hits: result.children.map((child) => ({
name: child.Child,
cumulativeInstanceCount: child.Count,
})),
hitCount: result.children.length,
},
instances: {
hits: result.tags.map(tag => tagToHit(tag, payload.searchString)),
hitCount: result.tags.length,
},
};
/*
// first call
// second call
path […]
0 "Contoso WindFarm Hierarchy"
Traverse("{hierarchyId}", 1) | distinct current_level_value
// third call
path […]
0 "Contoso WindFarm Hierarchy"
2 "Plant 1"
Traverse("{hierarchyId}", 1) | distinct current_level_value
// later
{
"searchString": "",
"path": [
"Contoso WindFarm Hierarchy",
"Contoso Plant 1",
"W6",
"Gearbox System",
"GearboxOilLevel"
],
"instances": {
"recursive": false,
"sort": {
"by": "DisplayName"
},
"highlights": true,
"pageSize": 10
},
"hierarchies": {
"expand": {
"kind": "OneLevel"
},
"sort": {
"by": "Name"
},
"pageSize": 10
}
}
*/
return {
hierarchyNodes: {
hits: [
{ name: "Contoso WindFarm Hierarchy", cumulativeInstanceCount: 80 },
],
hitCount: 1,
},
};
}