/* * DBeaver - Universal Database Manager * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jkiss.dbeaver.model.impl.sql.edit.struct; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.model.DBPEvaluationContext; import org.jkiss.dbeaver.model.messages.ModelMessages; import org.jkiss.dbeaver.model.edit.DBEPersistAction; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistAction; import org.jkiss.dbeaver.model.impl.jdbc.struct.JDBCTable; import org.jkiss.dbeaver.model.impl.jdbc.struct.JDBCTableIndex; import org.jkiss.dbeaver.model.impl.sql.edit.SQLObjectEditor; import org.jkiss.dbeaver.model.struct.DBSObjectContainer; import org.jkiss.dbeaver.model.struct.rdb.DBSTableIndexColumn; import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; import org.jkiss.utils.CommonUtils; import java.util.List; /** * JDBC constraint manager */ public abstract class SQLIndexManager<OBJECT_TYPE extends JDBCTableIndex<? extends DBSObjectContainer, TABLE_TYPE>, TABLE_TYPE extends JDBCTable> extends SQLObjectEditor<OBJECT_TYPE, TABLE_TYPE> { @Override public long getMakerOptions() { return FEATURE_EDITOR_ON_CREATE; } @Override protected void addObjectCreateActions(List<DBEPersistAction> actions, ObjectCreateCommand command) { final TABLE_TYPE table = command.getObject().getTable(); final OBJECT_TYPE index = command.getObject(); // Create index final String indexName = DBUtils.getQuotedIdentifier(index.getDataSource(), index.getName()); index.setName(indexName); StringBuilder decl = new StringBuilder(40); decl.append("CREATE"); appendIndexModifiers(index, decl); decl.append(" INDEX ").append(indexName); //$NON-NLS-1$ appendIndexType(index, decl); decl.append(" ON ").append(table.getFullyQualifiedName(DBPEvaluationContext.DDL)) //$NON-NLS-1$ .append(" ("); //$NON-NLS-1$ try { // Get columns using void monitor boolean firstColumn = true; for (DBSTableIndexColumn indexColumn : CommonUtils.safeCollection(command.getObject().getAttributeReferences(new VoidProgressMonitor()))) { if (!firstColumn) decl.append(","); //$NON-NLS-1$ firstColumn = false; decl.append(indexColumn.getName()); appendIndexColumnModifiers(decl, indexColumn); } } catch (DBException e) { log.error(e); } decl.append(")"); //$NON-NLS-1$ actions.add( new SQLDatabasePersistAction(ModelMessages.model_jdbc_create_new_index, decl.toString()) ); } protected void appendIndexType(OBJECT_TYPE index, StringBuilder decl) { } protected void appendIndexModifiers(OBJECT_TYPE index, StringBuilder decl) { if (index.isUnique()) { decl.append(" UNIQUE"); } } protected void appendIndexColumnModifiers(StringBuilder decl, DBSTableIndexColumn indexColumn) { if (!indexColumn.isAscending()) { decl.append(" DESC"); //$NON-NLS-1$ } } @Override protected void addObjectDeleteActions(List<DBEPersistAction> actions, ObjectDeleteCommand command) { actions.add( new SQLDatabasePersistAction( ModelMessages.model_jdbc_drop_index, getDropIndexPattern(command.getObject()) .replace(PATTERN_ITEM_TABLE, command.getObject().getTable().getFullyQualifiedName(DBPEvaluationContext.DDL)) .replace(PATTERN_ITEM_INDEX, command.getObject().getFullyQualifiedName(DBPEvaluationContext.DDL)) .replace(PATTERN_ITEM_INDEX_SHORT, command.getObject().getName())) ); } protected String getDropIndexPattern(OBJECT_TYPE index) { return "DROP INDEX " + PATTERN_ITEM_INDEX; //$NON-NLS-1$ } }