Example #1
0
        // Extensions

        /// <summary>
        /// Adds filters to the specified database query considering the specified filter query string.
        /// </summary>
        /// <param name="dbQuery">The database query to consider.</param>
        /// <param name="filterQuery">The filter query string to consider.</param>
        /// <param name="definition">The clause statement to consider.</param>
        /// <param name="log">The log to consider.</param>
        /// <returns>The built query.</returns>
        public static IDbSingleQuery Filter(
            this IDbSingleQuery dbQuery,
            string filterQuery,
            DbApiFilterDefinition definition = null,
            IBdoLog log = null)
        {
            if (dbQuery != null && !string.IsNullOrEmpty(filterQuery))
            {
                string scriptText = filterQuery.ConvertToExtensionScript(log, definition);

                if (scriptText?.Length > 0)
                {
                    if (dbQuery.WhereClause?.Expression != null && !string.IsNullOrEmpty(dbQuery.WhereClause?.Expression?.Text))
                    {
                        dbQuery.WhereClause.Expression.Text = "$sqlAnd(" + dbQuery.WhereClause.Expression.Text + "," + scriptText + ")";
                    }
                    else
                    {
                        if (dbQuery.WhereClause == null)
                        {
                            dbQuery.WhereClause = new DbQueryWhereClause();
                        }

                        dbQuery.WhereClause.Expression = scriptText.CreateExpAsScript();
                    }
                }
            }

            return(dbQuery);
        }
        // GroupBy -------------------------------------

        private string GetSqlText_GroupByClause(
            IDbQueryGroupByClause clause,
            IDbSingleQuery query                 = null,
            IDataElementSet parameterSet         = null,
            IScriptVariableSet scriptVariableSet = null,
            IBdoLog log = null)
        {
            string queryString = "";

            if (clause != null)
            {
                if (clause?.Expression != null)
                {
                    string expression = Scope?.Interpreter.Evaluate(clause.Expression, scriptVariableSet, log)?.ToString() ?? "";
                    queryString += expression;
                }
                else if (clause.Fields?.Count > 0)
                {
                    foreach (DbField field in clause.Fields)
                    {
                        if (!string.IsNullOrEmpty(queryString))
                        {
                            queryString += ", ";
                        }
                        queryString += GetSqlText_Field(
                            field, query, parameterSet, DbQueryFieldMode.CompleteNameOrValueAsAlias,
                            query.DataModule, query.Schema, query.DataTable,
                            scriptVariableSet: scriptVariableSet, log: log);
                    }
                }
                queryString = queryString.If(!string.IsNullOrEmpty(queryString), " group by " + queryString);
            }

            return(queryString);
        }
Example #3
0
 /// <summary>
 /// Builds the following query: Get the server instances.
 /// </summary>
 /// <param name="query">The database query to consider.</param>
 /// <param name="pageSize">The page size to consider.</param>
 /// <param name="pageToken">The page token text to consider.</param>
 /// <param name="log">The log to consider.</param>
 /// <param name="clauseStatement">The clause statement to consider.</param>
 /// <returns>The built query.</returns>
 public static IDbSingleQuery Paginate(
     this IDbSingleQuery query,
     int?pageSize,
     string pageToken,
     IBdoLog log = null,
     DbApiSortDefinition clauseStatement = null)
 {
     return(query);
 }
        // OrderBy -------------------------------------

        private string GetSqlText_OrderByClause(
            IDbQueryOrderByClause clause,
            IDbSingleQuery query                 = null,
            IDataElementSet parameterSet         = null,
            IScriptVariableSet scriptVariableSet = null,
            IBdoLog log = null)
        {
            string queryString = "";

            if (clause != null)
            {
                if (clause?.Expression != null)
                {
                    string expression = Scope?.Interpreter.Evaluate(clause.Expression, scriptVariableSet, log)?.ToString() ?? "";
                    queryString += expression;
                }
                else if (clause.Statements?.Count > 0)
                {
                    foreach (var statement in clause.Statements)
                    {
                        if (!string.IsNullOrEmpty(queryString))
                        {
                            queryString += ", ";
                        }
                        if (statement.Sorting == DataSortingModes.Random)
                        {
                            queryString += "newid()";
                        }
                        else
                        {
                            queryString += GetSqlText_Field(
                                statement.Field, query,
                                parameterSet,
                                DbQueryFieldMode.OnlyName,
                                scriptVariableSet: scriptVariableSet, log: log);

                            switch (statement.Sorting)
                            {
                            case DataSortingModes.Ascending:
                                queryString += " asc";
                                break;

                            case DataSortingModes.Descending:
                                queryString += " desc";
                                break;
                            }
                        }
                    }
                }
                queryString = queryString.If(!string.IsNullOrEmpty(queryString), " order by " + queryString);
            }

            return(queryString);
        }
Example #5
0
        // Union -------------------------------------

        /// <summary>
        ///
        /// </summary>
        /// <param name="unionClause">The union clause to consider.</param>
        public IDbSingleQuery Union(DbQueryUnionKind kind, IDbSingleQuery query)
        {
            if (UnionClauses == null)
            {
                UnionClauses = new List <DbQueryUnionClause>();
            }
            UnionClauses.Add(new DbQueryUnionClause()
            {
                Kind = kind, Query = query
            });

            return(this);
        }
Example #6
0
        /// <summary>
        /// Sorts the specified query considering the specified query script.
        /// </summary>
        /// <param name="query">The database query to consider.</param>
        /// <param name="sortQuery">The sort query text to consider.</param>
        /// <param name="definition">The definition to consider.</param>
        /// <param name="log">The log to consider.</param>
        /// <returns>The built query.</returns>
        public static IDbSingleQuery Sort(
            this IDbSingleQuery query,
            string sortQuery,
            DbApiSortDefinition definition = null,
            IBdoLog log = null)
        {
            if (query != null && !string.IsNullOrEmpty(sortQuery))
            {
                query.OrderByClause = new DbQueryOrderByClause();

                foreach (string fieldItem in sortQuery.Split(','))
                {
                    var statement       = new DbQueryOrderByStatement();
                    var fieldItemParams = fieldItem?.Trim().Split(' ');
                    if (fieldItemParams.Length > 0)
                    {
                        string fieldName = fieldItemParams[0]?.Trim();
                        if (!definition.ContainsKey(fieldName))
                        {
                            log?.AddError("Undefined field '" + fieldName + "' in order statement", resultCode: "user");
                        }
                        else
                        {
                            statement.Field   = definition?[fieldName]?.Field ?? DbFluent.Field(fieldName);
                            statement.Sorting = DataSortingModes.Ascending;

                            if (fieldItemParams.Length > 1)
                            {
                                string direction = fieldItemParams[1]?.Trim();
                                if (string.Equals(direction, "desc"))
                                {
                                    statement.Sorting = DataSortingModes.Descending;
                                    query.OrderByClause.Statements.Add(statement);
                                }
                                else if (!string.Equals(direction, "asc"))
                                {
                                    log?.AddError("Invalid order direction '" + direction + "'", resultCode: "user");
                                }
                                else
                                {
                                    query.OrderByClause.Statements.Add(statement);
                                }
                            }
                        }
                    }
                }
            }

            return(query);
        }
        // Union -------------------------------------

        private string GetSqlText_UnionClause(
            IDbQueryUnionClause clause,
            IDbSingleQuery query                 = null,
            IDataElementSet parameterSet         = null,
            IScriptVariableSet scriptVariableSet = null,
            IBdoLog log = null)
        {
            string queryString = "";

            if (query != null && clause != null)
            {
                string subQuery = BuildQuery(clause.Query, DbQueryParameterMode.Scripted, parameterSet, scriptVariableSet, log);
                UpdateParameterSet(query.ParameterSet, clause.Query);
                queryString += "(" + subQuery + ")";
                queryString  = queryString.If(!string.IsNullOrEmpty(queryString), "union " + queryString);
            }

            return(queryString);
        }
        // Having -------------------------------------

        private string GetSqlText_HavingClause(
            IDbQueryHavingClause clause,
            IDbSingleQuery query                 = null,
            IDataElementSet parameterSet         = null,
            IScriptVariableSet scriptVariableSet = null,
            IBdoLog log = null)
        {
            string queryString = "";

            if (clause != null)
            {
                if (clause?.Expression != null)
                {
                    string expression = Scope?.Interpreter.Evaluate(clause.Expression, scriptVariableSet, log)?.ToString() ?? "";
                    queryString += expression;
                }


                queryString = queryString.If(!string.IsNullOrEmpty(queryString), " having " + queryString);
            }

            return(queryString);
        }
        // Where -------------------------------------

        private string GetSqlText_WhereClause(
            IDbQueryWhereClause clause,
            IDbSingleQuery query                 = null,
            IDataElementSet parameterSet         = null,
            IScriptVariableSet scriptVariableSet = null,
            IBdoLog log = null)
        {
            string queryString = "";

            if (clause != null)
            {
                if (clause?.Expression != null)
                {
                    string expression = Scope?.Interpreter.Evaluate(clause.Expression, scriptVariableSet, log)?.ToString() ?? "";
                    queryString += expression;
                }
                if (clause.IdFields?.Count > 0)
                {
                    queryString = queryString.If(!string.IsNullOrEmpty(queryString), " (" + queryString + ") ");

                    foreach (DbField field in clause.IdFields)
                    {
                        if (!string.IsNullOrEmpty(queryString))
                        {
                            queryString += " and ";
                        }
                        queryString += GetSqlText_Field(
                            field, query, parameterSet, DbQueryFieldMode.NameEqualsValue,
                            scriptVariableSet: scriptVariableSet, log: log);
                    }
                }
                queryString = queryString.If(!string.IsNullOrEmpty(queryString), " where " + queryString);
            }

            return(queryString);
        }
        // Builds single query ----------------------

        /// <summary>
        /// Builds the SQL text of the specified basic query.
        /// </summary>
        /// <param name="query">The query to consider.</param>
        /// <param name="parameterSet">The parameter set to consider.</param>
        /// <param name="scriptVariableSet">The script variable set to consider.</param>
        /// <param name="log">The log to consider.</param>
        /// <returns>Returns the built query text.</returns>
        protected abstract string GetSqlText_Query(
            IDbSingleQuery query,
            IDataElementSet parameterSet         = null,
            IScriptVariableSet scriptVariableSet = null,
            IBdoLog log = null);
Example #11
0
        /// <summary>
        /// Builds the specified simple database data query and put the result
        /// into the specified string MS Sql Server query.
        /// <remarks>We assume the query already exits.</remarks>
        /// </summary>
        /// <param name="query">The query to consider.</param>
        /// <param name="parameterSet">The parameter set to consider.</param>
        /// <param name="scriptVariableSet">The script variable set to consider.</param>
        /// <param name="log">The log to consider.</param>
        /// <returns>Returns the built query text.</returns>
        protected override string GetSqlText_Query(
            IDbSingleQuery query,
            IDataElementSet parameterSet         = null,
            IScriptVariableSet scriptVariableSet = null,
            IBdoLog log = null)
        {
            var queryString = "";

            if (query == null)
            {
                return(null);
            }

            if (query.CTETables?.Count > 0)
            {
                queryString += "with ";
                if (query?.IsCTERecursive == true)
                {
                    queryString += "recursive ";
                }
                queryString += string.Join(", ", query.CTETables.Select(table => GetSqlText_Table(
                                                                            table, query, parameterSet, DbQueryTableMode.AliasAsCompleteName,
                                                                            query.DataModule, query.Schema,
                                                                            scriptVariableSet: scriptVariableSet, log: log)))
                               .ConcatenateIfFirstNotEmpty(" ");
            }

            // we build the query
            switch (query.Kind)
            {
            // Select
            case DbQueryKind.Select:
            {
                queryString += "select ";
                if (query.IsDistinct)
                {
                    queryString += "distinct ";
                }

                if (query.Fields?.Count > 0)
                {
                    queryString += string.Join(", ", query.Fields.Select(field => GetSqlText_Field(
                                                                             field, query, parameterSet, DbQueryFieldMode.CompleteNameOrValueAsAlias,
                                                                             query.DataModule, query.Schema,
                                                                             scriptVariableSet: scriptVariableSet, log: log)))
                                   .ConcatenateIfFirstNotEmpty(" ");
                }
                else
                {
                    queryString += "* ";
                }

                queryString += GetSqlText_FromClause(query.FromClause, query, DbQueryFromClauseKind.FromPreffix, parameterSet, scriptVariableSet, log)
                               .ConcatenateIfFirstNotEmpty(" ");

                queryString += GetSqlText_WhereClause(query.WhereClause, query, parameterSet, scriptVariableSet, log)
                               .ConcatenateIfFirstNotEmpty(" ");

                queryString += GetSqlText_GroupByClause(query.GroupByClause, query, parameterSet, scriptVariableSet, log)
                               .ConcatenateIfFirstNotEmpty(" ");

                queryString += GetSqlText_HavingClause(query.HavingClause, query, parameterSet, scriptVariableSet, log)
                               .ConcatenateIfFirstNotEmpty(" ");

                queryString += GetSqlText_OrderByClause(query.OrderByClause, query, parameterSet, scriptVariableSet, log)
                               .ConcatenateIfFirstNotEmpty(" ");

                if (query.Limit > -1)
                {
                    queryString += "limit " + query.Limit.ToString();
                }

                if (query.UnionClauses?.Count > 0)
                {
                    foreach (var clause in query.UnionClauses)
                    {
                        queryString += GetSqlText_UnionClause(clause, query, parameterSet, scriptVariableSet, log);
                    }
                }
            }
            break;

            // Update
            case DbQueryKind.Update:
            {
                queryString += "update ";
                queryString += GetSqlText_Table(
                    query.DataModule, query.Schema, query.DataTable, query.DataTableAlias,
                    DbQueryTableMode.CompleteNameAsAlias, query.DataModule, query.Schema,
                    scriptVariableSet: scriptVariableSet, log: log)
                               .ConcatenateIfFirstNotEmpty(" ");

                queryString += "set ";

                queryString += string.Join(", ", query.Fields.Select(field =>
                                                                     GetSqlText_Field(
                                                                         field, query, parameterSet, DbQueryFieldMode.NameEqualsValue,
                                                                         scriptVariableSet: scriptVariableSet, log: log)))
                               .ConcatenateIfFirstNotEmpty(" ");

                queryString += GetSqlText_FromClause(query.FromClause, query, DbQueryFromClauseKind.FromPreffix, parameterSet, scriptVariableSet, log)
                               .ConcatenateIfFirstNotEmpty(" ");

                queryString += GetSqlText_WhereClause(query.WhereClause, query, parameterSet, scriptVariableSet, log)
                               .ConcatenateIfFirstNotEmpty(" ");

                if (query.ReturnedIdFields?.Count > 0)
                {
                    queryString += "returning ";
                    queryString += string.Join(", ", query.ReturnedIdFields.Select(field =>
                                                                                   GetSqlText_Field(
                                                                                       field, query, parameterSet, DbQueryFieldMode.CompleteNameOrValueAsAlias,
                                                                                       query.DataModule, query.Schema, query.DataTable,
                                                                                       scriptVariableSet: scriptVariableSet, log: log)));
                }
            }
            break;

            // Delete
            case DbQueryKind.Delete:
            {
                queryString += "delete ";

                queryString += GetSqlText_FromClause(query.FromClause, query, DbQueryFromClauseKind.FromPreffix, parameterSet, scriptVariableSet, log)
                               .ConcatenateIfFirstNotEmpty(" ");

                queryString += GetSqlText_WhereClause(query.WhereClause, query, parameterSet, scriptVariableSet, log)
                               .ConcatenateIfFirstNotEmpty(" ");

                if (query.ReturnedIdFields?.Count > 0)
                {
                    queryString += "returning ";
                    queryString += string.Join(", ", query.ReturnedIdFields.Select(field =>
                                                                                   GetSqlText_Field(
                                                                                       field, query, parameterSet, DbQueryFieldMode.CompleteNameOrValueAsAlias,
                                                                                       query.DataModule, query.Schema, query.DataTable,
                                                                                       scriptVariableSet: scriptVariableSet, log: log)));
                }
            }
            break;

            // Insert
            case DbQueryKind.Insert:
            {
                queryString += "insert into ";
                queryString += GetSqlText_Table(
                    query.DataModule, query.Schema, query.DataTable, query.DataTableAlias,
                    DbQueryTableMode.CompleteName, query.DataModule, query.Schema,
                    scriptVariableSet: scriptVariableSet, log: log)
                               .ConcatenateIfFirstNotEmpty(" ");
                queryString += "(";

                queryString += string.Join(", ", query.Fields.Select(field =>
                                                                     GetSqlText_Field(
                                                                         field, query, parameterSet, DbQueryFieldMode.OnlyName,
                                                                         query.DataModule, query.Schema,
                                                                         scriptVariableSet: scriptVariableSet, log: log)));

                queryString += ") ";

                queryString += GetSqlText_FromClause(query.FromClause, query, DbQueryFromClauseKind.NoPreffix, parameterSet, scriptVariableSet, log)
                               .ConcatenateIfFirstNotEmpty(" ");

                if (query.ReturnedIdFields?.Count > 0)
                {
                    queryString += "returning ";
                    queryString += string.Join(", ", query.ReturnedIdFields.Select(field =>
                                                                                   GetSqlText_Field(
                                                                                       field, query, parameterSet, DbQueryFieldMode.CompleteNameOrValueAsAlias,
                                                                                       query.DataModule, query.Schema, query.DataTable,
                                                                                       scriptVariableSet: scriptVariableSet, log: log)));
                }
            }
            break;
            }

            return(queryString);
        }
        // From -------------------------------------

        private string GetSqlText_FromClause(
            IDbQueryFromClause clause,
            IDbSingleQuery query                 = null,
            IDataElementSet parameterSet         = null,
            IScriptVariableSet scriptVariableSet = null,
            IBdoLog log = null)
        {
            string queryString = "";

            if (clause == null)
            {
                // we add the query's default table

                queryString += GetSqlText_Table(
                    query.DataModule, query.Schema, query.DataTable, query.DataTableAlias,
                    query, parameterSet, DbQueryFieldMode.CompleteName,
                    query.DataModule, query.Schema,
                    scriptVariableSet: scriptVariableSet, log: log);
            }
            else
            {
                if (clause?.Expression != null)
                {
                    string expression = Scope?.Interpreter.Evaluate(clause.Expression, scriptVariableSet, log)?.ToString() ?? "";
                    queryString += expression;
                }
                else if (!(clause?.Statements?.Count > 0))
                {
                    queryString += GetSqlText_Table(
                        query.DataModule, query.Schema, query.DataTable, query.DataTableAlias,
                        query, parameterSet, DbQueryFieldMode.CompleteNameOrValueAsAlias,
                        query.DataModule, query.Schema,
                        scriptVariableSet: scriptVariableSet, log: log);
                }
                else
                {
                    foreach (var statement in clause.Statements)
                    {
                        // if the first table is not a joined one then we add first the query's default table

                        if (statement.Tables == null || statement.Tables.Count == 0 || statement.Tables[0] is DbJoinedTable)
                        {
                            queryString += GetSqlText_Table(
                                query.DataModule, query.Schema, query.DataTable, query.DataTableAlias,
                                query, parameterSet, DbQueryFieldMode.CompleteNameOrValueAsAlias,
                                query.DataModule, query.Schema,
                                scriptVariableSet: scriptVariableSet, log: log);
                        }
                        else if (statement.Tables?.Count > 0)
                        {
                            if (query?.Kind == DbQueryKind.Delete)
                            {
                                foreach (var table in statement.Tables)
                                {
                                    queryString += GetSqlText_Table(
                                        table,
                                        query, parameterSet, DbQueryFieldMode.CompleteNameOrValueAsAlias,
                                        query.DataModule, query.Schema,
                                        scriptVariableSet: scriptVariableSet, log: log);
                                }
                            }
                            else
                            {
                                foreach (var table in statement.Tables)
                                {
                                    queryString += GetSqlText_Table(
                                        table,
                                        query, parameterSet, DbQueryFieldMode.CompleteNameOrValueAsAlias,
                                        query.DataModule, query.Schema,
                                        scriptVariableSet: scriptVariableSet, log: log);
                                }
                            }
                        }
                    }
                }
            }
            queryString = queryString.If(!string.IsNullOrEmpty(queryString), " from " + queryString);

            return(queryString);
        }
        // From -------------------------------------

        private string GetSqlText_FromClause(
            IDbQueryFromClause clause,
            IDbSingleQuery query                 = null,
            DbQueryFromClauseKind kind           = DbQueryFromClauseKind.FromPreffix,
            IDataElementSet parameterSet         = null,
            IScriptVariableSet scriptVariableSet = null,
            IBdoLog log = null)
        {
            string queryString = "";

            if (query != null)
            {
                if (query.Kind == DbQueryKind.Insert)
                {
                    if ((clause?.Statements?.Count == 1 &&
                         clause?.Statements[0]?.Tables.Any(p => p is DbDerivedTable) != true) ||
                        (query.WhereClause != null))
                    {
                        var subQuery = DbFluent.SelectQuery(null)
                                       .WithFields(query.Fields?.ToArray());
                        subQuery.FromClause  = query.FromClause;
                        subQuery.WhereClause = query.WhereClause;

                        clause = new DbQueryFromClause
                        {
                            Statements = new List <DbQueryFromStatement>()
                        };
                        clause.Statements.Add(new DbQueryFromStatement()
                        {
                            Tables = new List <DbTable>()
                            {
                                DbFluent.TableAsQuery(subQuery)
                            }
                        });
                    }
                }

                if (clause == null)
                {
                    if (query.Kind == DbQueryKind.Insert)
                    {
                        var table = DbFluent.TableAsTuples(
                            DbFluent.Tuple(query.Fields?.ToArray()));
                        queryString += GetSqlText_Table(
                            table, query, parameterSet,
                            DbQueryTableMode.CompleteName,
                            query.DataModule, query.Schema,
                            scriptVariableSet: scriptVariableSet, log: log);
                    }
                    else if (query.Kind != DbQueryKind.Update)
                    {
                        queryString += GetSqlText_Table(
                            query.DataModule, query.Schema, query.DataTable, query.DataTableAlias,
                            DbQueryTableMode.CompleteName,
                            query.DataModule, query.Schema,
                            scriptVariableSet: scriptVariableSet, log: log);
                    }
                }
                else
                {
                    if (clause?.Expression != null)
                    {
                        string expression = Scope?.Interpreter.Evaluate(clause.Expression, scriptVariableSet, log)?.ToString() ?? "";
                        queryString += expression;
                    }
                    else if (!(clause?.Statements?.Count > 0))
                    {
                        queryString += GetSqlText_Table(
                            query.DataModule, query.Schema, query.DataTable, query.DataTableAlias,
                            DbQueryTableMode.CompleteNameAsAlias,
                            query.DataModule, query.Schema,
                            scriptVariableSet: scriptVariableSet, log: log);
                    }
                    else
                    {
                        foreach (var statement in clause.Statements)
                        {
                            // if the first table is not a joined one then we add first the query's default table

                            if (statement.Tables == null || statement.Tables.Count == 0 || statement.Tables[0] is DbJoinedTable)
                            {
                                queryString += GetSqlText_Table(
                                    query.DataModule, query.Schema, query.DataTable, query.DataTableAlias,
                                    DbQueryTableMode.CompleteNameAsAlias,
                                    query.DataModule, query.Schema,
                                    scriptVariableSet: scriptVariableSet, log: log);
                            }
                            if (statement.Tables?.Count > 0)
                            {
                                var existingTbale = false;

                                foreach (var table in statement.Tables)
                                {
                                    if (query?.Kind == DbQueryKind.Delete && table is DbJoinedTable joinedTable)
                                    {
                                        queryString += !existingTbale ? " using " : ", ";

                                        queryString += GetSqlText_Table(
                                            joinedTable.Table,
                                            query, parameterSet, DbQueryTableMode.CompleteNameAsAlias,
                                            scriptVariableSet: scriptVariableSet, log: log);
                                        existingTbale = true;

                                        // we update the where clause to add relationships

                                        if (query?.WhereClause == null)
                                        {
                                            query.WhereClause = new DbQueryWhereClause();
                                        }
                                        if (query.WhereClause.Expression == null)
                                        {
                                            query.WhereClause.Expression = joinedTable.Condition;
                                        }
                                        else
                                        {
                                            query.WhereClause.Expression = DbFluent.And(query.WhereClause.Expression, joinedTable.Condition);
                                        }
                                    }
                                    else
                                    {
                                        queryString += GetSqlText_Table(
                                            table,
                                            query, parameterSet, DbQueryTableMode.CompleteNameAsAlias,
                                            query.DataModule, query.Schema,
                                            scriptVariableSet: scriptVariableSet, log: log);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            queryString = queryString.If(!string.IsNullOrEmpty(queryString),
                                         (kind == DbQueryFromClauseKind.FromPreffix ? "from " : "") + queryString);

            return(queryString);
        }
        /// <summary>
        /// Builds the specified simple database data query and put the result
        /// into the specified string MS Sql Server query.
        /// <remarks>We assume the query already exits.</remarks>
        /// </summary>
        /// <param name="query">The query to consider.</param>
        /// <param name="parameterSet">The parameter set to consider.</param>
        /// <param name="scriptVariableSet">The script variable set to consider.</param>
        /// <param name="log">The log to consider.</param>
        /// <returns>Returns the built query text.</returns>
        protected override string GetSqlText_Query(
            IDbSingleQuery query,
            IDataElementSet parameterSet         = null,
            IScriptVariableSet scriptVariableSet = null,
            IBdoLog log = null)
        {
            var queryString = "";
            int index;

            // we build the query
            switch (query.Kind)
            {
            // Select
            case DbQueryKind.Select:
            {
                queryString = "select ";
                if (query.IsDistinct)
                {
                    queryString += " distinct ";
                }
                index = 0;
                if (query.Fields?.Count > 0)
                {
                    foreach (DbField field in query.Fields)
                    {
                        if (index > 0)
                        {
                            queryString += ",";
                        }

                        queryString += GetSqlText_Field(
                            field, query, parameterSet, DbQueryFieldMode.CompleteNameOrValueAsAlias,
                            query.DataModule, query.Schema,
                            scriptVariableSet: scriptVariableSet, log: log);

                        index++;
                    }
                }
                else
                {
                    queryString += " * ";
                }

                queryString += GetSqlText_FromClause(query.FromClause, query, parameterSet, scriptVariableSet, log);

                queryString += GetSqlText_WhereClause(query.WhereClause, query, parameterSet, scriptVariableSet, log);

                queryString += GetSqlText_GroupByClause(query.GroupByClause, query, parameterSet, scriptVariableSet, log);

                queryString += GetSqlText_HavingClause(query.HavingClause, query, parameterSet, scriptVariableSet, log);

                queryString += GetSqlText_OrderByClause(query.OrderByClause, query, parameterSet, scriptVariableSet, log);

                if (query.Limit > -1)
                {
                    queryString += " limit " + query.Limit.ToString() + " ";
                }
            }
            break;

            // Update
            case DbQueryKind.Update:
            {
                queryString  = "update ";
                queryString += GetSqlText_Table(
                    query.DataModule, query.Schema, query.DataTable, query.DataTableAlias,
                    query, parameterSet, DbQueryFieldMode.CompleteNameOrValueAsAlias, query.DataModule, query.Schema,
                    scriptVariableSet: scriptVariableSet, log: log);
                queryString += " set ";
                index        = 0;
                foreach (DbField field in query.Fields)
                {
                    if (index > 0)
                    {
                        queryString += ",";
                    }

                    queryString += GetSqlText_Field(
                        field, query, parameterSet, DbQueryFieldMode.NameEqualsValue,
                        scriptVariableSet: scriptVariableSet, log: log);

                    index++;
                }

                if (query.FromClause != null)
                {
                    queryString += GetSqlText_FromClause(query.FromClause, query, parameterSet, scriptVariableSet, log);
                }

                queryString += GetSqlText_WhereClause(query.WhereClause, query, parameterSet, scriptVariableSet, log);

                if (query.ReturnedIdFields?.Count > 0)
                {
                    queryString += " returning ";
                    index        = 0;
                    foreach (DbField field in query.ReturnedIdFields)
                    {
                        if (index > 0)
                        {
                            queryString += ", ";
                        }
                        queryString += GetSqlText_Field(
                            field, query, parameterSet, DbQueryFieldMode.CompleteNameOrValueAsAlias,
                            query.DataModule, query.Schema, query.DataTable,
                            scriptVariableSet: scriptVariableSet, log: log);

                        index++;
                    }
                }
            }
            break;

            // Delete
            case DbQueryKind.Delete:
            {
                queryString = "delete";

                queryString += GetSqlText_FromClause(query.FromClause, query, parameterSet, scriptVariableSet, log);

                queryString += GetSqlText_WhereClause(query.WhereClause, query, parameterSet, scriptVariableSet, log);

                if (query.ReturnedIdFields?.Count > 0)
                {
                    queryString += " returning ";
                    index        = 0;
                    foreach (DbField field in query.ReturnedIdFields)
                    {
                        if (index > 0)
                        {
                            queryString += ", ";
                        }
                        queryString += GetSqlText_Field(
                            field, query, parameterSet, DbQueryFieldMode.CompleteNameOrValueAsAlias,
                            query.DataModule, query.Schema, query.DataTable,
                            scriptVariableSet: scriptVariableSet, log: log);

                        index++;
                    }
                }
            }
            break;

            // Insert
            case DbQueryKind.Insert:
            {
                queryString  = "insert into ";
                queryString += GetSqlText_Table(
                    query.DataModule, query.Schema, query.DataTable, query.DataTableAlias,
                    query, parameterSet, DbQueryFieldMode.CompleteName, query.DataModule, query.Schema,
                    scriptVariableSet: scriptVariableSet, log: log);
                queryString += " (";
                index        = 0;
                foreach (DbField field in query.Fields)
                {
                    if (index > 0)
                    {
                        queryString += ",";
                    }

                    queryString += GetSqlText_Field(
                        field, query, parameterSet, DbQueryFieldMode.OnlyName,
                        query.DataModule, query.Schema,
                        scriptVariableSet: scriptVariableSet, log: log);

                    index++;
                }
                queryString += ") values (";
                if (query.Fields?.Count > 0)
                {
                    index = 0;
                    foreach (DbField field in query.Fields)
                    {
                        if (index > 0)
                        {
                            queryString += ",";
                        }

                        queryString += GetSqlText_Field(
                            field, query, parameterSet, DbQueryFieldMode.OnlyValue,
                            query.DataModule, query.Schema,
                            scriptVariableSet: scriptVariableSet, log: log);

                        index++;
                    }
                }
                queryString += ")";
                if (query.ReturnedIdFields?.Count > 0)
                {
                    queryString += " returning ";
                    index        = 0;
                    foreach (DbField field in query.ReturnedIdFields)
                    {
                        if (index > 0)
                        {
                            queryString += ", ";
                        }
                        queryString += GetSqlText_Field(
                            field, query, parameterSet, DbQueryFieldMode.CompleteNameOrValueAsAlias,
                            query.DataModule, query.Schema, query.DataTable,
                            scriptVariableSet: scriptVariableSet, log: log);

                        index++;
                    }
                }
            }
            break;
            }

            return(queryString);
        }