private void ProcessIndexes() { ICodeWriterPlSql sql = Model.Lamp.CodeWritersFactory.CreateCodeWriterPlSql(); foreach (IIndex index in Model.PhysicalModel.Indexes) { if (!index.Processed && index.Generate) { sql.ClearAll(); sql.WriteCreateIndex(index, environment); ISpellHint hint = genie.FindHint(index); if (hint != null) { sql.WriteText(hint.GetText(index)); } creator.WriteFrom(sql); creator.WriteSeparator(); StringBuilder sqlFrom = new StringBuilder(); sqlFrom.Append("SELECT I.OWNER, I.INDEX_NAME, COUNT(*) "); sqlFrom.Append("FROM ALL_INDEXES I "); sqlFrom.Append(" INNER JOIN ALL_IND_COLUMNS IC ON I.OWNER = IC.INDEX_OWNER AND I.INDEX_NAME = IC.INDEX_NAME"); sqlFrom.Append(" LEFT OUTER JOIN ALL_CONSTRAINTS AC ON I.INDEX_NAME = AC.CONSTRAINT_NAME AND I.TABLE_OWNER = AC.OWNER AND I.TABLE_NAME = AC.TABLE_NAME AND AC.CONSTRAINT_TYPE = 'P'"); sqlFrom.Append(" LEFT OUTER JOIN("); for (int i = 0; i < index.Columns.Count; i++) { sqlFrom.AppendFormat("{0}SELECT '{1}' AS COLUMN_NAME FROM DUAL", i == 0 ? "" : " UNION ", index.Columns[i].Attribute.Persistence.Name); } sqlFrom.Append(") IC2 ON IC.COLUMN_NAME = IC2.COLUMN_NAME"); sqlFrom.AppendFormat(" WHERE I.OWNER='{0}' AND I.TABLE_OWNER = '{1}' AND I.TABLE_NAME='{2}' AND AC.CONSTRAINT_NAME IS NULL", index.Schema, index.Entity.Persistence.Schema, index.Entity.Persistence.Name); sqlFrom.Append(" GROUP BY I.OWNER, I.INDEX_NAME"); sqlFrom.AppendFormat(" HAVING COUNT(*) = {0}", index.Columns.Count); sqlFrom.Append(" UNION ALL "); sqlFrom.AppendFormat("SELECT I.OWNER, I.INDEX_NAME, 1 FROM ALL_INDEXES I WHERE I.OWNER='{0}' AND I.INDEX_NAME='{1}'", index.Schema, index.Name); WriteExecImmediatWhenNotExists( String.Format("({0}) T1", sqlFrom.ToString()), "1=1", sql); genie.Config.NotifyAssistants("Create", index, sql.ToString(true)); updater.WriteLine(); } } }