/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
* Copyright (C) 2011-2012 Eugene Fradkin (eugene.fradkin@gmail.com)
*
* 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.ext.mysql.edit;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.ext.mysql.MySQLConstants;
import org.jkiss.dbeaver.ext.mysql.MySQLMessages;
import org.jkiss.dbeaver.ext.mysql.model.*;
import org.jkiss.dbeaver.model.DBPDataKind;
import org.jkiss.dbeaver.model.edit.DBECommandContext;
import org.jkiss.dbeaver.model.impl.DBObjectNameCaseTransformer;
import org.jkiss.dbeaver.model.impl.DBSObjectCache;
import org.jkiss.dbeaver.model.impl.sql.edit.struct.SQLIndexManager;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSEntityAttribute;
import org.jkiss.dbeaver.model.struct.rdb.DBSIndexType;
import org.jkiss.dbeaver.model.struct.rdb.DBSTableIndexColumn;
import org.jkiss.dbeaver.ui.UITask;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.editors.object.struct.EditIndexPage;
import org.jkiss.utils.CommonUtils;
import java.util.Arrays;
import java.util.Collections;
/**
* MySQL index manager
*/
public class MySQLIndexManager extends SQLIndexManager<MySQLTableIndex, MySQLTable> {
@Nullable
@Override
public DBSObjectCache<MySQLCatalog, MySQLTableIndex> getObjectsCache(MySQLTableIndex object)
{
return object.getTable().getContainer().getIndexCache();
}
@Override
protected MySQLTableIndex createDatabaseObject(
DBRProgressMonitor monitor, DBECommandContext context, final MySQLTable parent,
Object from)
{
return new UITask<MySQLTableIndex>() {
@Override
protected MySQLTableIndex runTask() {
MyEditIndexPage editPage = new MyEditIndexPage(parent);
if (!editPage.edit()) {
return null;
}
final MySQLTableIndex index = new MySQLTableIndex(
parent,
!editPage.isUnique(),
null,
editPage.getIndexType(),
null,
false);
StringBuilder idxName = new StringBuilder(64);
idxName.append(CommonUtils.escapeIdentifier(parent.getName()));
int colIndex = 1;
for (DBSEntityAttribute tableColumn : editPage.getSelectedAttributes()) {
if (colIndex == 1) {
idxName.append("_").append(CommonUtils.escapeIdentifier(tableColumn.getName())); //$NON-NLS-1$
}
Integer length = (Integer) editPage.getAttributeProperty(tableColumn, MyEditIndexPage.PROP_LENGTH);
index.addColumn(
new MySQLTableIndexColumn(
index,
(MySQLTableColumn) tableColumn,
colIndex++,
!Boolean.TRUE.equals(editPage.getAttributeProperty(tableColumn, EditIndexPage.PROP_DESC)),
false,
length == null ? null : String.valueOf(length)));
}
idxName.append("_IDX"); //$NON-NLS-1$
index.setName(DBObjectNameCaseTransformer.transformObjectName(index, idxName.toString()));
return index;
}
}.execute();
}
@Override
protected String getDropIndexPattern(MySQLTableIndex index)
{
return "ALTER TABLE " + PATTERN_ITEM_TABLE + " DROP INDEX " + PATTERN_ITEM_INDEX_SHORT; //$NON-NLS-1$ //$NON-NLS-2$
}
protected void appendIndexType(MySQLTableIndex index, StringBuilder decl) {
DBSIndexType indexType = index.getIndexType();
if (indexType != MySQLConstants.INDEX_TYPE_FULLTEXT) {
decl.append(" USING ").append(indexType.getId());
}
}
protected void appendIndexModifiers(MySQLTableIndex index, StringBuilder decl) {
if (index.getIndexType() == MySQLConstants.INDEX_TYPE_FULLTEXT) {
decl.append(" FULLTEXT");
} else {
super.appendIndexModifiers(index, decl);
}
}
protected void appendIndexColumnModifiers(StringBuilder decl, DBSTableIndexColumn indexColumn) {
final String subPart = ((MySQLTableIndexColumn) indexColumn).getSubPart();
if (!CommonUtils.isEmpty(subPart)) {
decl.append(" (").append(subPart).append(")");
}
if (!indexColumn.isAscending()) {
decl.append(" DESC"); //$NON-NLS-1$
}
}
private static class MyEditIndexPage extends EditIndexPage {
public static final String PROP_LENGTH = "length";
private int lengthColumnIndex;
public MyEditIndexPage(MySQLTable parent) {
super(MySQLMessages.edit_index_manager_title, parent,
Arrays.asList(MySQLConstants.INDEX_TYPE_BTREE,
MySQLConstants.INDEX_TYPE_FULLTEXT,
MySQLConstants.INDEX_TYPE_HASH,
MySQLConstants.INDEX_TYPE_RTREE));
}
@Override
protected void createAttributeColumns(Table columnsTable) {
super.createAttributeColumns(columnsTable);
TableColumn colDesc = UIUtils.createTableColumn(columnsTable, SWT.NONE, "Length");
colDesc.setToolTipText("Index length (for varchar columns)");
}
@Override
protected int fillAttributeColumns(DBSEntityAttribute attribute, AttributeInfo attributeInfo, TableItem columnItem) {
lengthColumnIndex = super.fillAttributeColumns(attribute, attributeInfo, columnItem) + 1;
Integer length = (Integer) attributeInfo.getProperty(PROP_LENGTH);
columnItem.setText(lengthColumnIndex, length == null ? "" : length.toString());
return lengthColumnIndex;
}
@Override
protected Control createCellEditor(Table table, int index, TableItem item, AttributeInfo attributeInfo) {
if (index == lengthColumnIndex && attributeInfo.getAttribute().getDataKind() == DBPDataKind.STRING) {
Integer length = (Integer) attributeInfo.getProperty(PROP_LENGTH);
Spinner spinner = new Spinner(table, SWT.BORDER);
spinner.setMinimum(0);
spinner.setMaximum((int) attributeInfo.getAttribute().getMaxLength());
if (length != null) {
spinner.setSelection(length);
}
return spinner;
}
return super.createCellEditor(table, index, item, attributeInfo);
}
@Override
protected void saveCellValue(Control control, int index, TableItem item, AttributeInfo attributeInfo) {
if (index == lengthColumnIndex) {
Spinner spinner = (Spinner) control;
int length = spinner.getSelection();
item.setText(index, length <= 0 ? "" : String.valueOf(length));
if (length <= 0) {
attributeInfo.setProperty(PROP_LENGTH, null);
} else {
attributeInfo.setProperty(PROP_LENGTH, length);
}
} else {
super.saveCellValue(control, index, item, attributeInfo);
}
}
}
}