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