String GetHierarchy(MetadataQuery args) { OlapMetadataProvider provider = new OlapMetadataProvider(new ConnectionInfo(args.Connection, GetConnectionString(args.Connection))); HierarchyInfo info = provider.GetHierarchy(args.CubeName, args.DimensionUniqueName, args.HierarchyUniqueName); return XmlSerializationUtility.Obj2XmlStr(info, Common.Namespace); }
String GetCubes(MetadataQuery args) { OlapMetadataProvider provider = new OlapMetadataProvider(new ConnectionInfo(args.Connection, GetConnectionString(args.Connection))); Dictionary<String, CubeDefInfo> list = provider.GetCubes(); return XmlSerializationUtility.Obj2XmlStr(list.Values.ToList(), Common.Namespace); }
String GetHierarchies(MetadataQuery args) { OlapMetadataProvider provider = new OlapMetadataProvider(new ConnectionInfo(args.Connection, GetConnectionString(args.Connection))); Dictionary<String, HierarchyInfo> list = provider.GetHierarchies(args.CubeName, args.DimensionUniqueName); return XmlSerializationUtility.Obj2XmlStr(list.Values.ToList(), Common.Namespace); }
String GetCubeMetadata(MetadataQuery args) { OlapMetadataProvider provider = new OlapMetadataProvider(new ConnectionInfo(args.Connection, GetConnectionString(args.Connection))); CubeDefInfo info = provider.GetCubeMetadata(args.CubeName, args.QueryType); return XmlSerializationUtility.Obj2XmlStr(info, Common.Namespace); }
String GetMeasureGroups(MetadataQuery args) { OlapMetadataProvider provider = new OlapMetadataProvider(new ConnectionInfo(args.Connection, GetConnectionString(args.Connection))); List<MeasureGroupInfo> list = provider.GetMeasureGroups(args.CubeName); return XmlSerializationUtility.Obj2XmlStr(list, Common.Namespace); }
String GetLevelProperties(MetadataQuery args) { OlapMetadataProvider provider = new OlapMetadataProvider(new ConnectionInfo(args.Connection, GetConnectionString(args.Connection))); // Делать коллекцию с ключем "Имя свойства" нельзя, т.к. свойства KEY1, KEY2 и т.д. есть не у всех уровней и например в контроле выбора элемента измерения при построении уловия поиска придется проверять для каких уровней они есть, а для каких нету List<LevelPropertyInfo> list = new List<LevelPropertyInfo>(); if (String.IsNullOrEmpty(args.LevelUniqueName)) { Dictionary<String, LevelInfo> levels = provider.GetLevels(args.CubeName, args.DimensionUniqueName, args.HierarchyUniqueName); foreach (LevelInfo li in levels.Values) { Dictionary<String, LevelPropertyInfo> properties = provider.GetLevelProperties(args.CubeName, args.DimensionUniqueName, args.HierarchyUniqueName, li.UniqueName); foreach (LevelPropertyInfo pi in properties.Values) { list.Add(pi); } } } else { Dictionary<string, LevelPropertyInfo> properties = provider.GetLevelProperties(args.CubeName, args.DimensionUniqueName, args.HierarchyUniqueName, args.LevelUniqueName); foreach (LevelPropertyInfo pi in properties.Values) { list.Add(pi); } } return XmlSerializationUtility.Obj2XmlStr(list, Common.Namespace); }
String BuildFilterCondition(String cubeName, String hierarchyUniqueName, 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(cubeName, hierarchyUniqueName, 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; 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(); }
String BuildFilterCondition(String cubeName, String hierarchyUniqueName, 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(cubeName, hierarchyUniqueName, 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; 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()); }