New Snippet New Snippet Recent Snippets Recent Snippets My Snippets My Snippets Web Code Search Snippets Search
Sign inor Register
Language: C#

MdxMemberReader

40 Views
Copy Code Show/Hide Line Numbers
   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Data;
   4:  using System.Linq;
   5:  using System.Xml;
   6:  using System.Xml.Linq;
   7:  using LinqToTree;
   8:   
   9:  namespace AdomdClient.Data
  10:  {
  11:      public class MdxMemberReader
  12:      {
  13:          private const string MeasuresPrefix = "[Measures].[";
  14:          private const string CaptionSuffix = "].[MEMBER_CAPTION]";
  15:   
  16:          public IEnumerable<MdxMemberInfo> Members { get; private set; }
  17:   
  18:          public IEnumerable<ILinqToTree<MdxMemberInfo>> Tree
  19:          {
  20:              get { return Members.OfType<ILinqToTree<MdxMemberInfo>>(); }
  21:          }
  22:   
  23:          public MdxMemberReader(XmlReader reader, int index)
  24:          {
  25:              var root = XElement.Load(reader);
  26:              Initialize(root, index);
  27:          }
  28:   
  29:          private void Initialize(XElement root, int index)
  30:          {
  31:              var members = new List<MdxMemberInfo>();
  32:              this.Members = members;
  33:   
  34:              var ns = XNamespace.Get("urn:schemas-microsoft-com:xml-analysis:mddataset");
  35:              var axis = root.Element(ns + "Axes")
  36:                  .Elements(ns + "Axis").FirstOrDefault(a => ((String)a.Attribute("name")) == ("Axis" + index));
  37:   
  38:              if (axis != null)
  39:              {
  40:                  var tuples = axis.Element(ns + "Tuples").Elements(ns + "Tuple");
  41:                  MdxMemberInfo current = null;
  42:   
  43:                  foreach (var tuple in tuples)
  44:                  {
  45:                      var el = tuple.Element(ns + "Member");
  46:                      var info = new MdxMemberInfo()
  47:                      {
  48:                          UniqueName = el.Element(ns + "UName").Value,
  49:                          Caption = el.Element(ns + "Caption").Value,
  50:                          Level = Int32.Parse(el.Element(ns + "LNum").Value)
  51:                      };
  52:   
  53:                      if (current == null)
  54:                      {
  55:                          current = info;
  56:                          members.Add(info);
  57:                      }
  58:                      else
  59:                      {
  60:                          // if (info.Level == current.Level)
  61:                          var parent = current.Parent;
  62:   
  63:                          if (info.Level == current.Level + 1)
  64:                          {
  65:                              parent = current;
  66:                          }
  67:                          else if (info.Level < current.Level)
  68:                          {
  69:                              parent = current.Parent;
  70:   
  71:                              while (parent != null && parent.Level >= info.Level)
  72:                              {
  73:                                  parent = parent.Parent;
  74:                              }
  75:                          }
  76:   
  77:                          if (parent != null)
  78:                          {
  79:                              parent.Children.Add(info);
  80:                              info.Parent = parent;
  81:                          }
  82:                          else
  83:                          {
  84:                              members.Add(info);
  85:                          }
  86:   
  87:                          current = info;
  88:                      }
  89:                  }
  90:              }
  91:          }
  92:   
  93:          #region FormatColumnName Methods
  94:   
  95:          public static void FormatColumnNames(DataSet dataSet)
  96:          {
  97:              foreach (DataTable table in dataSet.Tables)
  98:              {
  99:                  FormatColumnNames(table);
 100:              }
 101:          }
 102:   
 103:          public static void FormatColumnNames(DataTable table)
 104:          {
 105:              foreach (DataColumn col in table.Columns)
 106:              {
 107:                  FormatColumnName(col);
 108:              }
 109:          }
 110:   
 111:          public static void FormatColumnName(DataColumn col)
 112:          {
 113:              var name = col.ColumnName;
 114:   
 115:              if (name.StartsWith(MeasuresPrefix, StringComparison.OrdinalIgnoreCase))
 116:              {
 117:                  name = name.Substring(MeasuresPrefix.Length, name.Length - (MeasuresPrefix.Length + 1));
 118:              }
 119:              else if (name.EndsWith(CaptionSuffix, StringComparison.OrdinalIgnoreCase))
 120:              {
 121:                  name = name.Substring(0, name.IndexOf(CaptionSuffix, StringComparison.OrdinalIgnoreCase));
 122:                  name = name.Substring(name.LastIndexOf('[') + 1);
 123:              }
 124:   
 125:              col.Caption = name;
 126:              col.ColumnName = name.Replace(" ", "");
 127:          }
 128:   
 129:          #endregion FormatColumnName Methods
 130:      }
 131:   
 132:      public class MdxMemberInfo : ILinqToTree<MdxMemberInfo>
 133:      {
 134:          public string UniqueName { get; set; }
 135:          public string Caption { get; set; }
 136:          public int Level { get; set; }
 137:   
 138:          public MdxMemberInfo Parent { get; set; }
 139:   
 140:          private List<MdxMemberInfo> children;
 141:          public List<MdxMemberInfo> Children
 142:          {
 143:              get
 144:              {
 145:                  if (children == null)
 146:                  {
 147:                      children = new List<MdxMemberInfo>();
 148:                  }
 149:   
 150:                  return children;
 151:              }
 152:              set
 153:              {
 154:                  children = value;
 155:              }
 156:          }
 157:   
 158:          public override string ToString()
 159:          {
 160:              return String.Format("{0} : {1}", UniqueName, Caption);
 161:          }
 162:   
 163:          #region ILinqToTree<MdxMemberInfo> Members
 164:   
 165:          IEnumerable<ILinqToTree<MdxMemberInfo>> ILinqToTree<MdxMemberInfo>.Children()
 166:          {
 167:              return this.Children.OfType<ILinqToTree<MdxMemberInfo>>();
 168:          }
 169:   
 170:          ILinqToTree<MdxMemberInfo> ILinqToTree<MdxMemberInfo>.Parent
 171:          {
 172:              get { return this.Parent; }
 173:          }
 174:   
 175:          public MdxMemberInfo Item
 176:          {
 177:              get { return this; }
 178:          }
 179:   
 180:          #endregion
 181:      }
 182:  }
by Bobby Diaz
  May 20, 2010 @ 3:08pm
Tags:

Add a comment


Report Abuse
brought to you by:
West Wind Techologies


If you find this site useful and use it frequently please consider making a donation to support this free service.
Donate