/// <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));
		}
Пример #2
0
 public static void CreateIndex(this IndexHelper indexHelper) 
 {
     indexHelper.CreateIndex(new PanGuAnalyzer());
 }
Пример #3
0
        /// <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;
        }
Пример #4
0
        /// <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
        }
Пример #5
0
 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);
 }
Пример #6
0
        /// <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;
        }