/// <summary> /// The create index API allows to instantiate an index. Elasticsearch provides support for multiple indices, /// including executing operations across several indices. /// <para> </para>http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-create-index.html /// </summary> /// <param name="client"></param> /// <param name="index">The name of the index to be created</param> /// <param name="createIndexSelector">A descriptor that further describes the parameters for the create index operation</param> public static IIndicesOperationResponse CreatIndex(this IElasticClient client, string index, Func<CreateIndexDescriptor, CreateIndexDescriptor> createIndexSelector = null) { index.ThrowIfNullOrEmpty("index"); createIndexSelector = createIndexSelector ?? (c => c); return client.CreateIndex(c => createIndexSelector(c).Index(index)); }
public static void CreateIndex(this IndexHelper indexHelper) { indexHelper.CreateIndex(new PanGuAnalyzer()); }
/// <summary>复制数据表到另一个数据表,复制所有数据列、索引和关系</summary> /// <param name="src"></param> /// <param name="des"></param> /// <param name="resetColumnID">是否重置列ID</param> /// <returns></returns> public static IDataTable CopyAllFrom(this IDataTable src, IDataTable des, Boolean resetColumnID = false) { src.CopyFrom(des); src.Columns.AddRange(des.Columns.Select(i => src.CreateColumn().CopyFrom(i))); src.Indexes.AddRange(des.Indexes.Select(i => src.CreateIndex().CopyFrom(i))); src.Relations.AddRange(des.Relations.Select(i => src.CreateRelation().CopyFrom(i))); // 重载ID if (resetColumnID) src.Columns.ForEach((it, i) => it.ID = i + 1); return src; }
/// <summary>修正数据</summary> /// <param name="table"></param> public static void Fix(this IDataTable table) { #region 根据单字段索引修正对应的关系 // 给所有单字段索引建立关系,特别是一对一关系 foreach (IDataIndex item in table.Indexes) { if (item.Columns == null || item.Columns.Length != 1) continue; IDataRelation dr = table.GetRelation(item.Columns[0]); if (dr == null) continue; dr.Unique = item.Unique; // 跟关系有关联的索引 dr.Computed = item.Computed; } #endregion #region 给所有关系字段建立索引 foreach (IDataRelation dr in table.Relations) { // 跳过主键 IDataColumn dc = table.GetColumn(dr.Column); if (dc == null || dc.PrimaryKey) continue; if (table.GetIndex(dr.Column) == null) { IDataIndex di = table.CreateIndex(); di.Columns = new String[] { dr.Column }; // 这两个的关系,唯一性 di.Unique = dr.Unique; di.Computed = true; table.Indexes.Add(di); } } #endregion #region 从索引中修正主键 IDataColumn[] pks = table.PrimaryKeys; if (pks == null || pks.Length < 1) { // 在索引中找唯一索引作为主键 foreach (IDataIndex item in table.Indexes) { if (!item.PrimaryKey || item.Columns == null || item.Columns.Length < 1) continue; pks = table.GetColumns(item.Columns); if (pks != null && pks.Length > 0) Array.ForEach<IDataColumn>(pks, dc => dc.PrimaryKey = true); } } pks = table.PrimaryKeys; if (pks == null || pks.Length < 1) { // 在索引中找唯一索引作为主键 foreach (IDataIndex item in table.Indexes) { if (!item.Unique || item.Columns == null || item.Columns.Length < 1) continue; pks = table.GetColumns(item.Columns); if (pks != null && pks.Length > 0) Array.ForEach<IDataColumn>(pks, dc => dc.PrimaryKey = true); } } pks = table.PrimaryKeys; if (pks == null || pks.Length < 1) { // 如果还没有主键,把第一个索引作为主键 foreach (IDataIndex item in table.Indexes) { if (item.Columns == null || item.Columns.Length < 1) continue; pks = table.GetColumns(item.Columns); if (pks != null && pks.Length > 0) Array.ForEach<IDataColumn>(pks, dc => dc.PrimaryKey = true); } } #endregion #region 最后修复主键 if (table.PrimaryKeys.Length < 1) { // 自增作为主键,然后是ID/Guid/UID,最后默认使用第一个 // 没办法,如果没有主键,整个实体层都会面临大问题! IDataColumn dc = null; if ((dc = table.Columns.FirstOrDefault(c => c.Identity)) != null) dc.PrimaryKey = true; else if ((dc = table.Columns.FirstOrDefault(c => c.Is("ID"))) != null) dc.PrimaryKey = true; else if ((dc = table.Columns.FirstOrDefault(c => c.Is("Guid"))) != null) dc.PrimaryKey = true; else if ((dc = table.Columns.FirstOrDefault(c => c.Is("UID"))) != null) dc.PrimaryKey = true; else if ((dc = table.Columns.FirstOrDefault()) != null) dc.PrimaryKey = true; } #endregion #region 给非主键的自增字段建立唯一索引 foreach (IDataColumn dc in table.Columns) { if (dc.Identity && !dc.PrimaryKey) { IDataIndex di = GetIndex(table, dc.Name); if (di == null) { di = table.CreateIndex(); di.Columns = new String[] { dc.Name }; di.Computed = true; } // 不管是不是原来有的索引,都要唯一 di.Unique = true; } } #endregion #region 索引应该具有跟字段一样的唯一和主键约束 // 主要针对MSSQL2000 foreach (var di in table.Indexes) { if (di.Columns == null) continue; var dcs = table.GetColumns(di.Columns); if (dcs == null || dcs.Length <= 0) continue; if (!di.Unique) di.Unique = dcs.All(dc => dc.Identity); if (!di.PrimaryKey) di.PrimaryKey = dcs.All(dc => dc.PrimaryKey); } #endregion #region 修正可能错误的别名 List<String> ns = new List<string>(); ns.Add(table.Alias); foreach (IDataColumn item in table.Columns) { if (ns.Contains(item.Alias) || IsKeyWord(item.Alias)) { // 通过加数字的方式,解决关键字问题 for (int i = 2; i < table.Columns.Count; i++) { String name = item.Alias + i; // 加了数字后,不可能是关键字 if (!ns.Contains(name)) { item.Alias = name; break; } } } ns.Add(item.Alias); } #endregion }
public static void CreateConstraint(this IAlterProcessor proc, ConstraintInfo cnt) { var pk = cnt as PrimaryKeyInfo; if (pk != null) proc.CreatePrimaryKey(pk); var fk = cnt as ForeignKeyInfo; if (fk != null) proc.CreateForeignKey(fk); var uq = cnt as UniqueInfo; if (uq != null) proc.CreateUnique(uq); var ix = cnt as IndexInfo; if (ix != null) proc.CreateIndex(ix); var ch = cnt as CheckInfo; if (ch != null) proc.CreateCheck(ch); }
/// <summary>读取</summary> /// <param name="table"></param> /// <param name="reader"></param> /// <returns></returns> public static IDataTable ReadXml(this IDataTable table, XmlReader reader) { // 读属性 if (reader.HasAttributes) { reader.MoveToFirstAttribute(); //do //{ // switch (reader.Name) // { // case "ID": // table.ID = reader.ReadContentAsInt(); // break; // case "Name": // table.Name = reader.ReadContentAsString(); // break; // case "Alias": // table.Alias = reader.ReadContentAsString(); // break; // case "Owner": // table.Owner = reader.ReadContentAsString(); // break; // case "DbType": // table.DbType = (DatabaseType)Enum.Parse(typeof(DatabaseType), reader.ReadContentAsString()); // break; // case "IsView": // table.IsView = Boolean.Parse(reader.ReadContentAsString()); // break; // case "Description": // table.Description = reader.ReadContentAsString(); // break; // default: // break; // } //} while (reader.MoveToNextAttribute()); ReadXml(reader, table); } reader.ReadStartElement(); // 读字段 reader.MoveToElement(); while (reader.NodeType != XmlNodeType.EndElement) { switch (reader.Name) { case "Columns": reader.ReadStartElement(); while (reader.IsStartElement()) { var dc = table.CreateColumn(); (dc as IXmlSerializable).ReadXml(reader); table.Columns.Add(dc); } reader.ReadEndElement(); break; case "Indexes": reader.ReadStartElement(); while (reader.IsStartElement()) { var di = table.CreateIndex(); (di as IXmlSerializable).ReadXml(reader); table.Indexes.Add(di); } reader.ReadEndElement(); break; case "Relations": reader.ReadStartElement(); while (reader.IsStartElement()) { var dr = table.CreateRelation(); (dr as IXmlSerializable).ReadXml(reader); if (table.GetRelation(dr) == null) table.Relations.Add(dr); } reader.ReadEndElement(); break; default: break; } } //reader.ReadEndElement(); if (reader.NodeType == XmlNodeType.EndElement) reader.ReadEndElement(); return table; }