Example #1
0
        private FilterOperationBase BuildFilter(FilterTreeNode node)
        {
            // Если узел - операция
            OperationTreeNode operationNode = node as OperationTreeNode;
            {
                if (operationNode != null)
                {
                    FilterOperation operation = new FilterOperation(operationNode.Operation);
                    foreach (object obj in operationNode.Items)
                    {
                        FilterTreeNode childNode = obj as FilterTreeNode;
                        if (childNode != null)
                        {
                            FilterOperationBase filter = BuildFilter(childNode);
                            if (filter != null)
                            {
                                operation.Children.Add(filter);
                            }
                        }
                    }
                    return(operation);
                }
            }

            // Если узел - операнд
            OperandTreeNode operand = node as OperandTreeNode;

            if (operand != null)
            {
                return(operand.Operand);
            }

            return(null);
        }
        public virtual String SearchMembers(String startLevelUniqueName, FilterOperationBase filter)
        {
            //Если Уровень, с которого нужно тображать не задан, то поиск по всей иерархии измерения
            //Запрос для поиска будет иметь следующий вид:
            //HIERARCHIZE(
            //FILTER([Customers].ALLMEMBERS, InStr([Customers].CURRENTMEMBER.NAME, "Bikes") > 0))

            //Если Уровень, с которого нужно тображать задан, то поиск только начиная с этого уровня
            //HIERARCHIZE(
            //FILTER(
            //GENERATE(StartLevelUniqueName.ALLMEMBERS, DESCENDANTS([Customers].CURRENTMEMBER)), InStr([Customers].CURRENTMEMBER.NAME, "Bikes") > 0))


            //Set для поиска
            String FindSet = String.Empty;

            String filterSet = BuildFilterCondition(filter);

            if (!String.IsNullOrEmpty(filterSet))
            {
                if (!String.IsNullOrEmpty(startLevelUniqueName))
                {
                    //Поиск начиная с уровня
                    FindSet = "HIERARCHIZE(FILTER(GENERATE(" +
                              startLevelUniqueName + ".ALLMEMBERS, DESCENDANTS( " +
                              HierarchyUniqueName + ".CURRENTMEMBER)), " + filterSet + "))";
                }
                else
                {
                    //Поиск по всей иерархии измерения
                    FindSet = "HIERARCHIZE(FILTER(" +
                              HierarchyUniqueName +
                              ".ALLMEMBERS, " + filterSet + "))";
                }
            }
            else
            {
                if (!String.IsNullOrEmpty(startLevelUniqueName))
                {
                    FindSet = "HIERARCHIZE(GENERATE(" +
                              startLevelUniqueName + ".ALLMEMBERS, DESCENDANTS( " +
                              HierarchyUniqueName + ".CURRENTMEMBER)))";
                }
                else
                {
                    //Поиск по всей иерархии измерения
                    FindSet = "HIERARCHIZE(" +
                              HierarchyUniqueName +
                              ".ALLMEMBERS)";
                }
            }

            return(LoadSet(FindSet, true));
        }
Example #3
0
 public FilterOperationBase GetFilter()
 {
     if (Tree.Items.Count > 0)
     {
         FilterTreeNode node = Tree.Items[0] as FilterTreeNode;
         if (node != null)
         {
             FilterOperationBase res = BuildFilter(node);
             return(res);
         }
     }
     return(null);
 }
Example #4
0
        public static MemberChoiceQuery CreateFindMembersArgs(String connectionString, String cubeName, String subCube, String hierarchyUniqueName, String startLevelUniqueName, FilterOperationBase filter)
        {
            MemberChoiceQuery args = new MemberChoiceQuery();

            args.Connection           = connectionString;
            args.CubeName             = cubeName;
            args.HierarchyUniqueName  = hierarchyUniqueName;
            args.StartLevelUniqueName = startLevelUniqueName;
            args.QueryType            = MemberChoiceQueryType.FindMembers;
            args.SubCube = subCube;
            args.Filter  = filter;
            return(args);
        }
        String BuildFilterCondition(FilterOperationBase filter)
        {
            StringBuilder builder = new StringBuilder();

            if (filter != null)
            {
                // Опрерация
                FilterOperation operation = filter as FilterOperation;
                if (operation != null)
                {
                    List <String> operands = new List <string>();
                    foreach (FilterOperationBase child in operation.Children)
                    {
                        String x = BuildFilterCondition(child);
                        if (!String.IsNullOrEmpty(x))
                        {
                            operands.Add(String.Format("({0})", x));
                        }
                    }

                    if (operands.Count > 1)
                    {
                        builder.Append("(");
                    }
                    for (int i = 0; i < operands.Count; i++)
                    {
                        if (i > 0)
                        {
                            builder.AppendFormat(" {0} ", operation.Operation.ToString());
                        }
                        builder.Append(operands[i]);
                    }
                    if (operands.Count > 1)
                    {
                        builder.Append(")");
                    }
                }

                FilterOperand operand = filter as FilterOperand;
                if (operand != null)
                {
                    // Если свойство не является общим для всех уровней - (общие: Caption, UniqueName, Name)
                    // То при формировании нужно обязательно проверять чтобы текущий уровень был именно тем, на котором это свойство есть
                    // Исключение составляют случаи когда измерение Parent-Child
                    bool isParentChild = false;
                    // XXX
                    //try
                    //{
                    //    OlapMetadataProvider provider = new OlapMetadataProvider(QueryExecuter.Connection);
                    //    HierarchyInfo hierarchy = provider.GetHierarchy(cubeName, String.Empty, hierarchyUniqueName);
                    //    if(hierarchy != null && hierarchy.HierarchyOrigin == HierarchyInfoOrigin.ParentChildHierarchy)
                    //    {
                    //        isParentChild = true;
                    //    }
                    //}
                    //catch { }

                    // Свойство с одним и тем же именем может присутствовать на нескольких уровнях. В данном случае operand.PropertyLevels содержит коллекцию уникальных имен уровней. Их все нужно учесть
                    if (operand.PropertyLevels.Count != 0 && !isParentChild)
                    {
                        int i = 0;
                        builder.Append("(");
                        foreach (String levelUniqueName in operand.PropertyLevels)
                        {
                            if (i > 0)
                            {
                                builder.Append("or ");
                            }
                            builder.AppendFormat("({0}.Level is {1}) ", HierarchyUniqueName, levelUniqueName);
                            i++;
                        }
                        builder.Append(")");
                        builder.Append(" and ");
                    }
                    switch (operand.Condition)
                    {
                    case ConditionTypes.Equal:
                        builder.AppendFormat("{0}.Properties(\"{1}\")='{2}'", HierarchyUniqueName, operand.Property, operand.Value);
                        break;

                    case ConditionTypes.Contains:
                        builder.AppendFormat("InStr({0}.Properties(\"{1}\"),'{2}') <> 0", HierarchyUniqueName, operand.Property, operand.Value);
                        break;

                    case ConditionTypes.BeginWith:
                        //Позиция при использовании InStr начинается с 1
                        builder.AppendFormat("InStr({0}.Properties(\"{1}\"),'{2}') = 1", HierarchyUniqueName, operand.Property, operand.Value);
                        break;
                    }
                }
            }
            return(builder.ToString());
        }