ALM Open Test Architecture API Reference Version 12.55
C# Get requirements that match or have descendents that match a filter
Example Title
Copy Code
    /*
     How to call:
       GetRootsOfFilterMatches(Convert.ToInt64("9"));
     */ 
public HierarchySupportList GetRootsOfFilterMatches(long reqID)
{
  /*
    Get requirements that match or have descendants that match a filter
     Determine if a member of the list matches the filter


    ###############################################################
     This example shows the use of the IHierarchyFilter to determine
     which sub-trees under a specific requirement contain at least
     one requirement that matches the filter.

     The example runs on a requirement tree with the requirements below.
     Each requirement has as ParentID the ID of the requirement one step
     above according to the numbers that are part of the name.
     For example, the ParentID of Grandson 1.1.1 is the ID of Child 1.1,
     and the ParentID of Grandson 1.4.1.1 is the ID of Son 1.4.1

     The first item, Req1, is the root of the search tree. The
     ReqID argument to this example is Req1.ID

     The filter is:
        Requirement.Name = "*Son* OR SubNode*" AND
        Requirement.Product = "Emma OR Mansfield Park"
     The items that match the filter in the example are marked with
     an asterisk.
    ----------------------------------------------------------------------------
        Name               | Description              | Priority     | Product
    ----------------------------------------------------------------------------
        Req1               | Root of search tree      | 2-Medium     | Persuasion
        Child 1.1          | Child 1 of Req1          | 5-Urgent     | Persuasion
     *  Grandson 1.1.1     | GrandSon of Req1 1.1.1   | 2-Medium     | Emma
     *  Grandson 1.1.2     | GrandSon of Req1 1.1.2   | 2-Medium     | Emma

        Child 1.2          | Child 2 of Req1          | 4-Very High  | Mansfield Park
     *  Grandson 1.2.1     | GrandSon of Req1 1.2.1   | 5-Urgent     | Emma

        Child 1.3          | Child 3 of Req1          | 3-High      | Persuasion
        Child 1.3.1        | Grandchild of Req1 1.3.1 | 2-Medium    | Emma
        Child 1.3.1.1      | GreatGrandChild of Req1 1.3.1.1
                                                      | 2-Medium    | Mansfield Park
     *  GGGrndSon1.3.1.1.1 | Has Son in name          | 2-Medium    | Mansfield Park

        Child 1.4          | Child 4 of Req1          | 2-Medium    | Northanger Abbey
        Son 1.4.1          | GrandChild Req1          | 3-High      | Persuasion
        Grandson 1.4.1.1   | Grandson of Req 1.4      | 5-Urgent    | Persuasion
        Son 1.4.2          | Son 2 of Req 1.4         | 5-Urgent    | Persuasion

     *  Son 1.5            |Child 5 of Req1           | 3-High      |Emma
   */
  try
  {     
    HierarchyFilter hierFilter;
    HierarchySupportList reqHierL;
    Req rq;
    List reqL;

    ReqFactory reqF = (ReqFactory)tdConnection.ReqFactory;
    String tempStr = String.Empty;

    hierFilter = reqF.Filter;
    /*
      Get the parent nodes by setting KeepHierarchical = True.
      Note that this setting is required to get
      a HierarchySupportList. If KeepHierarchical
      is False or not set, HierarchyFilter.NewList
      returns a List, not a HierarchySupportList.
     */
    hierFilter.KeepHierarchical = true;
    /*
       Set a filter on RQ_FATHER_ID.
       The subtree with that node as its root
       is searched. The returned requirements are
       the direct children of the RQ_FATHER_ID node
       that either match the filter, or have descendants
       that match the  filter.
       Search in the subtree starting at the node passed
       as a parameter to this routine.
     */
    hierFilter["RQ_FATHER_ID"] = reqID.ToString();
    
    //Name filter matches "Son", "GrandSon", and "SubNode."
    hierFilter["RQ_REQ_NAME"] = "*Son* OR SubNode";
    
    //Set the product condition to a condition that matches some requirements.
    hierFilter["RQ_REQ_PRODUCT"] = "Emma OR 'Mansfield Park'";
    
    //Set the order of the results.
    hierFilter.Order["RQ_REQ_PRODUCT"] = 1;
    hierFilter.Order["RQ_REQ_PRIORITY"] = 2;

    reqHierL = (HierarchySupportList)hierFilter.NewList();
    tempStr = String.Format("Number of records found is {0}", reqHierL.Count);
    Debug.Print(tempStr);

    /*
      Number of records found is 4
    
       Note that there are 5 requirements that match the filter.
       The 4 that are returned are the direct children of the searched
       root node that have at least one match in the sub-tree of which they
       are the root. The number of matching descendants does not affect the result.
    
       Son 1.5 has no descendants that match the filter, but Son 1.5
       itself matches the filter. Since Son 1.5 matches the filter, IsInFilter is True.
     */
    for (int i = 1; i < reqHierL.Count; i++)
    {
      rq = reqHierL[i];
      tempStr = String.Format("{0} is in list = {1}   {2},  {3},  {4}", rq.Name, reqHierL.IsInFilter[i], rq.Product,
                              rq.Comment, rq.Priority);
      Debug.WriteLine(tempStr);
    }
    return reqHierL;

  }
  catch (Exception)
  {
    return null;
  }
}