提交 f7786200 编写于 作者: S Serge Rider 提交者: GitHub

Merge pull request #2696 from dbeaver/1808-export-selected-columns-rows-only

#1808 Export selected columns and rows only

Former-commit-id: b7c7b569
......@@ -414,6 +414,8 @@ public class CoreMessages extends NLS {
public static String data_transfer_wizard_output_checkbox_new_connection;
public static String data_transfer_wizard_output_checkbox_open_folder;
public static String data_transfer_wizard_output_checkbox_select_row_count;
public static String data_transfer_wizard_output_checkbox_selected_columns_only;
public static String data_transfer_wizard_output_checkbox_selected_rows_only;
public static String data_transfer_wizard_output_combo_extract_type_item_by_segments;
public static String data_transfer_wizard_output_combo_extract_type_item_single_query;
public static String data_transfer_wizard_output_description;
......
......@@ -282,6 +282,8 @@ data_transfer_wizard_output_checkbox_compress = Compress
data_transfer_wizard_output_checkbox_new_connection = Open new connection(s)
data_transfer_wizard_output_checkbox_open_folder = Open output folder at end
data_transfer_wizard_output_checkbox_select_row_count = Select row count
data_transfer_wizard_output_checkbox_selected_columns_only = Selected columns only
data_transfer_wizard_output_checkbox_selected_rows_only = Selected rows only
data_transfer_wizard_output_combo_extract_type_item_by_segments = By segments
data_transfer_wizard_output_combo_extract_type_item_single_query = Single query
data_transfer_wizard_output_description = Configure export output parameters
......
......@@ -40,6 +40,10 @@ public class DatabaseProducerPageExtractSettings extends ActiveWizardPage<DataTr
private Text segmentSizeText;
private Button newConnectionCheckbox;
private Button rowCountCheckbox;
private Label selectedColumnsOnlyLabel;
private Button selectedColumnsOnlyCheckbox;
private Label selectedRowsOnlyLabel;
private Button selectedRowsOnlyCheckbox;
public DatabaseProducerPageExtractSettings() {
super("Extraction settings");
......@@ -84,7 +88,9 @@ public class DatabaseProducerPageExtractSettings extends ActiveWizardPage<DataTr
}
threadsNumText.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING, GridData.VERTICAL_ALIGN_BEGINNING, false, false, 3, 1));
GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING, GridData.VERTICAL_ALIGN_BEGINNING, false, false, 3, 1);
{
UIUtils.createControlLabel(generalSettings, CoreMessages.data_transfer_wizard_output_label_extract_type);
rowsExtractType = new Combo(generalSettings, SWT.DROP_DOWN | SWT.READ_ONLY);
rowsExtractType.setItems(new String[] {
......@@ -125,7 +131,7 @@ public class DatabaseProducerPageExtractSettings extends ActiveWizardPage<DataTr
settings.setOpenNewConnections(newConnectionCheckbox.getSelection());
}
});
newConnectionCheckbox.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING, GridData.VERTICAL_ALIGN_BEGINNING, false, false, 3, 1));
newConnectionCheckbox.setLayoutData(gridData);
rowCountCheckbox = UIUtils.createLabelCheckbox(generalSettings, CoreMessages.data_transfer_wizard_output_checkbox_select_row_count, true);
rowCountCheckbox.addSelectionListener(new SelectionAdapter() {
......@@ -134,7 +140,33 @@ public class DatabaseProducerPageExtractSettings extends ActiveWizardPage<DataTr
settings.setQueryRowCount(rowCountCheckbox.getSelection());
}
});
rowCountCheckbox.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING, GridData.VERTICAL_ALIGN_BEGINNING, false, false, 3, 1));
rowCountCheckbox.setLayoutData(gridData);
boolean hasSelection = getWizard().getCurrentSelection() != null && !getWizard().getCurrentSelection().isEmpty();
selectedColumnsOnlyLabel = UIUtils.createControlLabel(generalSettings, CoreMessages.data_transfer_wizard_output_checkbox_selected_columns_only);
selectedColumnsOnlyCheckbox = new Button(generalSettings, SWT.CHECK);
selectedColumnsOnlyCheckbox.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
settings.setSelectedRowsOnly(selectedColumnsOnlyCheckbox.getSelection());
}
});
selectedColumnsOnlyLabel.setEnabled(hasSelection);
selectedColumnsOnlyCheckbox.setEnabled(hasSelection);
selectedColumnsOnlyCheckbox.setLayoutData(gridData);
selectedRowsOnlyLabel = UIUtils.createControlLabel(generalSettings, CoreMessages.data_transfer_wizard_output_checkbox_selected_rows_only);
selectedRowsOnlyCheckbox = new Button(generalSettings, SWT.CHECK);
selectedRowsOnlyCheckbox.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
settings.setSelectedRowsOnly(selectedRowsOnlyCheckbox.getSelection());
}
});
selectedRowsOnlyLabel.setEnabled(hasSelection);
selectedRowsOnlyCheckbox.setEnabled(hasSelection);
selectedRowsOnlyCheckbox.setLayoutData(gridData);
}
setControl(composite);
......
......@@ -38,6 +38,8 @@ public class DatabaseProducerSettings implements IDataTransferSettings {
private boolean openNewConnections = true;
private boolean queryRowCount = true;
private boolean selectedRowsOnly = false;
private boolean selectedColumnsOnly = false;
private ExtractType extractType = ExtractType.SINGLE_QUERY;
public DatabaseProducerSettings()
......@@ -66,6 +68,22 @@ public class DatabaseProducerSettings implements IDataTransferSettings {
this.queryRowCount = queryRowCount;
}
public boolean isSelectedRowsOnly() {
return selectedRowsOnly;
}
public void setSelectedRowsOnly(boolean selectedRowsOnly) {
this.selectedRowsOnly = selectedRowsOnly;
}
public boolean isSelectedColumnsOnly() {
return selectedColumnsOnly;
}
public void setSelectedColumnsOnly(boolean selectedColumnsOnly) {
this.selectedColumnsOnly = selectedColumnsOnly;
}
public boolean isOpenNewConnections()
{
return openNewConnections;
......
......@@ -31,6 +31,7 @@ import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSDataContainer;
import org.jkiss.dbeaver.tools.transfer.IDataTransferConsumer;
import org.jkiss.dbeaver.tools.transfer.IDataTransferProducer;
import org.jkiss.dbeaver.ui.controls.resultset.ResultSetDataContainer;
/**
* Data container transfer producer
......@@ -68,8 +69,15 @@ public class DatabaseTransferProducer implements IDataTransferProducer<DatabaseP
DatabaseProducerSettings settings)
throws DBException {
String contextTask = CoreMessages.data_transfer_wizard_job_task_export;
DBPDataSource dataSource = getSourceObject().getDataSource();
assert (dataSource != null);
if (dataContainer instanceof ResultSetDataContainer) {
((ResultSetDataContainer) dataContainer).getOptions().setExportSelectedRows(settings.isSelectedRowsOnly());
((ResultSetDataContainer) dataContainer).getOptions().setExportSelectedColumns(settings.isSelectedColumnsOnly());
}
boolean newConnection = settings.isOpenNewConnections();
boolean forceDataReadTransactions = Boolean.TRUE.equals(dataSource.getDataSourceFeature(FEATURE_FORCE_TRANSACTIONS));
DBCExecutionContext context = newConnection ?
......
......@@ -41,12 +41,17 @@ public class DataTransferWizard extends Wizard implements IExportWizard {
private static final String RS_EXPORT_WIZARD_DIALOG_SETTINGS = "DataTransfer";//$NON-NLS-1$
private DataTransferSettings settings;
private IStructuredSelection currentSelection;
public DataTransferWizard(@Nullable IDataTransferProducer[] producers, @Nullable IDataTransferConsumer[] consumers) {
this.settings = new DataTransferSettings(producers, consumers);
loadSettings();
}
public IStructuredSelection getCurrentSelection() {
return currentSelection;
}
private void loadSettings()
{
IDialogSettings section = UIUtils.getDialogSettings(RS_EXPORT_WIZARD_DIALOG_SETTINGS);
......@@ -79,6 +84,7 @@ public class DataTransferWizard extends Wizard implements IExportWizard {
public void init(IWorkbench workbench, IStructuredSelection currentSelection) {
setWindowTitle(CoreMessages.data_transfer_wizard_name);
setNeedsProgressMonitor(true);
this.currentSelection = currentSelection;
}
@Nullable
......
......@@ -414,11 +414,25 @@ public class ResultSetCommandHandler extends AbstractHandler {
break;
}
case CMD_EXPORT: {
List<Long> selectedRows = new ArrayList<>();
for (ResultSetRow selectedRow : rsv.getSelection().getSelectedRows()) {
selectedRows.add(Long.valueOf(selectedRow.getRowNumber()));
}
List<String> selectedAttributes = new ArrayList<>();
for (DBDAttributeBinding attributeBinding : rsv.getSelection().getSelectedAttributes()) {
selectedAttributes.add(attributeBinding.getName());
}
ResultSetDataContainerOptions options = new ResultSetDataContainerOptions();
options.setSelectedRows(selectedRows);
options.setSelectedColumns(selectedAttributes);
ResultSetDataContainer dataContainer = new ResultSetDataContainer(rsv.getDataContainer(), rsv.getModel(), options);
ActiveWizardDialog dialog = new ActiveWizardDialog(
HandlerUtil.getActiveWorkbenchWindow(event),
new DataTransferWizard(
new IDataTransferProducer[]{
new DatabaseTransferProducer(rsv.getDataContainer(), rsv.getModel().getDataFilter())},
new IDataTransferProducer[] {
new DatabaseTransferProducer(dataContainer, rsv.getModel().getDataFilter())},
null
),
rsv.getSelection()
......
......@@ -26,6 +26,7 @@ import org.jkiss.dbeaver.model.data.DBDValueMeta;
import org.jkiss.dbeaver.model.exec.*;
import org.jkiss.dbeaver.model.struct.DBSDataContainer;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.utils.CommonUtils;
import java.util.ArrayList;
import java.util.List;
......@@ -40,10 +41,12 @@ public class ResultSetDataContainer implements DBSDataContainer {
private final DBSDataContainer dataContainer;
private final ResultSetModel model;
private ResultSetDataContainerOptions options;
public ResultSetDataContainer(DBSDataContainer dataContainer, ResultSetModel model) {
public ResultSetDataContainer(DBSDataContainer dataContainer, ResultSetModel model, ResultSetDataContainerOptions options) {
this.dataContainer = dataContainer;
this.model = model;
this.options = options;
}
@Override
......@@ -66,40 +69,63 @@ public class ResultSetDataContainer implements DBSDataContainer {
return DATA_SELECT | DATA_COUNT;
}
public ResultSetDataContainerOptions getOptions() {
return options;
}
@Override
public DBCStatistics readData(DBCExecutionSource source, DBCSession session, DBDDataReceiver dataReceiver, DBDDataFilter dataFilter, long firstRow, long maxRows, long flags) throws DBCException {
DBCStatistics statistics = new DBCStatistics();
long startTime = System.currentTimeMillis();
if (proceedSelectedRowsOnly() || proceedSelectedColumnsOnly()) {
statistics.setExecuteTime(System.currentTimeMillis() - startTime);
long startTime = System.currentTimeMillis();
DBCStatistics statistics = new DBCStatistics();
statistics.setExecuteTime(System.currentTimeMillis() - startTime);
//LocalSta
ModelResultSet resultSet = new ModelResultSet(session);
long resultCount = 0;
try {
dataReceiver.fetchStart(session, resultSet, firstRow, maxRows);
while (resultSet.nextRow()) {
resultCount++;
dataReceiver.fetchRow(session, resultSet);
}
} finally {
//LocalSta
ModelResultSet resultSet = new ModelResultSet(session);
long resultCount = 0;
try {
dataReceiver.fetchEnd(session, resultSet);
} catch (DBCException e) {
log.error("Error while finishing result set fetch", e); //$NON-NLS-1$
dataReceiver.fetchStart(session, resultSet, firstRow, maxRows);
while (resultSet.nextRow()) {
if (!proceedSelectedRowsOnly() || options.getSelectedRows().contains(resultCount)) {
dataReceiver.fetchRow(session, resultSet);
}
resultCount++;
}
} finally {
try {
dataReceiver.fetchEnd(session, resultSet);
} catch (DBCException e) {
log.error("Error while finishing result set fetch", e); //$NON-NLS-1$
}
resultSet.close();
dataReceiver.close();
}
resultSet.close();
dataReceiver.close();
statistics.setFetchTime(System.currentTimeMillis() - startTime);
statistics.setRowsFetched(resultCount);
return statistics;
} else {
return dataContainer.readData(source, session, dataReceiver, dataFilter, firstRow, maxRows, flags);
}
statistics.setFetchTime(System.currentTimeMillis() - startTime);
statistics.setRowsFetched(resultCount);
return statistics;
}
private boolean proceedSelectedColumnsOnly() {
return options.isExportSelectedColumns() && !CommonUtils.isEmpty(options.getSelectedColumns());
}
private boolean proceedSelectedRowsOnly() {
return options.isExportSelectedRows() && !CommonUtils.isEmpty(options.getSelectedRows());
}
@Override
public long countData(DBCExecutionSource source, DBCSession session, DBDDataFilter dataFilter) throws DBCException {
return model.getRowCount();
if (proceedSelectedRowsOnly()) {
return options.getSelectedRows().size();
} else if (proceedSelectedColumnsOnly()) {
return model.getRowCount();
} else {
return dataContainer.countData(source, session, dataFilter);
}
}
@Override
......@@ -185,10 +211,14 @@ public class ResultSetDataContainer implements DBSDataContainer {
return new DBCResultSetMetaData() {
@Override
public List<DBCAttributeMetaData> getAttributes() {
DBDAttributeBinding[] attributes = model.getAttributes();
List<DBCAttributeMetaData> meta = new ArrayList<>(attributes.length);
List<DBDAttributeBinding> attributes = model.getVisibleAttributes();
List<DBCAttributeMetaData> meta = new ArrayList<>(attributes.size());
boolean selectedColumnsOnly = proceedSelectedColumnsOnly();
for (DBDAttributeBinding attribute : attributes) {
meta.add(attribute.getMetaAttribute());
DBCAttributeMetaData metaAttribute = attribute.getMetaAttribute();
if (!selectedColumnsOnly || options.getSelectedColumns().contains(metaAttribute.getName())) {
meta.add(metaAttribute);
}
}
return meta;
}
......
package org.jkiss.dbeaver.ui.controls.resultset;
import java.util.List;
public class ResultSetDataContainerOptions {
private boolean exportSelectedRows;
private List<Long> selectedRows;
private boolean exportSelectedColumns;
private List<String> selectedColumns;
public boolean isExportSelectedRows() {
return exportSelectedRows;
}
public void setExportSelectedRows(boolean exportSelectedRows) {
this.exportSelectedRows = exportSelectedRows;
}
public List<Long> getSelectedRows() {
return selectedRows;
}
public void setSelectedRows(List<Long> selectedRows) {
this.selectedRows = selectedRows;
}
public boolean isExportSelectedColumns() {
return exportSelectedColumns;
}
public void setExportSelectedColumns(boolean exportSelectedColumns) {
this.exportSelectedColumns = exportSelectedColumns;
}
public List<String> getSelectedColumns() {
return selectedColumns;
}
public void setSelectedColumns(List<String> selectedColumns) {
this.selectedColumns = selectedColumns;
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册