public void TestFilterTree()
        {
            IFilterTree tree = new RelationshipFilterTree(baseRole);

            tree.AddFilter(new RelationalFilter(MediaAspect.ATTR_TITLE, RelationalOperator.EQ, "Item2"),
                           new FilterTreePath(item1Role, item2Role));
            tree.AddFilter(new RelationalFilter(MediaAspect.ATTR_TITLE, RelationalOperator.EQ, "Item3"),
                           new FilterTreePath(item1Role, item3Role));
            tree.AddFilter(new RelationalFilter(MediaAspect.ATTR_TITLE, RelationalOperator.EQ, "Item1"),
                           new FilterTreePath(item1Role));
            tree.AddFilter(new RelationalFilter(MediaAspect.ATTR_TITLE, RelationalOperator.EQ, "Item0"));

            //No linked ids, should build full filter in both directions
            TestFilterTreeNoLinkedIds(tree);
            //Test copy
            IFilterTree copy = tree.DeepCopy();

            TestFilterTreeNoLinkedIds(copy);

            //Add a linked id in the middle, should optimise by ignoring any filters on the linked media item
            tree.AddLinkedId(item1Id, new FilterTreePath(item1Role));
            TestFilterTreeWithLinkedIds(tree);
            //Test copy
            copy = tree.DeepCopy();
            TestFilterTreeWithLinkedIds(copy);
        }
        protected virtual async Task PrepareFilterTree()
        {
            if (!_rootRole.HasValue)
            {
                return;
            }

            _customFilterTree = new RelationshipFilterTree(_rootRole.Value);

            //Update filter by adding the user filter to the already loaded filters
            IFilter userFilter = UserHelper.GetUserRestrictionFilter(_necessaryMias);

            if (userFilter != null)
            {
                _customFilterTree.AddFilter(userFilter);
            }

            userFilter = UserHelper.GetUserRestrictionFilter(new[] { SeriesAspect.ASPECT_ID });
            if (userFilter != null)
            {
                _customFilterTree.AddFilter(userFilter, new FilterTreePath(SeriesAspect.ROLE_SERIES));
            }
        }