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)); }
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); }
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()); }