Exemple #1
0
 private string GetSqlText_Table(
     string tableDataModule,
     string tableSchema,
     string tableName,
     string tableAlias,
     DbQueryTableMode mode                = DbQueryTableMode.CompleteName,
     string defaultDataModule             = null,
     string defaultSchema                 = null,
     IScriptVariableSet scriptVariableSet = null,
     IBdoLog log = null)
 {
     return(GetSqlText_Table(
                DbFluent.Table(tableName, tableSchema, tableDataModule).WithAlias(tableAlias),
                null, null, mode, defaultDataModule, defaultSchema, scriptVariableSet, log));
 }
Exemple #2
0
        // ------------------------------------------
        // TABLES
        // ------------------------------------------

        #region Tables

        private string GetSqlText_Table(
            DbTable table,
            IDbQuery query = null,
            IDataElementSet parameterSet         = null,
            DbQueryTableMode mode                = DbQueryTableMode.CompleteName,
            string defaultDataModule             = null,
            string defaultSchema                 = null,
            IScriptVariableSet scriptVariableSet = null,
            IBdoLog log = null)
        {
            var queryString = "";

            if (table?.Expression != null)
            {
                string expression = Scope?.Interpreter.Evaluate(table.Expression, scriptVariableSet, log)?.ToString() ?? "";
                queryString += expression;
            }
            else if (mode == DbQueryTableMode.CompleteName && !string.IsNullOrEmpty(table?.Alias))
            {
                queryString += GetSqlText_Table(table.Alias);
            }
            else if (table is DbJoinedTable joinedTable)
            {
                switch (joinedTable.Kind)
                {
                case DbQueryJoinKind.Inner:
                {
                    queryString += " inner join ";
                    break;
                }

                case DbQueryJoinKind.Left:
                {
                    queryString += " left join ";
                    break;
                }

                case DbQueryJoinKind.Right:
                {
                    queryString += " right join ";
                    break;
                }
                }

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

                if (joinedTable.Kind != DbQueryJoinKind.None)
                {
                    queryString += " on ";
                    string expression = Scope?.Interpreter.Evaluate(joinedTable.Condition, scriptVariableSet, log)?.ToString() ?? string.Empty;
                    queryString += expression;
                }
            }
            else
            {
                if (table is DbDerivedTable derivedTable)
                {
                    string subQuery = BuildQuery(derivedTable.Query, DbQueryParameterMode.Scripted, parameterSet, scriptVariableSet, log);
                    UpdateParameterSet(query.ParameterSet, derivedTable.Query);
                    queryString = "(" + subQuery + ")";
                }
                else if (table is DbTupledTable tupledTable)
                {
                    if (tupledTable?.Tuples?.Count > 0)
                    {
                        if (!string.IsNullOrEmpty(queryString))
                        {
                            queryString += ", ";
                        }

                        foreach (var tuple in tupledTable.Tuples)
                        {
                            var tupleString = string.Join(", ", tuple.Fields.Select(field =>
                                                                                    GetSqlText_Field(
                                                                                        field, query, parameterSet, DbQueryFieldMode.OnlyValue,
                                                                                        query.DataModule, query.Schema,
                                                                                        scriptVariableSet: scriptVariableSet, log: log)));

                            queryString += "(" + tupleString + ")";
                        }
                    }
                    queryString = queryString.If(!string.IsNullOrEmpty(queryString),
                                                 "(values " + queryString + ")");
                }
                else if (!string.IsNullOrEmpty(table?.Name))
                {
                    var tableName       = table.Name;
                    var tableSchema     = table.Schema;
                    var tableDataModule = table.DataModule;

                    if (string.IsNullOrEmpty(tableDataModule))
                    {
                        tableDataModule = defaultDataModule;
                    }
                    if (string.IsNullOrEmpty(tableSchema))
                    {
                        tableSchema = defaultSchema;
                    }
                    if (!string.IsNullOrEmpty(tableDataModule))
                    {
                        tableDataModule = GetDatabaseName(tableDataModule);
                    }

                    string script = DbFluent.Table(tableName, tableSchema, tableDataModule);
                    queryString = Scope?.Interpreter.Evaluate(script, DataExpressionKind.Script, scriptVariableSet, log)?.ToString() ?? String.Empty;
                }

                if (!string.IsNullOrEmpty(table.Alias))
                {
                    switch (mode)
                    {
                    case DbQueryTableMode.AliasAsCompleteName:
                    {
                        queryString = GetSqlText_Table(table.Alias) + " as " + queryString;
                        break;
                    }

                    case DbQueryTableMode.CompleteNameAsAlias:
                    {
                        queryString = queryString + " as " + GetSqlText_Table(table.Alias);
                        break;
                    }

                    default:
                        break;
                    }
                }
            }

            return(queryString);
        }