/// <summary>
        /// Fills the schema.
        /// </summary>
        /// <param name="select">The select.</param>
        /// <param name="tableName">Name of the table.</param>
        /// <returns>List&lt;TableSchemaModel&gt;.</returns>
        protected override List <TableSchemaModel> FillSchema(string select, string tableName)
        {
            var dataset = ExecuteQuery(select);

            List <TableSchemaModel> tableSchemaModel = new List <TableSchemaModel>();

            var schema = dataset.Tables[0];

            TableSchemaModel table = new TableSchemaModel();

            tableSchemaModel.Add(table);
            table.TableName = tableName;

            DqlDataTypeMap map = new DqlDataTypeMap();
            //attr_type, min_length, attr_length, attr_repeating, mandatory

            int ordinal = 0;
            var fields  = schema.AsEnumerable().Select(s => new FieldSchemaModel
            {
                Name        = (string)s["attr_name"],
                MaxLength   = (int)s["attr_length"],
                Type        = map[(int)s["attr_type"]].ToString(),
                IsRepeating = int.Parse(s["attr_repeating"].ToString()) == 0 ? false : true,
                Ordinal     = ordinal++,
                TableName   = tableName
            });

            table.Fields.AddRange(fields);
            return(tableSchemaModel);
        }
        /// <summary>
        /// Gets the schema model external.
        /// </summary>
        /// <returns>List&lt;TableSchemaModel&gt;.</returns>
        public List <TableSchemaModel> GetSchemaModelExternal()
        {
            DqlDataTypeMap          map = new DqlDataTypeMap();
            List <TableSchemaModel> tableSchemaModel = new List <TableSchemaModel>();

            string select = "select distinct t.name, t.attr_name, t.attr_type, '0' as min_length, t.attr_length, t.attr_repeating, a.not_null as mandatory from dm_type t, dmi_dd_attr_info a where t.name = a.type_name and t.attr_name = a.attr_name enable(row_based)";

            var schema = ExecuteQueryExternal(select).Tables[0].AsEnumerable().GroupBy(g => g.Field <string>("name"));

            foreach (var item in schema)
            {
                TableSchemaModel table = new TableSchemaModel();
                tableSchemaModel.Add(table);
                FillSchemaModel(table, item);
            }
            return(tableSchemaModel);
        }
        /// <summary>
        /// Fills the schema model.
        /// </summary>
        /// <param name="table">The table.</param>
        /// <param name="tableName">Name of the table.</param>
        /// <param name="item">The item.</param>
        private void FillSchemaModel(TableSchemaModel table, IGrouping <string, DataRow> item)
        {
            DqlDataTypeMap map = new DqlDataTypeMap();

            table.TableName = item.Key;
            int ordinal = 0;

            table.Fields.AddRange(item.Select(s => new FieldSchemaModel()
            {
                Name        = s.Field <string>("attr_name"),
                Ordinal     = ordinal++,
                Type        = map[(int)s["attr_type"]].ToString(),
                MaxLength   = (int)s["attr_length"],
                IsRepeating = Convert.ToBoolean(s["attr_repeating"]),
                TableName   = item.Key
            }).ToArray());
        }
        /// <summary>
        /// Gets the schema model.
        /// </summary>
        /// <returns>List&lt;TableSchemaModel&gt;.</returns>
        public override List <TableSchemaModel> GetSchemaModel()
        {
            if (UseExternalQueryEngine())
            {
                return(GetSchemaModelExternal());
            }

            DqlDataTypeMap          map = new DqlDataTypeMap();
            List <TableSchemaModel> tableSchemaModel = new List <TableSchemaModel>();

            using (DqlConnection cn = new DqlConnection(ConnectionString))
            {
                cn.Open();
                var schema = cn.GetSchema().AsEnumerable().GroupBy(g => g.Field <string>("name"));

                foreach (var item in schema)
                {
                    TableSchemaModel table = new TableSchemaModel();
                    tableSchemaModel.Add(table);
                    FillSchemaModel(table, item);
                }
            }
            return(tableSchemaModel);
        }