/// <summary>
        /// Generates a dictionary containing all the columns from the select that are renamed (using AS)
        /// the hashtable has the original values as values and the translated values as keys.
        /// </summary>
        /// <param name="querySet"></param>
        /// <param name="sBuilder"></param>
        /// <returns></returns>
        private Dictionary <DbField, SelectColumnInfo> CreateDictionaryFromSelect(DataQueryResult querySet, SelectBuilder sBuilder)
        {
            Dictionary <DbField, SelectColumnInfo> translation = new Dictionary <DbField, SelectColumnInfo> ();

            string [] columnNames = sBuilder.SelectClause.Select(cInfo => cInfo.ColumnName).ToArray();

            querySet.Columns = fieldsTable.TranslateToColumnInfo(columnNames);
            querySet.MarkTranslated();
            querySet.MarkHidden();
            querySet.MarkPermanent();

            for (int i = 0; i < querySet.Columns.Length; i++)
            {
                if (querySet.Columns [i].Field == null)
                {
                    if (!querySet.Columns [i].IsTranslated)
                    {
                        throw new Exception("Unable to translate column " + columnNames [i]);
                    }
                }
                else
                {
                    SelectColumnInfo cInfo = sBuilder.SelectClause [i];

                    if (cInfo.IsRenamed)
                    {
                        translation.Add(querySet.Columns [i].Field, cInfo);
                    }
                }
            }

            return(translation);
        }
        public override long GetQueryRowsCount(string commandText, params DbParam [] parameters)
        {
            SelectBuilder sBuilder = new SelectBuilder(fieldsTable, commandText);

            // Optimize the query for fast execution
            for (int i = sBuilder.SelectClause.Count - 1; i >= 0; i--)
            {
                SelectColumnInfo cInfo = sBuilder.SelectClause [i];
                if (cInfo.IsGrouped || cInfo.IsAggregated ||
                    sBuilder.HavingClause.Any(having => Regex.IsMatch(having.Key, string.Format(@"([^\w]*)(\w\.)*{0}([^\w]*)", cInfo.ColumnName))))
                {
                    continue;
                }

                sBuilder.SelectClause.RemoveAt(i);
            }

            if (sBuilder.SelectClause.Count == 0)
            {
                sBuilder.SelectClause.Add(new SelectColumnInfo("1"));
            }

            sBuilder.OrderByClause.Clear();

            return(ExecuteScalar <long> (string.Format("SELECT COUNT(*) FROM ({0}) as CountsTable", sBuilder), parameters));
        }
        public override string GetQueryWithFilter(string commandText, IList <DbField> filterFields, string filter, out DbParam [] pars)
        {
            SelectBuilder sBuilder = new SelectBuilder(fieldsTable, commandText);

            string []      filterKeys = filter.Split(new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            List <DbParam> p          = new List <DbParam> ();

            foreach (string key in filterKeys)
            {
                StringBuilder condition = new StringBuilder();

                DbParam par = GetFilterParam(p, key);
                p.Add(par);

                foreach (DbField field in filterFields)
                {
                    SelectColumnInfo colInfo = sBuilder.SelectClause [field];
                    if (colInfo == null)
                    {
                        throw new ArgumentException(string.Format("Cannot search for field {0} as it is not populated from the database", field));
                    }

                    if (condition.Length > 0)
                    {
                        condition.Append(" OR ");
                    }

                    condition.AppendFormat(GetFilterCondition(colInfo.SourceExpression, par));
                }

                sBuilder.WhereClause.Add(new KeyValuePair <string, ConditionCombineLogic> (string.Format("({0})", condition), ConditionCombineLogic.And));
            }

            pars = p.ToArray();
            return(sBuilder.ToString());
        }