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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{
+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 extends DBSAttributeBase> getAllAttributes(DBRProgressMonitor monitor, ResultSetModel object) {
- return object.getVisibleAttributes();
+ protected Collection extends DBSAttributeBase> 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 extends DBSAttributeBase> 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 extends DBSAttributeBase> 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;
}
}