diff --git a/plugins/org.jkiss.dbeaver.model.sql/plugin.xml b/plugins/org.jkiss.dbeaver.model.sql/plugin.xml index b682d513eeeb67e2283194657a3018b64ed86198..3b7e6b39ff50c44b40ef249e7effbe5c565a2d09 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/plugin.xml +++ b/plugins/org.jkiss.dbeaver.model.sql/plugin.xml @@ -18,6 +18,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/BaseAnalysisRunner.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/BaseAnalysisRunner.java index 37a4abe48287e959505bca0dddea853e6474557a..3423c4b1a232ad347c946b89fb7f1eb21bb8a72f 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/BaseAnalysisRunner.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/BaseAnalysisRunner.java @@ -28,10 +28,6 @@ import java.util.List; public abstract class BaseAnalysisRunner extends SQLGenerator { - protected BaseAnalysisRunner(List objects) { - super(objects); - } - protected abstract Collection getAllAttributes(DBRProgressMonitor monitor, OBJECT object) throws DBException; protected abstract Collection getKeyAttributes(DBRProgressMonitor monitor, OBJECT object) throws DBException; diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/ProcedureAnalysisRunner.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/ProcedureAnalysisRunner.java index f6f605901ead38755fb24615c7dd99fc86d45a26..8a3f7b5c22a3c851f45d596f51fc44a229c0233f 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/ProcedureAnalysisRunner.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/ProcedureAnalysisRunner.java @@ -22,15 +22,9 @@ import org.jkiss.dbeaver.model.struct.rdb.DBSProcedure; import java.util.Collection; import java.util.Collections; -import java.util.List; public abstract class ProcedureAnalysisRunner extends BaseAnalysisRunner { - ProcedureAnalysisRunner(List entities) - { - super(entities); - } - protected Collection getAllAttributes(DBRProgressMonitor monitor, DBSProcedure object) { return Collections.emptyList(); } diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGenerator.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGenerator.java index 14a314e453fdc061fe5dfaac0647870ceccb6ea2..85acf89bfe0744f62ac4953962e25e7fce53d320 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGenerator.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGenerator.java @@ -29,15 +29,18 @@ import java.util.List; import java.util.Map; public abstract class SQLGenerator extends DBRRunnableWithResult { - final protected List objects; + protected List objects; private boolean fullyQualifiedNames = true; private boolean compactSQL = false; - SQLGenerator(List objects) - { + public void initGenerator(List objects) { this.objects = objects; } + public List getObjects() { + return objects; + } + public boolean isFullyQualifiedNames() { return fullyQualifiedNames; } diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorDDL.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorDDL.java index f3f4e00ced993c66abd120cb39a549fc57ef2f1b..8a59e3448c45511505834e17a6368c8cf898632c 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorDDL.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorDDL.java @@ -32,9 +32,6 @@ import java.util.List; import java.util.Map; public class SQLGeneratorDDL extends SQLGenerator { - public SQLGeneratorDDL(List scriptObjects) { - super(scriptObjects); - } @Override public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException { diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorDelete.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorDelete.java index 4ea8ac51e85df0d5e1fc458a845052e2171a3b3f..24fecdbb9e9a10327328341a512fb3c678a6f0a4 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorDelete.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorDelete.java @@ -25,12 +25,8 @@ import org.jkiss.dbeaver.model.struct.DBSEntityAttribute; import org.jkiss.utils.CommonUtils; import java.util.Collection; -import java.util.List; public class SQLGeneratorDelete extends TableAnalysisRunner { - public SQLGeneratorDelete(List entities) { - super(entities); - } @Override public void generateSQL(DBRProgressMonitor monitor, StringBuilder sql, DBSEntity object) throws DBException { diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorInsert.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorInsert.java index a191b34b86f810212e24680991453bca9d2370bc..bb1b175438d490697e95fe09357b098387ec7fa2 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorInsert.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorInsert.java @@ -23,12 +23,7 @@ import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.struct.DBSEntity; import org.jkiss.dbeaver.model.struct.DBSEntityAttribute; -import java.util.List; - public class SQLGeneratorInsert extends TableAnalysisRunner { - public SQLGeneratorInsert(List entities) { - super(entities); - } @Override public void generateSQL(DBRProgressMonitor monitor, StringBuilder sql, DBSEntity object) throws DBException { diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorJoin.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorJoin.java index 1ebcc635f095494eb316a079e8767bb3850b4f13..601ed5de19b0415f0fea5700609205c0c49ab783 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorJoin.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorJoin.java @@ -22,14 +22,9 @@ import org.jkiss.dbeaver.model.sql.SQLUtils; import org.jkiss.dbeaver.model.struct.DBSEntity; import java.lang.reflect.InvocationTargetException; -import java.util.List; public class SQLGeneratorJoin extends SQLGenerator { - public SQLGeneratorJoin(List entities) { - super(entities); - } - @Override public void run(DBRProgressMonitor monitor) throws InvocationTargetException { StringBuilder sql = new StringBuilder(100); diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorMerge.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorMerge.java index e7f39981666ea2e77f09c4384b9b276f6f7ee0ee..f131ab0f4105712f5de58572ee4edc9efcadb9cb 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorMerge.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorMerge.java @@ -25,12 +25,8 @@ import org.jkiss.dbeaver.model.struct.DBSEntityAttribute; import org.jkiss.utils.CommonUtils; import java.util.Collection; -import java.util.List; public class SQLGeneratorMerge extends TableAnalysisRunner { - public SQLGeneratorMerge(List entities) { - super(entities); - } @Override public void generateSQL(DBRProgressMonitor monitor, StringBuilder sql, DBSEntity object) throws DBException { diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorProcedureCall.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorProcedureCall.java index 25084641a58a92627d335ec96d24524f6598b6f3..9934d143fc024db53fafee4a59b7522aeba1cdad 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorProcedureCall.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorProcedureCall.java @@ -25,14 +25,9 @@ import org.jkiss.dbeaver.model.struct.rdb.DBSProcedureParameter; import org.jkiss.utils.CommonUtils; import java.util.Collection; -import java.util.List; public class SQLGeneratorProcedureCall extends ProcedureAnalysisRunner { - public SQLGeneratorProcedureCall(List entities) { - super(entities); - } - @Override protected void generateSQL(DBRProgressMonitor monitor, StringBuilder sql, DBSProcedure proc) throws DBException { Collection parameters = proc.getParameters(monitor); diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorSelect.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorSelect.java index 4567bf7b25f9762bd5cfa155702f832c4b59b485..7601d32bb0804e21c4138c7bacb5291e2b8b0e41 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorSelect.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorSelect.java @@ -23,13 +23,10 @@ import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.struct.DBSEntity; import org.jkiss.dbeaver.model.struct.DBSEntityAttribute; -import java.util.List; - public class SQLGeneratorSelect extends TableAnalysisRunner { - private final boolean columnList; + private boolean columnList; - public SQLGeneratorSelect(List entities, boolean columnList) { - super(entities); + public void setColumnList(boolean columnList) { this.columnList = columnList; } diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorUpdate.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorUpdate.java index 01e2724d1d0a6c86dbdac0bf7347df3f57a9bebc..cd162c8c44ac0ef3cafa2b4216f23f0dc73a3dd6 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorUpdate.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/SQLGeneratorUpdate.java @@ -26,12 +26,8 @@ import org.jkiss.dbeaver.model.struct.DBSEntityAttribute; import org.jkiss.utils.CommonUtils; import java.util.Collection; -import java.util.List; public class SQLGeneratorUpdate extends TableAnalysisRunner { - public SQLGeneratorUpdate(List entities) { - super(entities); - } @Override public void generateSQL(DBRProgressMonitor monitor, StringBuilder sql, DBSEntity object) throws DBException { diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/TableAnalysisRunner.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/TableAnalysisRunner.java index fee48470ccae1af6f999a979fc7d29197e89b60d..40a1937c92a573efa26cc2b358ef0dc24a266823 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/TableAnalysisRunner.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/generator/TableAnalysisRunner.java @@ -24,15 +24,9 @@ import org.jkiss.dbeaver.model.struct.DBSEntityAttribute; import org.jkiss.utils.CommonUtils; import java.util.Collection; -import java.util.List; public abstract class TableAnalysisRunner extends BaseAnalysisRunner { - TableAnalysisRunner(List entities) - { - super(entities); - } - protected Collection getAllAttributes(DBRProgressMonitor monitor, DBSEntity object) throws DBException { return CommonUtils.safeCollection(object.getAttributes(monitor)); diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/registry/SQLGeneratorConfigurationRegistry.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/registry/SQLGeneratorConfigurationRegistry.java index e50d6c0879b1723ebc1e6322d8c88917b113eb8c..ddcb05570c306c7a1a8cb58ed8d5b24f22c6d0da 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/registry/SQLGeneratorConfigurationRegistry.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/registry/SQLGeneratorConfigurationRegistry.java @@ -22,16 +22,19 @@ import org.eclipse.core.runtime.Platform; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPDataSource; +import org.jkiss.dbeaver.model.DBPObject; import org.jkiss.dbeaver.model.sql.generator.SQLGenerator; import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; import java.util.List; public class SQLGeneratorConfigurationRegistry { private static final Log log = Log.getLog(SQLGeneratorConfigurationRegistry.class); - private static final String TAG_FORMATTER = "generator"; //$NON-NLS-1$ + private static final String TAG_GENERATOR = "generator"; //$NON-NLS-1$ private static SQLGeneratorConfigurationRegistry instance = null; private final List generators = new ArrayList<>(); @@ -51,10 +54,10 @@ public class SQLGeneratorConfigurationRegistry private void loadExtensions(IExtensionRegistry registry) { - IConfigurationElement[] extConfigs = registry.getConfigurationElementsFor(SQLFormatterDescriptor.EXTENSION_ID); + IConfigurationElement[] extConfigs = registry.getConfigurationElementsFor(SQLGeneratorDescriptor.EXTENSION_ID); for (IConfigurationElement ext : extConfigs) { // Load generators - if (TAG_FORMATTER.equals(ext.getName())) { + if (TAG_GENERATOR.equals(ext.getName())) { this.generators.add( new SQLGeneratorDescriptor(ext)); } @@ -70,8 +73,21 @@ public class SQLGeneratorConfigurationRegistry return new ArrayList<>(generators); } - public List getApplicableGenerators() { - return getAllGenerators(); + public List getApplicableGenerators(Collection objects, Object context) { + List result = new ArrayList<>(); + for (SQLGeneratorDescriptor gen : generators) { + for (Object object : objects) { + if (object instanceof DBPObject && gen.appliesTo((DBPObject) object, context)) { + if (gen.isMultiObject() && objects.size() < 2) { + continue; + } + result.add(gen); + break; + } + } + } + result.sort(Comparator.comparingInt(SQLGeneratorDescriptor::getOrder)); + return result; } public SQLGeneratorDescriptor getGenerator(String id) { diff --git a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/registry/SQLGeneratorDescriptor.java b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/registry/SQLGeneratorDescriptor.java index 2037306d3f5f6ae36e84bbf25f34a94cf47a9661..fc8e78fe61057f1305d73785af25178a5d13377e 100644 --- a/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/registry/SQLGeneratorDescriptor.java +++ b/plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/registry/SQLGeneratorDescriptor.java @@ -20,9 +20,9 @@ package org.jkiss.dbeaver.model.sql.registry; import org.eclipse.core.runtime.IConfigurationElement; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.DBException; -import org.jkiss.dbeaver.model.DBPDataSource; import org.jkiss.dbeaver.model.impl.AbstractContextDescriptor; import org.jkiss.dbeaver.model.sql.generator.SQLGenerator; +import org.jkiss.utils.CommonUtils; import java.util.List; @@ -36,14 +36,18 @@ public class SQLGeneratorDescriptor extends AbstractContextDescriptor { private final String id; private final String label; private final String description; + private final int order; + private final boolean multiObject; private final ObjectType generatorImplClass; - public SQLGeneratorDescriptor(IConfigurationElement config) { + SQLGeneratorDescriptor(IConfigurationElement config) { super(config); this.id = config.getAttribute("id"); this.label = config.getAttribute("label"); this.description = config.getAttribute("description"); this.generatorImplClass = new ObjectType(config.getAttribute("class")); + this.order = CommonUtils.toInt(config.getAttribute("order")); + this.multiObject = CommonUtils.toBoolean(config.getAttribute("multiObject")); } public String getId() { @@ -58,12 +62,26 @@ public class SQLGeneratorDescriptor extends AbstractContextDescriptor { return description; } + public int getOrder() { + return order; + } + + public boolean isMultiObject() { + return multiObject; + } + @NotNull - public SQLGenerator createGenerator(DBPDataSource dataSource, List objects) - throws DBException { - SQLGenerator instance = generatorImplClass.createInstance(SQLGenerator.class); - //instance.ini + public SQLGenerator createGenerator(List objects) + throws DBException + { + @SuppressWarnings("unchecked") + SQLGenerator instance = generatorImplClass.createInstance(SQLGenerator.class); + instance.initGenerator(objects); return instance; } + @Override + public String toString() { + return id; + } } diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ui.editors.data/META-INF/MANIFEST.MF index e528c0206a3d6c97c6902c8da16ccd199628a889..e62bc476316813ca5c139d0b59f9e8cf9e08b086 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.data/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/META-INF/MANIFEST.MF @@ -29,6 +29,7 @@ Export-Package: org.jkiss.dbeaver.registry.functions, org.jkiss.dbeaver.ui.controls, org.jkiss.dbeaver.ui.controls.lightgrid, org.jkiss.dbeaver.ui.controls.resultset, + org.jkiss.dbeaver.ui.controls.resultset.generator, org.jkiss.dbeaver.ui.controls.resultset.internal, org.jkiss.dbeaver.ui.controls.resultset.plaintext, org.jkiss.dbeaver.ui.controls.resultset.spreadsheet, diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/plugin.xml b/plugins/org.jkiss.dbeaver.ui.editors.data/plugin.xml index d10171fa8581da506355c648517a910b0769ab04..b0f9a4a7e72b0dcf17b9b4db552df3989fcd6d27 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.data/plugin.xml +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/plugin.xml @@ -180,6 +180,25 @@ + + + + + + + + + + + + + + + + + + + { +public abstract class ResultSetAnalysisRunner extends BaseAnalysisRunner { - ResultSetAnalysisRunner(DBPDataSource dataSource, ResultSetModel model) - { - super(Collections.singletonList(model)); + public IResultSetController getController() { + return objects.get(0); + } + + public List getSelectedRows() { + return getController().getSelection().getSelectedRows(); + } + + public DBSEntity getSingleEntity() { + return getController().getModel().getSingleSource(); } - protected abstract void generateSQL(DBRProgressMonitor monitor, StringBuilder sql, ResultSetModel object) + protected abstract void generateSQL(DBRProgressMonitor monitor, StringBuilder sql, IResultSetController object) throws DBException; - protected Collection getAllAttributes(DBRProgressMonitor monitor, ResultSetModel object) { - return object.getVisibleAttributes(); + protected Collection getAllAttributes(DBRProgressMonitor monitor, IResultSetController object) { + return object.getModel().getVisibleAttributes(); } void appendValueCondition(IResultSetController rsv, StringBuilder sql, DBDAttributeBinding binding, ResultSetRow firstRow) { @@ -60,7 +67,7 @@ public abstract class ResultSetAnalysisRunner extends BaseAnalysisRunner getKeyAttributes(DBRProgressMonitor monitor, ResultSetModel object) { + protected List getKeyAttributes(DBRProgressMonitor monitor, IResultSetController object) { final DBDRowIdentifier rowIdentifier = getDefaultRowIdentifier(object); if (rowIdentifier == null) { return Collections.emptyList(); @@ -69,8 +76,8 @@ public abstract class ResultSetAnalysisRunner extends BaseAnalysisRunner keyAttributes = getKeyAttributes(monitor, object); + sql.append("DELETE FROM ").append(getEntityName(getSingleEntity())); + sql.append(getLineSeparator()).append("WHERE "); + boolean hasAttr = false; + for (DBDAttributeBinding binding : keyAttributes) { + if (hasAttr) sql.append(" AND "); + appendValueCondition(getController(), sql, binding, firstRow); + hasAttr = true; + } + sql.append(";\n"); + } + } +} diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/generator/SQLGeneratorInsertFromData.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/generator/SQLGeneratorInsertFromData.java similarity index 68% rename from plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/generator/SQLGeneratorInsertFromData.java rename to plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/generator/SQLGeneratorInsertFromData.java index 42aabb50491c6bb5b74121552cb547ae7a035c64..2cade5f59dedb65b4fd4bef3b07767e972696469 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/generator/SQLGeneratorInsertFromData.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/generator/SQLGeneratorInsertFromData.java @@ -14,40 +14,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jkiss.dbeaver.ui.editors.sql.generator; +package org.jkiss.dbeaver.ui.controls.resultset.generator; import org.jkiss.dbeaver.model.DBPEvaluationContext; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.data.DBDAttributeBinding; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.struct.DBSAttributeBase; -import org.jkiss.dbeaver.model.struct.DBSDataContainer; -import org.jkiss.dbeaver.model.struct.DBSEntity; import org.jkiss.dbeaver.ui.controls.resultset.IResultSetController; -import org.jkiss.dbeaver.ui.controls.resultset.ResultSetModel; import org.jkiss.dbeaver.ui.controls.resultset.ResultSetRow; import java.util.Collection; -import java.util.List; -class SQLGeneratorInsertFromData extends ResultSetAnalysisRunner { - private final IResultSetController rsv; - private final List selectedRows; - private final DBSEntity entity; - - public SQLGeneratorInsertFromData(DBSDataContainer dataContainer, IResultSetController rsv, List selectedRows, DBSEntity entity) { - super(dataContainer.getDataSource(), rsv.getModel()); - this.rsv = rsv; - this.selectedRows = selectedRows; - this.entity = entity; - } +public class SQLGeneratorInsertFromData extends ResultSetAnalysisRunner { @Override - public void generateSQL(DBRProgressMonitor monitor, StringBuilder sql, ResultSetModel object) { - for (ResultSetRow firstRow : selectedRows) { + public void generateSQL(DBRProgressMonitor monitor, StringBuilder sql, IResultSetController object) { + for (ResultSetRow firstRow : getSelectedRows()) { Collection allAttributes = getAllAttributes(monitor, object); - sql.append("INSERT INTO ").append(getEntityName(entity)); + sql.append("INSERT INTO ").append(getEntityName(getSingleEntity())); sql.append(getLineSeparator()).append("("); boolean hasAttr = false; for (DBSAttributeBase attr : allAttributes) { @@ -65,11 +51,11 @@ class SQLGeneratorInsertFromData extends ResultSetAnalysisRunner { continue; } if (hasAttr) sql.append(", "); - DBDAttributeBinding binding = rsv.getModel().getAttributeBinding(attr); + DBDAttributeBinding binding = getController().getModel().getAttributeBinding(attr); if (binding == null) { appendDefaultValue(sql, attr); } else { - appendAttributeValue(rsv, sql, binding, firstRow); + appendAttributeValue(getController(), sql, binding, firstRow); } hasAttr = true; } diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/generator/SQLGeneratorDeleteFromData.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/generator/SQLGeneratorSelectFromData.java similarity index 59% rename from plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/generator/SQLGeneratorDeleteFromData.java rename to plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/generator/SQLGeneratorSelectFromData.java index 26603dc6882b74c14305be9bb30e00f87b947b65..dd8b18862f9004e8c1481f6275cdfb0d451f96ef 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/generator/SQLGeneratorDeleteFromData.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/generator/SQLGeneratorSelectFromData.java @@ -14,45 +14,42 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jkiss.dbeaver.ui.editors.sql.generator; +package org.jkiss.dbeaver.ui.controls.resultset.generator; +import org.jkiss.dbeaver.model.DBPEvaluationContext; +import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.data.DBDAttributeBinding; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; -import org.jkiss.dbeaver.model.struct.DBSDataContainer; -import org.jkiss.dbeaver.model.struct.DBSEntity; +import org.jkiss.dbeaver.model.struct.DBSAttributeBase; import org.jkiss.dbeaver.ui.controls.resultset.IResultSetController; -import org.jkiss.dbeaver.ui.controls.resultset.ResultSetModel; import org.jkiss.dbeaver.ui.controls.resultset.ResultSetRow; import java.util.Collection; -import java.util.List; -class SQLGeneratorDeleteFromData extends ResultSetAnalysisRunner { - private final IResultSetController rsv; - private final List selectedRows; - private final DBSEntity entity; - - public SQLGeneratorDeleteFromData(DBSDataContainer dataContainer, IResultSetController rsv, List selectedRows, DBSEntity entity) { - super(dataContainer.getDataSource(), rsv.getModel()); - this.rsv = rsv; - this.selectedRows = selectedRows; - this.entity = entity; - } +public class SQLGeneratorSelectFromData extends ResultSetAnalysisRunner { @Override - public void generateSQL(DBRProgressMonitor monitor, StringBuilder sql, ResultSetModel object) { - for (ResultSetRow firstRow : selectedRows) { + public void generateSQL(DBRProgressMonitor monitor, StringBuilder sql, IResultSetController object) { + for (ResultSetRow firstRow : getSelectedRows()) { Collection keyAttributes = getKeyAttributes(monitor, object); - sql.append("DELETE FROM ").append(getEntityName(entity)); - sql.append(getLineSeparator()).append("WHERE "); + sql.append("SELECT "); boolean hasAttr = false; + for (DBSAttributeBase attr : getAllAttributes(monitor, object)) { + if (hasAttr) sql.append(", "); + sql.append(DBUtils.getObjectFullName(attr, DBPEvaluationContext.DML)); + hasAttr = true; + } + sql.append(getLineSeparator()).append("FROM ").append(getEntityName(getSingleEntity())); + sql.append(getLineSeparator()).append("WHERE "); + hasAttr = false; for (DBDAttributeBinding binding : keyAttributes) { if (hasAttr) sql.append(" AND "); - appendValueCondition(rsv, sql, binding, firstRow); + appendValueCondition(getController(), sql, binding, firstRow); hasAttr = true; } sql.append(";\n"); } } + } diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/generator/SQLGeneratorSelectManyFromData.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/generator/SQLGeneratorSelectManyFromData.java similarity index 75% rename from plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/generator/SQLGeneratorSelectManyFromData.java rename to plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/generator/SQLGeneratorSelectManyFromData.java index d5a345dcaae7b0aa9b542f595e35efe57a51ba0a..012e319fb4785cc6ab430ba1e51062b81f9b0e5e 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/generator/SQLGeneratorSelectManyFromData.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/generator/SQLGeneratorSelectManyFromData.java @@ -14,36 +14,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jkiss.dbeaver.ui.editors.sql.generator; +package org.jkiss.dbeaver.ui.controls.resultset.generator; import org.jkiss.dbeaver.model.DBPEvaluationContext; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.data.DBDAttributeBinding; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.struct.DBSAttributeBase; -import org.jkiss.dbeaver.model.struct.DBSDataContainer; -import org.jkiss.dbeaver.model.struct.DBSEntity; import org.jkiss.dbeaver.ui.controls.resultset.IResultSetController; -import org.jkiss.dbeaver.ui.controls.resultset.ResultSetModel; import org.jkiss.dbeaver.ui.controls.resultset.ResultSetRow; import java.util.Collection; import java.util.List; -class SQLGeneratorSelectManyFromData extends ResultSetAnalysisRunner { - private final IResultSetController rsv; - private final DBSEntity entity; - private final List selectedRows; - - public SQLGeneratorSelectManyFromData(DBSDataContainer dataContainer, IResultSetController rsv, DBSEntity entity, List selectedRows) { - super(dataContainer.getDataSource(), rsv.getModel()); - this.rsv = rsv; - this.entity = entity; - this.selectedRows = selectedRows; - } +public class SQLGeneratorSelectManyFromData extends ResultSetAnalysisRunner { @Override - public void generateSQL(DBRProgressMonitor monitor, StringBuilder sql, ResultSetModel object) { + public void generateSQL(DBRProgressMonitor monitor, StringBuilder sql, IResultSetController object) { Collection keyAttributes = getKeyAttributes(monitor, object); sql.append("SELECT "); boolean hasAttr = false; @@ -52,7 +39,7 @@ class SQLGeneratorSelectManyFromData extends ResultSetAnalysisRunner { sql.append(DBUtils.getObjectFullName(attr, DBPEvaluationContext.DML)); hasAttr = true; } - sql.append(getLineSeparator()).append("FROM ").append(getEntityName(entity)); + sql.append(getLineSeparator()).append("FROM ").append(getEntityName(getSingleEntity())); sql.append(getLineSeparator()).append("WHERE "); boolean multiKey = keyAttributes.size() > 1; if (multiKey) sql.append("("); @@ -65,13 +52,14 @@ class SQLGeneratorSelectManyFromData extends ResultSetAnalysisRunner { if (multiKey) sql.append(")"); sql.append(" IN ("); if (multiKey) sql.append("\n"); + List selectedRows = getSelectedRows(); for (int i = 0; i < selectedRows.size(); i++) { ResultSetRow firstRow = selectedRows.get(i); if (multiKey) sql.append("("); hasAttr = false; for (DBDAttributeBinding binding : keyAttributes) { if (hasAttr) sql.append(","); - appendAttributeValue(rsv, sql, binding, firstRow); + appendAttributeValue(getController(), sql, binding, firstRow); hasAttr = true; } if (multiKey) sql.append(")"); diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/generator/SQLGeneratorUpdateFromData.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/generator/SQLGeneratorUpdateFromData.java similarity index 66% rename from plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/generator/SQLGeneratorUpdateFromData.java rename to plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/generator/SQLGeneratorUpdateFromData.java index 97c745979081589f29ddc7db15039db471727dc3..d89b9e784c12989e2a2a3faf6f9f0e037f028db1 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/generator/SQLGeneratorUpdateFromData.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/generator/SQLGeneratorUpdateFromData.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jkiss.dbeaver.ui.editors.sql.generator; +package org.jkiss.dbeaver.ui.controls.resultset.generator; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.model.DBPEvaluationContext; @@ -22,34 +22,20 @@ import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.data.DBDAttributeBinding; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.struct.DBSAttributeBase; -import org.jkiss.dbeaver.model.struct.DBSDataContainer; -import org.jkiss.dbeaver.model.struct.DBSEntity; import org.jkiss.dbeaver.ui.controls.resultset.IResultSetController; -import org.jkiss.dbeaver.ui.controls.resultset.ResultSetModel; import org.jkiss.dbeaver.ui.controls.resultset.ResultSetRow; import java.util.Collection; -import java.util.List; -class SQLGeneratorUpdateFromData extends ResultSetAnalysisRunner { - private final IResultSetController rsv; - private final List selectedRows; - private final DBSEntity entity; - - public SQLGeneratorUpdateFromData(DBSDataContainer dataContainer, IResultSetController rsv, List selectedRows, DBSEntity entity) { - super(dataContainer.getDataSource(), rsv.getModel()); - this.rsv = rsv; - this.selectedRows = selectedRows; - this.entity = entity; - } +public class SQLGeneratorUpdateFromData extends ResultSetAnalysisRunner { @Override - public void generateSQL(DBRProgressMonitor monitor, StringBuilder sql, ResultSetModel object) throws DBException { - for (ResultSetRow firstRow : selectedRows) { + public void generateSQL(DBRProgressMonitor monitor, StringBuilder sql, IResultSetController object) throws DBException { + for (ResultSetRow firstRow : getSelectedRows()) { Collection keyAttributes = getKeyAttributes(monitor, object); Collection valueAttributes = getValueAttributes(monitor, object, keyAttributes); - sql.append("UPDATE ").append(getEntityName(entity)); + sql.append("UPDATE ").append(getEntityName(getSingleEntity())); sql.append(getLineSeparator()).append("SET "); boolean hasAttr = false; for (DBSAttributeBase attr : valueAttributes) { @@ -58,11 +44,11 @@ class SQLGeneratorUpdateFromData extends ResultSetAnalysisRunner { } if (hasAttr) sql.append(", "); sql.append(DBUtils.getObjectFullName(attr, DBPEvaluationContext.DML)).append("="); - DBDAttributeBinding binding = rsv.getModel().getAttributeBinding(attr); + DBDAttributeBinding binding = getController().getModel().getAttributeBinding(attr); if (binding == null) { appendDefaultValue(sql, attr); } else { - appendAttributeValue(rsv, sql, binding, firstRow); + appendAttributeValue(getController(), sql, binding, firstRow); } hasAttr = true; @@ -71,7 +57,7 @@ class SQLGeneratorUpdateFromData extends ResultSetAnalysisRunner { hasAttr = false; for (DBDAttributeBinding attr : keyAttributes) { if (hasAttr) sql.append(" AND "); - appendValueCondition(rsv, sql, attr, firstRow); + appendValueCondition(getController(), sql, attr, firstRow); hasAttr = true; } sql.append(";\n"); diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/generator/GenerateSQLContributor.java b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/generator/GenerateSQLContributor.java index 72418503e63c9582c0133d0c75d4573a4317203c..12d7b3a26cc0055c8221d7661ef3c0378521d9c9 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/generator/GenerateSQLContributor.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/generator/GenerateSQLContributor.java @@ -32,27 +32,31 @@ import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.actions.CompoundContributionItem; import org.jkiss.code.NotNull; +import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPContextProvider; -import org.jkiss.dbeaver.model.DBPEvaluationContext; +import org.jkiss.dbeaver.model.DBPObject; import org.jkiss.dbeaver.model.DBPScriptObject; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.data.DBDAttributeBinding; import org.jkiss.dbeaver.model.exec.DBCExecutionContext; -import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; -import org.jkiss.dbeaver.model.sql.generator.*; -import org.jkiss.dbeaver.model.struct.DBSAttributeBase; +import org.jkiss.dbeaver.model.sql.generator.SQLGenerator; +import org.jkiss.dbeaver.model.sql.generator.SQLGeneratorProcedureCall; +import org.jkiss.dbeaver.model.sql.generator.SQLGeneratorSelect; +import org.jkiss.dbeaver.model.sql.registry.SQLGeneratorConfigurationRegistry; +import org.jkiss.dbeaver.model.sql.registry.SQLGeneratorDescriptor; import org.jkiss.dbeaver.model.struct.DBSDataContainer; import org.jkiss.dbeaver.model.struct.DBSEntity; import org.jkiss.dbeaver.model.struct.DBSObject; +import org.jkiss.dbeaver.model.struct.DBSWrapper; import org.jkiss.dbeaver.model.struct.rdb.DBSProcedure; import org.jkiss.dbeaver.model.struct.rdb.DBSTable; +import org.jkiss.dbeaver.runtime.DBWorkbench; import org.jkiss.dbeaver.ui.DBeaverIcons; import org.jkiss.dbeaver.ui.UIIcon; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.controls.resultset.IResultSetController; import org.jkiss.dbeaver.ui.controls.resultset.IResultSetSelection; -import org.jkiss.dbeaver.ui.controls.resultset.ResultSetModel; import org.jkiss.dbeaver.ui.controls.resultset.ResultSetRow; import org.jkiss.dbeaver.ui.editors.sql.dialogs.ViewSQLDialog; import org.jkiss.dbeaver.ui.navigator.NavigatorUtils; @@ -60,7 +64,6 @@ import org.jkiss.dbeaver.utils.RuntimeUtils; import org.jkiss.utils.CommonUtils; import java.util.ArrayList; -import java.util.Collection; import java.util.List; public class GenerateSQLContributor extends CompoundContributionItem { @@ -71,8 +74,7 @@ public class GenerateSQLContributor extends CompoundContributionItem { // Contributors @Override - protected IContributionItem[] getContributionItems() - { + protected IContributionItem[] getContributionItems() { IWorkbenchPart part = UIUtils.getActiveWorkbenchWindow().getActivePage().getActivePart(); IStructuredSelection structuredSelection = NavigatorUtils.getSelectionFromPart(part); if (structuredSelection == null || structuredSelection.isEmpty()) { @@ -85,60 +87,30 @@ public class GenerateSQLContributor extends CompoundContributionItem { makeResultSetContributions(menu, (IResultSetSelection) structuredSelection); } else { - List entities = new ArrayList<>(); - List scriptObjects = new ArrayList<>(); - for (Object sel : structuredSelection.toArray()) { - final DBSObject object = RuntimeUtils.getObjectAdapter(sel, DBSObject.class); - if (object instanceof DBSEntity) { - entities.add((DBSEntity) object); + List objects = new ArrayList<>(); + for (Object obj : structuredSelection.toList()) { + if (obj instanceof DBSWrapper) { + objects.add(((DBSWrapper) obj).getObject()); + } else if (obj instanceof DBPObject) { + objects.add((DBPObject) obj); } - if (object instanceof DBPScriptObject) { - scriptObjects.add((DBPScriptObject) object); - } - } - if (!entities.isEmpty()) { - makeTableContributions(menu, entities); - } - if (!scriptObjects.isEmpty()) { - makeScriptContributions(menu, scriptObjects); } - } - return menu.toArray(new IContributionItem[0]); - } - - private void makeTableContributions(List menu, final List entities) - { - // Table - menu.add(makeAction("SELECT ", SELECT_GENERATOR(entities, true))); - menu.add(makeAction("INSERT ", INSERT_GENERATOR(entities))); - menu.add(makeAction("UPDATE ", UPDATE_GENERATOR(entities))); - menu.add(makeAction("DELETE ", DELETE_GENERATOR(entities))); - menu.add(makeAction("MERGE", MERGE_GENERATOR(entities))); - if (entities.size() > 1) { - menu.add(new Separator()); - menu.add(makeAction("JOIN", JOIN_GENERATOR(entities))); - } - } + List generators = SQLGeneratorConfigurationRegistry.getInstance().getApplicableGenerators(objects, structuredSelection); + int lastGrand = 0; + for (SQLGeneratorDescriptor gen : generators) { + int order = gen.getOrder(); + if (order > 0 && order / 1000 > lastGrand) { + menu.add(new Separator()); + } + lastGrand = order / 1000; - private void makeScriptContributions(List menu, final List scriptObjects) - { - if (menu.size() > 0) { - menu.add(new Separator()); - } - List procedures = new ArrayList<>(); - for (DBPScriptObject so : scriptObjects) { - if (so instanceof DBSProcedure) { - procedures.add((DBSProcedure) so); + menu.add(makeAction(gen.getLabel(), gen, objects)); } } - if (!procedures.isEmpty()) { - menu.add(makeAction("CALL", CALL_GENERATOR(procedures))); - } - menu.add(makeAction("DDL", new SQLGeneratorDDL(scriptObjects))); + return menu.toArray(new IContributionItem[0]); } - private void makeResultSetContributions(List menu, IResultSetSelection rss) - { + private void makeResultSetContributions(List menu, IResultSetSelection rss) { final IResultSetController rsv = rss.getController(); DBSDataContainer dataContainer = rsv.getDataContainer(); final List visibleAttributes = rsv.getModel().getVisibleAttributes(); @@ -147,15 +119,15 @@ public class GenerateSQLContributor extends CompoundContributionItem { final List selectedRows = new ArrayList<>(rss.getSelectedRows()); if (!CommonUtils.isEmpty(selectedRows)) { - menu.add(makeAction("SELECT .. WHERE .. =", new SQLGeneratorSelectFromData(dataContainer, rsv, selectedRows, entity))); - if (selectedRows.size() > 1) { - menu.add(makeAction("SELECT .. WHERE .. IN", new SQLGeneratorSelectManyFromData(dataContainer, rsv, entity, selectedRows))); + List objects = new ArrayList<>(); + objects.add(rsv); + List generators = SQLGeneratorConfigurationRegistry.getInstance().getApplicableGenerators(objects, rsv); + for (SQLGeneratorDescriptor gen : generators) { + if (gen.isMultiObject() && selectedRows.size() < 2) { + continue; + } + menu.add(makeAction(gen.getLabel(), gen, objects)); } - menu.add(makeAction("INSERT", new SQLGeneratorInsertFromData(dataContainer, rsv, selectedRows, entity))); - - menu.add(makeAction("UPDATE", new SQLGeneratorUpdateFromData(dataContainer, rsv, selectedRows, entity))); - - menu.add(makeAction("DELETE by Unique Key", new SQLGeneratorDeleteFromData(dataContainer, rsv, selectedRows, entity))); } } else { //if (dataContainer != null && !visibleAttributes.isEmpty() && entity != null) @@ -174,13 +146,11 @@ public class GenerateSQLContributor extends CompoundContributionItem { return object instanceof DBSTable || object instanceof DBPScriptObject; } - private static ContributionItem makeAction(String text, final SQLGenerator sqlGenerator) - { + private static ContributionItem makeAction(String text, SQLGeneratorDescriptor sqlGenerator, List objects) { return new ActionContributionItem( new Action(text, DBeaverIcons.getImageDescriptor(UIIcon.SQL_TEXT)) { @Override - public void run() - { + public void run() { IWorkbenchPage activePage = UIUtils.getActiveWorkbenchWindow().getActivePage(); IEditorPart activeEditor = activePage.getActiveEditor(); @@ -200,14 +170,21 @@ public class GenerateSQLContributor extends CompoundContributionItem { } if (executionContext != null) { + SQLGenerator generator; + try { + generator = sqlGenerator.createGenerator(objects); + } catch (DBException e) { + DBWorkbench.getPlatformUI().showError("Generator create", "Can't create SQL generator '" + sqlGenerator.getId() + "'", e); + return; + } ViewSQLDialog dialog = new GenerateSQLDialog( activePage.getActivePart().getSite(), executionContext, - sqlGenerator); + generator); dialog.open(); } } - }); + }); } private static class GenerateSQLDialog extends ViewSQLDialog { @@ -230,7 +207,7 @@ public class GenerateSQLContributor extends CompoundContributionItem { getDialogBoundsSettings().getBoolean(PROP_USE_FQ_NAMES)); sqlGenerator.setCompactSQL( getDialogBoundsSettings().get(PROP_USE_COMPACT_SQL) != null && - getDialogBoundsSettings().getBoolean(PROP_USE_COMPACT_SQL)); + getDialogBoundsSettings().getBoolean(PROP_USE_COMPACT_SQL)); UIUtils.runInUI(sqlGenerator); Object sql = sqlGenerator.getResult(); if (sql != null) { @@ -280,75 +257,17 @@ public class GenerateSQLContributor extends CompoundContributionItem { @NotNull public static SQLGenerator SELECT_GENERATOR(final List entities, final boolean columnList) { - return new SQLGeneratorSelect(entities, columnList); - } - - @NotNull - private SQLGenerator DELETE_GENERATOR(final List entities) { - return new SQLGeneratorDelete(entities); - } - - @NotNull - private static SQLGenerator INSERT_GENERATOR(final List entities) { - return new SQLGeneratorInsert(entities); - } - - @NotNull - private static SQLGenerator UPDATE_GENERATOR(final List entities) { - return new SQLGeneratorUpdate(entities); - } - - @NotNull - private static SQLGenerator MERGE_GENERATOR(final List entities) { - return new SQLGeneratorMerge(entities); - } - - @NotNull - private static SQLGenerator JOIN_GENERATOR(final List entities) { - return new SQLGeneratorJoin(entities); + SQLGeneratorSelect generatorSelect = new SQLGeneratorSelect(); + generatorSelect.initGenerator(entities); + generatorSelect.setColumnList(columnList); + return generatorSelect; } @NotNull public static SQLGenerator CALL_GENERATOR(final List entities) { - return new SQLGeneratorProcedureCall(entities); - } - - private static class SQLGeneratorSelectFromData extends ResultSetAnalysisRunner { - private final IResultSetController rsv; - private final List selectedRows; - private final DBSEntity entity; - - public SQLGeneratorSelectFromData(DBSDataContainer dataContainer, IResultSetController rsv, List selectedRows, DBSEntity entity) { - super(dataContainer.getDataSource(), rsv.getModel()); - this.rsv = rsv; - this.selectedRows = selectedRows; - this.entity = entity; - } - - @Override - public void generateSQL(DBRProgressMonitor monitor, StringBuilder sql, ResultSetModel object) { - for (ResultSetRow firstRow : selectedRows) { - - Collection keyAttributes = getKeyAttributes(monitor, object); - sql.append("SELECT "); - boolean hasAttr = false; - for (DBSAttributeBase attr : getAllAttributes(monitor, object)) { - if (hasAttr) sql.append(", "); - sql.append(DBUtils.getObjectFullName(attr, DBPEvaluationContext.DML)); - hasAttr = true; - } - sql.append(getLineSeparator()).append("FROM ").append(getEntityName(entity)); - sql.append(getLineSeparator()).append("WHERE "); - hasAttr = false; - for (DBDAttributeBinding binding : keyAttributes) { - if (hasAttr) sql.append(" AND "); - appendValueCondition(rsv, sql, binding, firstRow); - hasAttr = true; - } - sql.append(";\n"); - } - } - + SQLGeneratorProcedureCall procedureCall = new SQLGeneratorProcedureCall(); + procedureCall.initGenerator(entities); + return procedureCall; } }