提交 3914163b 编写于 作者: S serge-rider

Merge remote-tracking branch 'origin/devel' into devel

......@@ -613,6 +613,10 @@ dialog_struct_create_entity_title = \u521B\u5EFA\u65B0\u7684
dialog_struct_create_procedure_combo_type = \u7C7B\u578B
dialog_struct_create_procedure_label_name = \u540D\u79F0
dialog_struct_create_procedure_title = \u521B\u5EFA\u65B0\u7684\u8FC7\u7A0B/\u51FD\u6570
dialog_struct_create_procedure_container = \u6A21\u5F0F
dialog_struct_create_sequence_title = \u521B\u5EFA\u65B0\u5E8F\u5217
dialog_struct_create_sequence_name = \u5E8F\u5217\u540D\u79F0
dialog_struct_create_sequence_container = \u6A21\u5F0F
dialog_struct_edit_constrain_label_type = \u7C7B\u578B
dialog_struct_edit_fk_column_col_type = \u5B57\u6BB5\u7C7B\u578B
dialog_struct_edit_fk_column_column = \u5B57\u6BB5
......@@ -1241,5 +1245,9 @@ obj_editor_properties_control_action_configure_columns = \u914D\u7F6E\u5B57\u6BB
obj_editor_properties_control_action_configure_columns_description = \u914D\u7F6E\u5B57\u6BB5\u53EF\u89C1\u6027
## object properties editor ##
##toolbar editor menu item##
toolbar_cmd_undo_name = \u64A4\u9500
toolbar_cmd_redo_name = \u91CD\u505A
##toolbar editor menu item##
......@@ -627,6 +627,10 @@ public class CoreMessages extends NLS {
public static String dialog_struct_create_procedure_combo_type;
public static String dialog_struct_create_procedure_label_name;
public static String dialog_struct_create_procedure_title;
public static String dialog_struct_create_procedure_container;
public static String dialog_struct_create_sequence_title;
public static String dialog_struct_create_sequence_name;
public static String dialog_struct_create_sequence_container;
public static String dialog_struct_edit_constrain_label_type;
public static String dialog_struct_edit_fk_column_col_type;
public static String dialog_struct_edit_fk_column_column;
......@@ -1342,7 +1346,10 @@ public class CoreMessages extends NLS {
public static String obj_editor_properties_control_action_configure_columns_description;
//object properties editor
//toolbar editor menu item
public static String toolbar_cmd_undo_name;
public static String toolbar_cmd_redo_name;
//toolbar editor menu item
static {
// initialize resource bundle
......
......@@ -623,6 +623,10 @@ dialog_struct_create_entity_title = Create new
dialog_struct_create_procedure_combo_type = Type
dialog_struct_create_procedure_label_name = Name
dialog_struct_create_procedure_title = Create new procedure/function
dialog_struct_create_procedure_container = Container
dialog_struct_create_sequence_title = Create new Sequence
dialog_struct_create_sequence_name = Sequence Name
dialog_struct_create_sequence_container = Container
dialog_struct_edit_constrain_label_type = Type
dialog_struct_edit_fk_column_col_type = Column Type
dialog_struct_edit_fk_column_column = Column
......@@ -1301,6 +1305,10 @@ obj_editor_properties_control_action_configure_columns = Configure columns
obj_editor_properties_control_action_configure_columns_description = Configure columns visibility
## object properties editor ##
##toolbar editor menu item##
toolbar_cmd_undo_name = Undo
toolbar_cmd_redo_name = Redo
##toolbar editor menu item##
......@@ -24,6 +24,7 @@ import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.commands.IElementUpdater;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.menus.UIElement;
import org.jkiss.dbeaver.core.CoreMessages;
import org.jkiss.dbeaver.model.edit.DBECommandContext;
import org.jkiss.dbeaver.ui.editors.entity.EntityEditor;
import org.jkiss.dbeaver.utils.RuntimeUtils;
......@@ -54,7 +55,7 @@ public class RedoChangesHandler extends AbstractHandler implements IElementUpdat
final IEditorPart activeEditor = workbenchWindow.getActivePage().getActiveEditor();
if (activeEditor instanceof EntityEditor) {
final DBECommandContext commandContext = ((EntityEditor) activeEditor).getCommandContext();
String text = "Redo";
String text = CoreMessages.toolbar_cmd_redo_name;
if (commandContext != null && commandContext.getRedoCommand() != null) {
text += " " + commandContext.getRedoCommand().getTitle();
}
......
......@@ -24,6 +24,7 @@ import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.commands.IElementUpdater;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.menus.UIElement;
import org.jkiss.dbeaver.core.CoreMessages;
import org.jkiss.dbeaver.model.edit.DBECommandContext;
import org.jkiss.dbeaver.ui.editors.entity.EntityEditor;
import org.jkiss.dbeaver.utils.RuntimeUtils;
......@@ -54,7 +55,7 @@ public class UndoChangesHandler extends AbstractHandler implements IElementUpdat
final IEditorPart activeEditor = workbenchWindow.getActivePage().getActiveEditor();
if (activeEditor instanceof EntityEditor) {
final DBECommandContext commandContext = ((EntityEditor) activeEditor).getCommandContext();
String text = "Undo";
String text = CoreMessages.toolbar_cmd_undo_name;
if (commandContext != null && commandContext.getUndoCommand() != null) {
text += " " + commandContext.getUndoCommand().getTitle();
}
......
......@@ -54,7 +54,7 @@ public class CreateProcedurePage extends BaseObjectEditPage {
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
propsGroup.setLayoutData(gd);
final Text containerText = UIUtils.createLabelText(propsGroup, "Container", DBUtils.getObjectFullName(this.container, DBPEvaluationContext.UI));
final Text containerText = UIUtils.createLabelText(propsGroup, CoreMessages.dialog_struct_create_procedure_container, DBUtils.getObjectFullName(this.container, DBPEvaluationContext.UI));
containerText.setEditable(false);
final Text nameText = UIUtils.createLabelText(propsGroup, CoreMessages.dialog_struct_create_procedure_label_name, null);
nameText.addModifyListener(e -> {
......
......@@ -51,8 +51,8 @@ public class CreateSequencePage extends BaseObjectEditPage {
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
propsGroup.setLayoutData(gd);
UIUtils.createLabelText(propsGroup, "Container", DBUtils.getObjectFullName(container, DBPEvaluationContext.UI)).setEditable(false);
final Text nameText = UIUtils.createLabelText(propsGroup, "Sequence Name", null);
UIUtils.createLabelText(propsGroup, CoreMessages.dialog_struct_create_sequence_container, DBUtils.getObjectFullName(container, DBPEvaluationContext.UI)).setEditable(false);
final Text nameText = UIUtils.createLabelText(propsGroup, CoreMessages.dialog_struct_create_sequence_name, null);
nameText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e)
......
......@@ -64,9 +64,44 @@
<extension point="org.jkiss.dbeaver.mockGenerator">
<generator
id="numericConstantGenerator"
label="Numeric Constant"
description="Constant numeric value"
class="org.jkiss.dbeaver.ext.mockdata.generator.ConstantGenerator">
<type kind="NUMERIC"/>
<propertyGroup label="General">
<property id="value" label="Value" type="numeric" defaultValue="0"/>
</propertyGroup>
</generator>
<generator
id="numericRandomGenerator"
label="Numeric Random"
description="Random numeric values"
class="org.jkiss.dbeaver.ext.mockdata.generator.NumericRandomGenerator">
<type kind="NUMERIC"/>
</generator>
<generator
id="numericSequenceGenerator"
label="Numeric Sequence"
description="Sequence of numbers with adjustable start, step and order"
class="org.jkiss.dbeaver.ext.mockdata.generator.NumericSequenceGenerator"
tags="id,number,order">
<type kind="NUMERIC"/>
<propertyGroup label="General">
<property id="start" label="Start value" type="long" defaultValue="0" description="Initial sequence value"/>
<property id="step" label="Increment step" type="long" defaultValue="1" description="Sequence increment step"/>
<property id="reverse" label="Reverse order" type="boolean" defaultValue="FALSE" description="Reverse the sequence order"/>
</propertyGroup>
</generator>
<generator
id="booleanConstantGenerator"
label="Constant"
label="Boolean Constant"
description="Constant boolean value"
class="org.jkiss.dbeaver.ext.mockdata.generator.ConstantGenerator">
<type kind="BOOLEAN"/>
......@@ -78,7 +113,7 @@
<generator
id="booleanRandomGenerator"
label="Random"
label="Boolean Random"
description="Random boolean values"
class="org.jkiss.dbeaver.ext.mockdata.generator.BooleanRandomGenerator">
<type kind="BOOLEAN"/>
......@@ -86,7 +121,7 @@
<generator
id="booleanSequenceGenerator"
label="Sequence"
label="Boolean Sequence"
description="Adjustable sequence of boolean values"
class="org.jkiss.dbeaver.ext.mockdata.generator.BooleanSequenceGenerator">
<type kind="BOOLEAN"/>
......@@ -99,7 +134,7 @@
<generator
id="dateConstantGenerator"
label="Constant"
label="Date Constant"
description="Constant date value"
class="org.jkiss.dbeaver.ext.mockdata.generator.ConstantGenerator">
<type kind="DATETIME"/>
......@@ -111,7 +146,7 @@
<generator
id="dateRandomGenerator"
label="Random"
label="Date Random"
description="Random date values"
class="org.jkiss.dbeaver.ext.mockdata.generator.DateRandomGenerator">
<type kind="DATETIME"/>
......@@ -124,7 +159,7 @@
<generator
id="dateSequenceGenerator"
label="Sequence"
label="Date Sequence"
description="Adjustable sequence of dates"
class="org.jkiss.dbeaver.ext.mockdata.generator.DateSequenceGenerator">
<type kind="DATETIME"/>
......@@ -148,44 +183,9 @@
-->
</generator>
<generator
id="numericConstantGenerator"
label="Constant"
description="Constant numeric value"
class="org.jkiss.dbeaver.ext.mockdata.generator.ConstantGenerator">
<type kind="NUMERIC"/>
<propertyGroup label="General">
<property id="value" label="Value" type="numeric" defaultValue="0"/>
</propertyGroup>
</generator>
<generator
id="numericRandomGenerator"
label="Random"
description="Random numeric values"
class="org.jkiss.dbeaver.ext.mockdata.generator.NumericRandomGenerator">
<type kind="NUMERIC"/>
</generator>
<generator
id="numericSequenceGenerator"
label="Sequence"
description="Sequence of numbers with adjustable start, step and order"
class="org.jkiss.dbeaver.ext.mockdata.generator.NumericSequenceGenerator"
tags="id,number,order">
<type kind="NUMERIC"/>
<propertyGroup label="General">
<property id="start" label="Start value" type="long" defaultValue="0" description="Initial sequence value"/>
<property id="step" label="Increment step" type="long" defaultValue="1" description="Sequence increment step"/>
<property id="reverse" label="Reverse order" type="boolean" defaultValue="FALSE" description="Reverse the sequence order"/>
</propertyGroup>
</generator>
<generator
id="stringConstantGenerator"
label="Constant"
label="String Constant"
description="Constant string"
class="org.jkiss.dbeaver.ext.mockdata.generator.ConstantGenerator">
<type kind="STRING"/>
......@@ -216,7 +216,7 @@
label="UUID"
description="UUID random values"
class="org.jkiss.dbeaver.ext.mockdata.generator.StringUuidGenerator"
tags="uuid">
tags="id,uuid">
<type kind="STRING"/>
</generator>
......
......@@ -34,10 +34,7 @@ import org.jkiss.dbeaver.model.exec.*;
import org.jkiss.dbeaver.model.impl.AbstractExecutionSource;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.sql.SQLUtils;
import org.jkiss.dbeaver.model.struct.DBSAttributeBase;
import org.jkiss.dbeaver.model.struct.DBSDataManipulator;
import org.jkiss.dbeaver.model.struct.DBSEntity;
import org.jkiss.dbeaver.model.struct.DBSEntityAttribute;
import org.jkiss.dbeaver.model.struct.*;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.dialogs.tools.AbstractToolWizard;
import org.jkiss.utils.CommonUtils;
......@@ -239,6 +236,21 @@ public class MockDataExecuteWizard extends AbstractToolWizard<DBSDataManipulato
monitor.beginTask("Insert data", (int) rowsNumber);
boolean hasMiltiUniqs = false;
Set<String> miltiUniqColumns = new HashSet<>();
for (DBSAttributeBase attribute : attributes) {
if (DBUtils.checkUnique(monitor, dbsEntity, attribute) == DBUtils.UNIQ_TYPE.MULTI) {
hasMiltiUniqs = true;
// collect the columns from multi-uniqs
DBSEntityReferrer constraint = (DBSEntityReferrer) DBUtils.getConstraint(monitor, dbsEntity, attribute);
for (DBSEntityAttributeRef attributeRef : constraint.getAttributeReferences(monitor)) {
miltiUniqColumns.add(attributeRef.getAttribute().getName());
}
}
}
List<List<DBDAttributeValue>> valuesCacheForUniqs = new ArrayList<>();
// generate and insert the data
session.enableLogging(false);
DBSDataManipulator.ExecuteBatch batch = null;
......@@ -275,6 +287,31 @@ public class MockDataExecuteWizard extends AbstractToolWizard<DBSDataManipulato
return true;
}
// skip duplicate records for uniqs
if (hasMiltiUniqs) {
boolean collision = false;
for (List<DBDAttributeValue> valueList : valuesCacheForUniqs) {
boolean theSame = true;
for (int j = 0; j < valueList.size(); j++) {
if (miltiUniqColumns.contains(valueList.get(j).getAttribute().getName())) {
if (!CommonUtils.equalObjects(valueList.get(j), attributeValues.get(j))) {
theSame = false;
break;
}
}
}
if (theSame) {
collision = true;
break;
}
}
if (collision) {
continue;
} else {
valuesCacheForUniqs.add(attributeValues);
}
}
if (batch == null) {
batch = dataManipulator.insertData(
session,
......
......@@ -33,8 +33,6 @@ import java.util.*;
public class MockDataSettings {
public static final String FK_GENERATOR_ID = "fkGenerator"; //$NON-NLS-1$
public static final String PROP_REMOVE_OLD_DATA = "removeOldData"; //$NON-NLS-1$
public static final String PROP_ROWS_NUMBER = "rowsNumber"; //$NON-NLS-1$
......@@ -73,7 +71,7 @@ public class MockDataSettings {
//((JDBCColumnKeyType) attribute).isInUniqueKey()
List<DBSEntityReferrer> attributeReferrers = DBUtils.getAttributeReferrers(monitor, (DBSEntityAttribute) attribute);
if (!CommonUtils.isEmpty(attributeReferrers)) {
MockGeneratorDescriptor generator = generatorRegistry.getGenerator(FK_GENERATOR_ID);
MockGeneratorDescriptor generator = generatorRegistry.getGenerator(MockGeneratorRegistry.FK_GENERATOR_ID);
putGenerator(generatorProperties, generator);
} else {
List<MockGeneratorDescriptor> generators = generatorRegistry.findAllGenerators(dataManipulator.getDataSource(), attribute);
......
......@@ -186,7 +186,7 @@ public class MockDataWizardPageSettings extends ActiveWizardPage<MockDataExecute
cell.setImage(DBeaverIcons.getImage(DBValueFormatting.getTypeImage(attribute)));
cell.setText(attribute.getName());
try {
if (DBUtils.checkUnique(mockDataSettings.getMonitor(), mockDataSettings.getEntity(), attribute)) {
if (DBUtils.checkUnique(mockDataSettings.getMonitor(), mockDataSettings.getEntity(), attribute) != null) {
cell.setFont(boldFont);
}
} catch (DBException e) {
......
......@@ -81,7 +81,7 @@ public abstract class AbstractMockValueGenerator implements MockValueGenerator {
public Object generateValue(DBRProgressMonitor monitor) throws DBException, IOException {
if (isFirstRun) {
isFirstRun = false;
isUnique = DBUtils.checkUnique(monitor, dbsEntity, attribute);
isUnique = (DBUtils.checkUnique(monitor, dbsEntity, attribute) == DBUtils.UNIQ_TYPE.SINGLE);
if (isUnique && (attribute instanceof DBSAttributeEnumerable)) {
uniqueValues = new HashSet<>();
Collection<DBDLabelValuePair> valuePairs = readColumnValues(monitor, dbsEntity.getDataSource(), (DBSAttributeEnumerable) attribute, UNIQUE_VALUES_SET_SIZE);
......
......@@ -72,7 +72,7 @@ public class FKGenerator extends AbstractMockValueGenerator
throw new DBException("Can't find reference column for '" + attribute.getName() + "'");
}
int numberRefRecords = DBUtils.checkUnique(monitor, dbsEntity, attribute) ? UNIQ_REF_RECORDS_LIMIT : REF_RECORDS_LIMIT;
int numberRefRecords = (DBUtils.checkUnique(monitor, dbsEntity, attribute) == DBUtils.UNIQ_TYPE.SINGLE) ? UNIQ_REF_RECORDS_LIMIT : REF_RECORDS_LIMIT;
Collection<DBDLabelValuePair> values = readColumnValues(monitor, fk.getDataSource(), (DBSAttributeEnumerable) column.getReferencedColumn(), numberRefRecords);
for (DBDLabelValuePair value : values) {
refValues.add(value.getValue());
......
......@@ -23,6 +23,7 @@ import org.jkiss.dbeaver.model.DBPDataKind;
import org.jkiss.dbeaver.model.DBPImage;
import org.jkiss.dbeaver.model.impl.PropertyDescriptor;
import org.jkiss.dbeaver.model.preferences.DBPPropertyDescriptor;
import org.jkiss.dbeaver.model.struct.DBSTypedObject;
import org.jkiss.dbeaver.registry.RegistryConstants;
import org.jkiss.dbeaver.registry.datatype.DataTypeAbstractDescriptor;
import org.jkiss.utils.CommonUtils;
......@@ -177,6 +178,12 @@ public class MockGeneratorDescriptor extends DataTypeAbstractDescriptor<MockValu
return null;
}
@Override
public boolean supportsType(DBSTypedObject typedObject) {
return (typedObject.getDataKind() == DBPDataKind.STRING) ||
super.supportsType(typedObject);
}
@NotNull
public MockValueGenerator createGenerator() {
return createInstance();
......
......@@ -32,6 +32,8 @@ public class MockGeneratorRegistry
{
static final String TAG_GENERATOR = "generator"; //$NON-NLS-1$
public static final String FK_GENERATOR_ID = "fkGenerator"; //$NON-NLS-1$
private static final Log log = Log.getLog(MockGeneratorRegistry.class);
private static MockGeneratorRegistry instance = null;
......@@ -94,6 +96,9 @@ public class MockGeneratorRegistry
List<MockGeneratorDescriptor> result = new ArrayList<>();
for (MockGeneratorDescriptor descriptor : generators) {
if (FK_GENERATOR_ID.equalsIgnoreCase(descriptor.getId())) {
continue;
}
if (((!descriptor.isGlobal() && descriptor.supportsDataSource(dataSource) && descriptor.supportsType(typedObject)) ||
(descriptor.isGlobal() && descriptor.supportsType(typedObject))))
......
......@@ -38,6 +38,7 @@ import org.jkiss.dbeaver.model.sql.SQLUtils;
import org.jkiss.dbeaver.model.struct.DBSEntityType;
import org.jkiss.dbeaver.model.struct.rdb.DBSSequence;
import org.jkiss.dbeaver.model.struct.rdb.DBSTableIndex;
import org.jkiss.utils.CommonUtils;
import java.util.ArrayList;
import java.util.Collection;
......@@ -214,6 +215,11 @@ public class PostgreSequence extends PostgreTableBase implements DBSSequence, DB
sql.append("\n\tSTART ").append(info.getLastValue());
}
if (!CommonUtils.isEmpty(getDescription())) {
sql.append("\nCOMMENT ON SEQUENCE ").append(DBUtils.getQuotedIdentifier(this)).append(" IS ")
.append(SQLUtils.quoteString(this, getDescription())).append(";");
}
List<DBEPersistAction> actions = new ArrayList<>();
PostgreUtils.getObjectGrantPermissionActions(monitor, this, actions, options);
if (!actions.isEmpty()) {
......
......@@ -1554,16 +1554,35 @@ public final class DBUtils {
return true;
}
public static boolean checkUnique(DBRProgressMonitor monitor, DBSEntity dbsEntity, DBSAttributeBase attribute) throws DBException {
public enum UNIQ_TYPE {
SINGLE, MULTI
}
public static UNIQ_TYPE checkUnique(DBRProgressMonitor monitor, DBSEntity dbsEntity, DBSAttributeBase attribute) throws DBException {
for (DBSEntityConstraint constraint : dbsEntity.getConstraints(monitor)) {
DBSEntityConstraintType constraintType = constraint.getConstraintType();
if (constraintType.isUnique()) {
DBSEntityAttributeRef constraintAttribute = getConstraintAttribute(monitor, ((DBSEntityReferrer) constraint), attribute.getName());
if (constraintAttribute != null && constraintAttribute.getAttribute() == attribute) {
return true;
List<? extends DBSEntityAttributeRef> refColumns = ((DBSEntityReferrer) constraint).getAttributeReferences(monitor);
if (refColumns.size() > 1) {
return UNIQ_TYPE.MULTI;
} else {
return UNIQ_TYPE.SINGLE;
}
}
}
}
return false;
return null;
}
public static DBSEntityConstraint getConstraint(DBRProgressMonitor monitor, DBSEntity dbsEntity, DBSAttributeBase attribute) throws DBException {
for (DBSEntityConstraint constraint : dbsEntity.getConstraints(monitor)) {
DBSEntityAttributeRef constraintAttribute = getConstraintAttribute(monitor, ((DBSEntityReferrer) constraint), attribute.getName());
if (constraintAttribute != null && constraintAttribute.getAttribute() == attribute) {
return constraint;
}
}
return null;
}
}
......@@ -19,6 +19,7 @@ package org.jkiss.dbeaver.model.data;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.struct.DBSAttributeBase;
import org.jkiss.utils.CommonUtils;
import java.util.List;
......@@ -71,4 +72,17 @@ public class DBDAttributeValue {
return values;
}
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof DBDAttributeValue)) {
return false;
}
if (!CommonUtils.equalObjects(value, ((DBDAttributeValue) obj).value)) {
return false;
}
if (!CommonUtils.equalObjects(attribute.getName(), ((DBDAttributeValue) obj).attribute.getName())) {
return false;
}
return true;
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册