async getInstancesPathSearch()

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,
      },
    };
  }