/// <summary>
        /// Generate the SQL DELETE that deletes all rows
        /// </summary>
        /// <returns></returns>
        protected override SqlString GenerateDeleteString()
        {
            SqlDeleteBuilder delete = new SqlDeleteBuilder(factory)
                                      .SetTableName(qualifiedTableName)
                                      .SetIdentityColumn(KeyColumnNames, KeyType);

            if (HasWhere)
            {
                delete.AddWhereFragment(sqlWhereString);
            }
            return(delete.ToSqlString());
        }
        // Generate all the SQL


        /// <summary>
        /// Generate the SQL that deletes a row by id (and version)
        /// </summary>
        /// <returns>A SqlString for a Delete</returns>
        protected virtual SqlString GenerateDeleteString()
        {
            SqlDeleteBuilder deleteBuilder = new SqlDeleteBuilder(factory);

            deleteBuilder.SetTableName(TableName)
            .SetIdentityColumn(IdentifierColumnNames, IdentifierType);

            if (IsVersioned)
            {
                deleteBuilder.SetVersionColumn(new string[] { VersionColumnName }, VersionType);
            }

            return(deleteBuilder.ToSqlString());
        }
        /// <summary>
        /// Generate the SQL DELETE that deletes a particular row
        /// </summary>
        /// <returns></returns>
        protected override SqlString GenerateDeleteRowString()
        {
            SqlDeleteBuilder delete = new SqlDeleteBuilder(factory);

            delete.SetTableName(qualifiedTableName);
            if (hasIdentifier)
            {
                delete.AddWhereFragment(rowSelectColumnNames, rowSelectType, " = ");
            }
            else
            {
                delete.AddWhereFragment(KeyColumnNames, KeyType, " = ")
                .AddWhereFragment(rowSelectColumnNames, rowSelectType, " = ");
            }

            return(delete.ToSqlString());
        }
Exemple #4
0
        public MultiTableDeleteExecutor(IStatement statement)
            : base(statement, log)
        {
            if (!Factory.Dialect.SupportsTemporaryTables)
            {
                throw new HibernateException("cannot perform multi-table deletes using dialect not supporting temp tables");
            }

            var deleteStatement = (DeleteStatement)statement;

            FromElement fromElement     = deleteStatement.FromClause.GetFromElement();
            string      bulkTargetAlias = fromElement.TableAlias;

            persister = fromElement.Queryable;

            idInsertSelect = GenerateIdInsertSelect(persister, bulkTargetAlias, deleteStatement.WhereClause);
            log.Debug("Generated ID-INSERT-SELECT SQL (multi-table delete) : {0}", idInsertSelect);

            string[]   tableNames  = persister.ConstraintOrderedTableNameClosure;
            string[][] columnNames = persister.ConstraintOrderedTableKeyColumnClosure;
            string     idSubselect = GenerateIdSubselect(persister);

            deletes = new SqlString[tableNames.Length];
            for (int i = tableNames.Length - 1; i >= 0; i--)
            {
                // TODO : an optimization here would be to consider cascade deletes and not gen those delete statements;
                //      the difficulty is the ordering of the tables here vs the cascade attributes on the persisters ->
                //          the table info gotten here should really be self-contained (i.e., a class representation
                //          defining all the needed attributes), then we could then get an array of those
                SqlDeleteBuilder delete = new SqlDeleteBuilder(Factory.Dialect, Factory)
                                          .SetTableName(tableNames[i])
                                          .SetWhere("(" + string.Join(", ", columnNames[i]) + ") IN (" + idSubselect + ")");
                if (Factory.Settings.IsCommentsEnabled)
                {
                    delete.SetComment("bulk delete");
                }

                deletes[i] = delete.ToSqlString();
            }
        }