Exemple #1
0
        /// <summary>
        /// Generate the SQL DELETE that deletes a particular row
        /// </summary>
        /// <returns></returns>
        protected override SqlCommandInfo GenerateDeleteRowString()
        {
            SqlDeleteBuilder delete = new SqlDeleteBuilder(Factory.Dialect, Factory);
            delete.SetTableName(qualifiedTableName);
            if (hasIdentifier)
            {
                delete.AddWhereFragment(new string[] { IdentifierColumnName }, IdentifierType, " = ");
            }
            else if (HasIndex && !indexContainsFormula)
            {
                delete
                    .AddWhereFragment(KeyColumnNames, KeyType, " = ")
                    .AddWhereFragment(IndexColumnNames, IndexType, " = ");
            }
            else
            {
                string[] cnames = ArrayHelper.Join(KeyColumnNames, ElementColumnNames, elementColumnIsInPrimaryKey);
                SqlType[] ctypes = ArrayHelper.Join(KeyType.SqlTypes(Factory), ElementType.SqlTypes(Factory), elementColumnIsInPrimaryKey);
                delete.AddWhereFragment(cnames, ctypes, " = ");
            }

            if (Factory.Settings.IsCommentsEnabled)
                delete.SetComment("delete collection row " + Role);

            return delete.ToSqlCommandInfo();
        }
Exemple #2
0
        /// <summary>
        /// Generate the SQL DELETE that deletes all rows
        /// </summary>
        /// <returns></returns>
        protected override SqlCommandInfo GenerateDeleteString()
        {
            SqlDeleteBuilder delete = new SqlDeleteBuilder(Factory.Dialect, Factory)
                .SetTableName(qualifiedTableName)
                .SetIdentityColumn(KeyColumnNames, KeyType);
            if (HasWhere)
                delete.AddWhereFragment(sqlWhereString);

            if (Factory.Settings.IsCommentsEnabled)
                delete.SetComment("delete collection " + Role);

            return delete.ToSqlCommandInfo();
        }
        /// <inheritdoc />
        protected override SqlCommandInfo GenerateDeleteRowString(bool[] columnNullness)
        {
            var delete = new SqlDeleteBuilder(Factory.Dialect, Factory);

            delete.SetTableName(qualifiedTableName);

            if (hasIdentifier)
            {
                delete.AddWhereFragment(new[] { IdentifierColumnName }, IdentifierType, " = ");
            }
            else
            {
                var useIndex                = HasIndex && !indexContainsFormula;
                var additionalFilterType    = useIndex ? IndexType : ElementType;
                var additionalFilterColumns = useIndex ? IndexColumnNames : ElementColumnNames;
                var includes                = useIndex ? null : Combine(elementColumnIsInPrimaryKey, columnNullness);

                var cnames = includes == null
                                        ? ArrayHelper.Join(KeyColumnNames, additionalFilterColumns)
                                        : ArrayHelper.Join(KeyColumnNames, additionalFilterColumns, includes);

                var ctypes = includes == null
                                        ? ArrayHelper.Join(KeyType.SqlTypes(Factory), additionalFilterType.SqlTypes(Factory))
                                        : ArrayHelper.Join(KeyType.SqlTypes(Factory), additionalFilterType.SqlTypes(Factory), includes);

                delete.AddWhereFragment(cnames, ctypes, " = ");

                if (columnNullness != null)
                {
                    for (var i = 0; i < columnNullness.Length; i++)
                    {
                        if (columnNullness[i])
                        {
                            continue;
                        }
                        delete.AddWhereFragment($"{additionalFilterColumns[i]} is null");
                    }
                }
            }

            if (Factory.Settings.IsCommentsEnabled)
            {
                delete.SetComment("delete collection row " + Role);
            }

            return(delete.ToSqlCommandInfo());
        }
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();
            }
        }