Repository: metamodel Updated Branches: refs/heads/5.x c5cc9febd -> c51994c1f
First attempts at making the API change for METAMODEL-6 Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/a15ca724 Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/a15ca724 Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/a15ca724 Branch: refs/heads/5.x Commit: a15ca724b5c4556ebb65700b4d50db878b6b159c Parents: 2d291f4 Author: Kasper Sørensen <i.am.kasper.soren...@gmail.com> Authored: Wed Dec 9 13:14:07 2015 +0100 Committer: Kasper Sørensen <i.am.kasper.soren...@gmail.com> Committed: Wed Dec 9 16:06:59 2015 +0100 ---------------------------------------------------------------------- .../metamodel/AbstractUpdateCallback.java | 10 ++- .../apache/metamodel/DefaultUpdateSummary.java | 72 ++++++++++++++++++++ .../org/apache/metamodel/UpdateSummary.java | 48 +++++++++++++ .../apache/metamodel/UpdateableDataContext.java | 25 +++---- .../intercept/InterceptableDataContext.java | 10 +-- .../metamodel/MockUpdateableDataContext.java | 10 ++- .../metamodel/couchdb/CouchDbDataContext.java | 6 +- .../apache/metamodel/csv/CsvDataContext.java | 7 +- .../nativeclient/ElasticSearchDataContext.java | 18 +++-- .../rest/ElasticSearchRestDataContext.java | 58 +++++++++------- .../metamodel/excel/ExcelDataContext.java | 6 +- .../apache/metamodel/jdbc/JdbcDataContext.java | 5 +- .../metamodel/mongodb/MongoDbDataContext.java | 11 +-- .../apache/metamodel/pojo/PojoDataContext.java | 6 +- .../salesforce/SalesforceDataContext.java | 5 +- 15 files changed, 227 insertions(+), 70 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metamodel/blob/a15ca724/core/src/main/java/org/apache/metamodel/AbstractUpdateCallback.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/AbstractUpdateCallback.java b/core/src/main/java/org/apache/metamodel/AbstractUpdateCallback.java index 472fb6f..20842a6 100644 --- a/core/src/main/java/org/apache/metamodel/AbstractUpdateCallback.java +++ b/core/src/main/java/org/apache/metamodel/AbstractUpdateCallback.java @@ -43,21 +43,21 @@ public abstract class AbstractUpdateCallback implements UpdateCallback { @Override public TableCreationBuilder createTable(String schemaName, String tableName) throws IllegalArgumentException, IllegalStateException { - Schema schema = getSchema(schemaName); + final Schema schema = getSchema(schemaName); return createTable(schema, tableName); } @Override public TableDropBuilder dropTable(String schemaName, String tableName) throws IllegalArgumentException, IllegalStateException, UnsupportedOperationException { - Table table = getTable(schemaName, tableName); + final Table table = getTable(schemaName, tableName); return dropTable(table); } @Override public TableDropBuilder dropTable(Schema schema, String tableName) throws IllegalArgumentException, IllegalStateException, UnsupportedOperationException { - Table table = schema.getTableByName(tableName); + final Table table = schema.getTableByName(tableName); if (table == null) { throw new IllegalArgumentException("Nu such table '" + tableName + "' found in schema: " + schema + ". Available tables are: " + Arrays.toString(schema.getTableNames())); @@ -159,4 +159,8 @@ public abstract class AbstractUpdateCallback implements UpdateCallback { UnsupportedOperationException { return new DeleteAndInsertBuilder(this, table); } + + public UpdateSummary getUpdateSummary() { + return DefaultUpdateSummary.unknownUpdates(); + } } http://git-wip-us.apache.org/repos/asf/metamodel/blob/a15ca724/core/src/main/java/org/apache/metamodel/DefaultUpdateSummary.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/DefaultUpdateSummary.java b/core/src/main/java/org/apache/metamodel/DefaultUpdateSummary.java new file mode 100644 index 0000000..9b02f22 --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/DefaultUpdateSummary.java @@ -0,0 +1,72 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.metamodel; + +/** + * Default implementation of {@link UpdateSummary}. + */ +public class DefaultUpdateSummary implements UpdateSummary { + + private static final UpdateSummary UNKNOWN_UPDATES = new DefaultUpdateSummary(null, null, null, null); + + /** + * Gets an {@link UpdateSummary} object to return when the extent of the + * updates are unknown. + * + * @return a {@link UpdateSummary} object without any knowledge of updates + * performed. + */ + public static UpdateSummary unknownUpdates() { + return UNKNOWN_UPDATES; + } + + private final Integer _insertedRows; + private final Integer _updatedRows; + private final Integer _deletedRows; + private final Iterable<Object> _generatedKeys; + + public DefaultUpdateSummary(Integer insertedRows, Integer updatedRows, Integer deletedRows, + Iterable<Object> generatedKeys) { + _insertedRows = insertedRows; + _updatedRows = updatedRows; + _deletedRows = deletedRows; + _generatedKeys = generatedKeys; + } + + @Override + public Integer getInsertedRows() { + return _insertedRows; + } + + @Override + public Integer getUpdatedRows() { + return _updatedRows; + } + + @Override + public Integer getDeletedRows() { + return _deletedRows; + } + + @Override + public Iterable<Object> getGeneratedKeys() { + return _generatedKeys; + } + +} http://git-wip-us.apache.org/repos/asf/metamodel/blob/a15ca724/core/src/main/java/org/apache/metamodel/UpdateSummary.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/UpdateSummary.java b/core/src/main/java/org/apache/metamodel/UpdateSummary.java new file mode 100644 index 0000000..57ca52f --- /dev/null +++ b/core/src/main/java/org/apache/metamodel/UpdateSummary.java @@ -0,0 +1,48 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.metamodel; + +/** + * Represents a summary of changes made in a given + * {@link UpdateableDataContext#executeUpdate(UpdateScript)} call. + * + * The amount of information available from an update varies a lot between + * different implementations of {@link UpdateableDataContext}. This interface + * represents the most common elements of interest, but not all elements may be + * available for a given update. For this reason any method call on this + * interface should be considered not guaranteed to return a value (so expect + * nulls to represent "not known/available"). + */ +public interface UpdateSummary { + + public Integer getInsertedRows(); + + public Integer getUpdatedRows(); + + public Integer getDeletedRows(); + + /** + * Gets a collection of keys that was generated as part of the update - + * typically because INSERTs where executed on an underlying database which + * generated record IDs for each insert. + * + * @return a collection of generated keys, or null if not available. + */ + public Iterable<Object> getGeneratedKeys(); +} http://git-wip-us.apache.org/repos/asf/metamodel/blob/a15ca724/core/src/main/java/org/apache/metamodel/UpdateableDataContext.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/UpdateableDataContext.java b/core/src/main/java/org/apache/metamodel/UpdateableDataContext.java index 09bd234..6c369ea 100644 --- a/core/src/main/java/org/apache/metamodel/UpdateableDataContext.java +++ b/core/src/main/java/org/apache/metamodel/UpdateableDataContext.java @@ -23,17 +23,18 @@ package org.apache.metamodel; */ public interface UpdateableDataContext extends DataContext { - /** - * Submits an {@link UpdateScript} for execution on the {@link DataContext}. - * - * Since implementations of the {@link DataContext} vary quite a lot, there - * is no golden rule as to how an update script will be executed. But the - * implementors should strive towards handling an {@link UpdateScript} as a - * single transactional change to the data store. - * - * @param update - * the update script to execute - */ - public void executeUpdate(UpdateScript update); + /** + * Submits an {@link UpdateScript} for execution on the {@link DataContext}. + * + * Since implementations of the {@link DataContext} vary quite a lot, there + * is no golden rule as to how an update script will be executed. But the + * implementors should strive towards handling an {@link UpdateScript} as a + * single transactional change to the data store. + * + * @param update + * the update script to execute + * @return a summary of the updates performed + */ + public UpdateSummary executeUpdate(UpdateScript update); } http://git-wip-us.apache.org/repos/asf/metamodel/blob/a15ca724/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java b/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java index a356b9a..5d482b1 100644 --- a/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java +++ b/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java @@ -21,6 +21,7 @@ package org.apache.metamodel.intercept; import org.apache.metamodel.DataContext; import org.apache.metamodel.MetaModelException; import org.apache.metamodel.UpdateScript; +import org.apache.metamodel.UpdateSummary; import org.apache.metamodel.UpdateableDataContext; import org.apache.metamodel.create.TableCreationBuilder; import org.apache.metamodel.data.DataSet; @@ -241,7 +242,7 @@ public class InterceptableDataContext implements UpdateableDataContext { } @Override - public void executeUpdate(UpdateScript update) { + public UpdateSummary executeUpdate(UpdateScript update) { if (!(_delegate instanceof UpdateableDataContext)) { throw new UnsupportedOperationException("Delegate is not an UpdateableDataContext"); } @@ -250,14 +251,13 @@ public class InterceptableDataContext implements UpdateableDataContext { if (_tableCreationInterceptors.isEmpty() && _tableDropInterceptors.isEmpty() && _rowInsertionInterceptors.isEmpty() && _rowUpdationInterceptors.isEmpty() && _rowDeletionInterceptors.isEmpty()) { - delegate.executeUpdate(update); - return; + return delegate.executeUpdate(update); } - UpdateScript interceptableUpdateScript = new InterceptableUpdateScript(this, update, + final UpdateScript interceptableUpdateScript = new InterceptableUpdateScript(this, update, _tableCreationInterceptors, _tableDropInterceptors, _rowInsertionInterceptors, _rowUpdationInterceptors, _rowDeletionInterceptors); - delegate.executeUpdate(interceptableUpdateScript); + return delegate.executeUpdate(interceptableUpdateScript); } @Override http://git-wip-us.apache.org/repos/asf/metamodel/blob/a15ca724/core/src/test/java/org/apache/metamodel/MockUpdateableDataContext.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/metamodel/MockUpdateableDataContext.java b/core/src/test/java/org/apache/metamodel/MockUpdateableDataContext.java index b006a7c..8d6d48e 100644 --- a/core/src/test/java/org/apache/metamodel/MockUpdateableDataContext.java +++ b/core/src/test/java/org/apache/metamodel/MockUpdateableDataContext.java @@ -100,8 +100,8 @@ public class MockUpdateableDataContext extends QueryPostprocessDataContext imple } @Override - public void executeUpdate(UpdateScript update) { - update.run(new AbstractUpdateCallback(this) { + public UpdateSummary executeUpdate(UpdateScript update) { + final AbstractUpdateCallback callback = new AbstractUpdateCallback(this) { @Override public boolean isDeleteSupported() { @@ -153,7 +153,11 @@ public class MockUpdateableDataContext extends QueryPostprocessDataContext imple IllegalStateException { throw new UnsupportedOperationException(); } - }); + }; + + update.run(callback); + + return callback.getUpdateSummary(); } private void delete(List<FilterItem> whereItems) { http://git-wip-us.apache.org/repos/asf/metamodel/blob/a15ca724/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataContext.java ---------------------------------------------------------------------- diff --git a/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataContext.java b/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataContext.java index 33cab20..f98fa81 100644 --- a/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataContext.java +++ b/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataContext.java @@ -24,6 +24,7 @@ import org.apache.metamodel.MetaModelException; import org.apache.metamodel.MetaModelHelper; import org.apache.metamodel.QueryPostprocessDataContext; import org.apache.metamodel.UpdateScript; +import org.apache.metamodel.UpdateSummary; import org.apache.metamodel.UpdateableDataContext; import org.apache.metamodel.data.DataSet; import org.apache.metamodel.data.DocumentSource; @@ -167,13 +168,14 @@ public class CouchDbDataContext extends QueryPostprocessDataContext implements U } @Override - public void executeUpdate(UpdateScript script) { - CouchDbUpdateCallback callback = new CouchDbUpdateCallback(this); + public UpdateSummary executeUpdate(UpdateScript script) { + final CouchDbUpdateCallback callback = new CouchDbUpdateCallback(this); try { script.run(callback); } finally { callback.close(); } + return callback.getUpdateSummary(); } @Override http://git-wip-us.apache.org/repos/asf/metamodel/blob/a15ca724/csv/src/main/java/org/apache/metamodel/csv/CsvDataContext.java ---------------------------------------------------------------------- diff --git a/csv/src/main/java/org/apache/metamodel/csv/CsvDataContext.java b/csv/src/main/java/org/apache/metamodel/csv/CsvDataContext.java index 3787453..d7a8b47 100644 --- a/csv/src/main/java/org/apache/metamodel/csv/CsvDataContext.java +++ b/csv/src/main/java/org/apache/metamodel/csv/CsvDataContext.java @@ -33,6 +33,7 @@ import java.util.List; import org.apache.metamodel.MetaModelException; import org.apache.metamodel.QueryPostprocessDataContext; import org.apache.metamodel.UpdateScript; +import org.apache.metamodel.UpdateSummary; import org.apache.metamodel.UpdateableDataContext; import org.apache.metamodel.data.DataSet; import org.apache.metamodel.data.EmptyDataSet; @@ -423,9 +424,10 @@ public final class CsvDataContext extends QueryPostprocessDataContext implements } @Override - public void executeUpdate(UpdateScript update) { + public UpdateSummary executeUpdate(UpdateScript update) { checkWritable(); - CsvUpdateCallback callback = new CsvUpdateCallback(this); + + final CsvUpdateCallback callback = new CsvUpdateCallback(this); synchronized (WRITE_LOCK) { try { update.run(callback); @@ -433,5 +435,6 @@ public final class CsvDataContext extends QueryPostprocessDataContext implements callback.close(); } } + return callback.getUpdateSummary(); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/metamodel/blob/a15ca724/elasticsearch/native/src/main/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataContext.java ---------------------------------------------------------------------- diff --git a/elasticsearch/native/src/main/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataContext.java b/elasticsearch/native/src/main/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataContext.java index 8232394..f3c5875 100644 --- a/elasticsearch/native/src/main/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataContext.java +++ b/elasticsearch/native/src/main/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataContext.java @@ -29,6 +29,7 @@ import org.apache.metamodel.DataContext; import org.apache.metamodel.MetaModelException; import org.apache.metamodel.QueryPostprocessDataContext; import org.apache.metamodel.UpdateScript; +import org.apache.metamodel.UpdateSummary; import org.apache.metamodel.UpdateableDataContext; import org.apache.metamodel.data.DataSet; import org.apache.metamodel.data.DataSetHeader; @@ -90,7 +91,8 @@ public class ElasticSearchDataContext extends QueryPostprocessDataContext implem private final Client elasticSearchClient; private final String indexName; - // Table definitions that are set from the beginning, not supposed to be changed. + // Table definitions that are set from the beginning, not supposed to be + // changed. private final List<SimpleTableDef> staticTableDefinitions; // Table definitions that are discovered, these can change @@ -124,8 +126,8 @@ public class ElasticSearchDataContext extends QueryPostprocessDataContext implem /** * Constructs a {@link ElasticSearchDataContext} and automatically detects - * the schema structure/view on all indexes (see - * {@link this.detectSchema(Client, String)}). + * the schema structure/view on all indexes (see {@link + * this.detectSchema(Client, String)}). * * @param client * the ElasticSearch client @@ -149,8 +151,8 @@ public class ElasticSearchDataContext extends QueryPostprocessDataContext implem logger.info("Detecting schema for index '{}'", indexName); final ClusterState cs; - final ClusterStateRequestBuilder clusterStateRequestBuilder = - getElasticSearchClient().admin().cluster().prepareState(); + final ClusterStateRequestBuilder clusterStateRequestBuilder = getElasticSearchClient().admin().cluster() + .prepareState(); // different methods here to set the index name, so we have to use // reflection :-/ @@ -280,7 +282,8 @@ public class ElasticSearchDataContext extends QueryPostprocessDataContext implem @Override protected DataSet materializeMainSchemaTable(Table table, List<SelectItem> selectItems, List<FilterItem> whereItems, int firstRow, int maxRows) { - final QueryBuilder queryBuilder = ElasticSearchUtils.createQueryBuilderForSimpleWhere(whereItems, LogicalOperator.AND); + final QueryBuilder queryBuilder = ElasticSearchUtils.createQueryBuilderForSimpleWhere(whereItems, + LogicalOperator.AND); if (queryBuilder != null) { // where clause can be pushed down to an ElasticSearch query final SearchRequestBuilder searchRequest = createSearchRequest(table, firstRow, maxRows, queryBuilder); @@ -358,10 +361,11 @@ public class ElasticSearchDataContext extends QueryPostprocessDataContext implem } @Override - public void executeUpdate(UpdateScript update) { + public UpdateSummary executeUpdate(UpdateScript update) { final ElasticSearchUpdateCallback callback = new ElasticSearchUpdateCallback(this); update.run(callback); callback.onExecuteUpdateFinished(); + return callback.getUpdateSummary(); } /** http://git-wip-us.apache.org/repos/asf/metamodel/blob/a15ca724/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/ElasticSearchRestDataContext.java ---------------------------------------------------------------------- diff --git a/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/ElasticSearchRestDataContext.java b/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/ElasticSearchRestDataContext.java index 2219b89..e762050 100644 --- a/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/ElasticSearchRestDataContext.java +++ b/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/ElasticSearchRestDataContext.java @@ -29,6 +29,7 @@ import org.apache.metamodel.DataContext; import org.apache.metamodel.MetaModelException; import org.apache.metamodel.QueryPostprocessDataContext; import org.apache.metamodel.UpdateScript; +import org.apache.metamodel.UpdateSummary; import org.apache.metamodel.UpdateableDataContext; import org.apache.metamodel.data.DataSet; import org.apache.metamodel.data.DataSetHeader; @@ -82,7 +83,8 @@ import io.searchbox.params.Parameters; * This implementation supports either automatic discovery of a schema or manual * specification of a schema, through the {@link SimpleTableDef} class. */ -public class ElasticSearchRestDataContext extends QueryPostprocessDataContext implements DataContext, UpdateableDataContext { +public class ElasticSearchRestDataContext extends QueryPostprocessDataContext implements DataContext, + UpdateableDataContext { private static final Logger logger = LoggerFactory.getLogger(ElasticSearchRestDataContext.class); @@ -94,16 +96,17 @@ public class ElasticSearchRestDataContext extends QueryPostprocessDataContext im private final JestClient elasticSearchClient; private final String indexName; - // Table definitions that are set from the beginning, not supposed to be changed. + // Table definitions that are set from the beginning, not supposed to be + // changed. private final List<SimpleTableDef> staticTableDefinitions; // Table definitions that are discovered, these can change private final List<SimpleTableDef> dynamicTableDefinitions = new ArrayList<>(); /** - * Constructs a {@link ElasticSearchRestDataContext}. This constructor accepts a - * custom array of {@link SimpleTableDef}s which allows the user to define - * his own view on the indexes in the engine. + * Constructs a {@link ElasticSearchRestDataContext}. This constructor + * accepts a custom array of {@link SimpleTableDef}s which allows the user + * to define his own view on the indexes in the engine. * * @param client * the ElasticSearch client @@ -127,9 +130,9 @@ public class ElasticSearchRestDataContext extends QueryPostprocessDataContext im } /** - * Constructs a {@link ElasticSearchRestDataContext} and automatically detects - * the schema structure/view on all indexes (see - * {@link this.detectSchema(JestClient, String)}). + * Constructs a {@link ElasticSearchRestDataContext} and automatically + * detects the schema structure/view on all indexes (see {@link + * this.detectSchema(JestClient, String)}). * * @param client * the ElasticSearch client @@ -157,20 +160,20 @@ public class ElasticSearchRestDataContext extends QueryPostprocessDataContext im final GetMapping getMapping = new GetMapping.Builder().addIndex(indexName).build(); jestResult = elasticSearchClient.execute(getMapping); } catch (Exception e) { - logger.error("Failed to retrieve mappings" , e); + logger.error("Failed to retrieve mappings", e); throw new MetaModelException("Failed to execute request for index information needed to detect schema", e); } - if(!jestResult.isSucceeded()){ + if (!jestResult.isSucceeded()) { logger.error("Failed to retrieve mappings; {}", jestResult.getErrorMessage()); throw new MetaModelException("Failed to retrieve mappings; " + jestResult.getErrorMessage()); } final List<SimpleTableDef> result = new ArrayList<>(); - final Set<Map.Entry<String, JsonElement>> mappings = - jestResult.getJsonObject().getAsJsonObject(indexName).getAsJsonObject("mappings").entrySet(); - if(mappings.size() == 0){ + final Set<Map.Entry<String, JsonElement>> mappings = jestResult.getJsonObject().getAsJsonObject(indexName) + .getAsJsonObject("mappings").entrySet(); + if (mappings.size() == 0) { logger.warn("No metadata returned for index name '{}' - no tables will be detected."); } else { @@ -178,7 +181,8 @@ public class ElasticSearchRestDataContext extends QueryPostprocessDataContext im final String documentType = entry.getKey(); try { - final SimpleTableDef table = detectTable(entry.getValue().getAsJsonObject().get("properties").getAsJsonObject(), documentType); + final SimpleTableDef table = detectTable(entry.getValue().getAsJsonObject().get("properties") + .getAsJsonObject(), documentType); result.add(table); } catch (Exception e) { logger.error("Unexpected error during detectTable for document type '{}'", documentType, e); @@ -198,8 +202,8 @@ public class ElasticSearchRestDataContext extends QueryPostprocessDataContext im /** * Performs an analysis of an available index type in an ElasticSearch - * {@link JestClient} client and tries to detect the index structure based on - * the metadata provided by the java client. + * {@link JestClient} client and tries to detect the index structure based + * on the metadata provided by the java client. * * @param metadataProperties * the ElasticSearch mapping @@ -209,8 +213,7 @@ public class ElasticSearchRestDataContext extends QueryPostprocessDataContext im */ private static SimpleTableDef detectTable(JsonObject metadataProperties, String documentType) { final ElasticSearchMetaData metaData = JestElasticSearchMetaDataParser.parse(metadataProperties); - return new SimpleTableDef(documentType, metaData.getColumnNames(), - metaData.getColumnTypes()); + return new SimpleTableDef(documentType, metaData.getColumnNames(), metaData.getColumnTypes()); } @Override @@ -254,8 +257,8 @@ public class ElasticSearchRestDataContext extends QueryPostprocessDataContext im @Override protected DataSet materializeMainSchemaTable(Table table, List<SelectItem> selectItems, List<FilterItem> whereItems, int firstRow, int maxRows) { - final QueryBuilder queryBuilder = ElasticSearchUtils - .createQueryBuilderForSimpleWhere(whereItems, LogicalOperator.AND); + final QueryBuilder queryBuilder = ElasticSearchUtils.createQueryBuilderForSimpleWhere(whereItems, + LogicalOperator.AND); if (queryBuilder != null) { // where clause can be pushed down to an ElasticSearch query SearchSourceBuilder searchSourceBuilder = createSearchRequest(firstRow, maxRows, queryBuilder); @@ -267,8 +270,9 @@ public class ElasticSearchRestDataContext extends QueryPostprocessDataContext im } private SearchResult executeSearch(Table table, SearchSourceBuilder searchSourceBuilder, boolean scroll) { - Search.Builder builder = new Search.Builder(searchSourceBuilder.toString()).addIndex(getIndexName()).addType(table.getName()); - if(scroll){ + Search.Builder builder = new Search.Builder(searchSourceBuilder.toString()).addIndex(getIndexName()).addType( + table.getName()); + if (scroll) { builder.setParameter(Parameters.SCROLL, TIMEOUT_SCROLL); } @@ -276,7 +280,7 @@ public class ElasticSearchRestDataContext extends QueryPostprocessDataContext im SearchResult result; try { result = elasticSearchClient.execute(search); - } catch (Exception e){ + } catch (Exception e) { logger.warn("Could not execute ElasticSearch query", e); throw new MetaModelException("Could not execute ElasticSearch query", e); } @@ -285,7 +289,8 @@ public class ElasticSearchRestDataContext extends QueryPostprocessDataContext im @Override protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) { - SearchResult searchResult = executeSearch(table, createSearchRequest(1, maxRows, null), limitMaxRowsIsSet(maxRows)); + SearchResult searchResult = executeSearch(table, createSearchRequest(1, maxRows, null), + limitMaxRowsIsSet(maxRows)); return new JestElasticSearchDataSet(elasticSearchClient, searchResult, columns); } @@ -340,7 +345,7 @@ public class ElasticSearchRestDataContext extends QueryPostprocessDataContext im CountResult countResult; try { countResult = elasticSearchClient.execute(count); - } catch (Exception e){ + } catch (Exception e) { logger.warn("Could not execute ElasticSearch get query", e); throw new MetaModelException("Could not execute ElasticSearch get query", e); } @@ -353,10 +358,11 @@ public class ElasticSearchRestDataContext extends QueryPostprocessDataContext im } @Override - public void executeUpdate(UpdateScript update) { + public UpdateSummary executeUpdate(UpdateScript update) { final JestElasticSearchUpdateCallback callback = new JestElasticSearchUpdateCallback(this); update.run(callback); callback.onExecuteUpdateFinished(); + return callback.getUpdateSummary(); } /** http://git-wip-us.apache.org/repos/asf/metamodel/blob/a15ca724/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java ---------------------------------------------------------------------- diff --git a/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java b/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java index 28c1f8e..df93990 100644 --- a/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java +++ b/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java @@ -26,6 +26,7 @@ import org.apache.metamodel.DataContext; import org.apache.metamodel.MetaModelException; import org.apache.metamodel.QueryPostprocessDataContext; import org.apache.metamodel.UpdateScript; +import org.apache.metamodel.UpdateSummary; import org.apache.metamodel.UpdateableDataContext; import org.apache.metamodel.data.DataSet; import org.apache.metamodel.schema.Column; @@ -225,8 +226,8 @@ public final class ExcelDataContext extends QueryPostprocessDataContext implemen } @Override - public void executeUpdate(UpdateScript update) { - ExcelUpdateCallback updateCallback = new ExcelUpdateCallback(this); + public UpdateSummary executeUpdate(UpdateScript update) { + final ExcelUpdateCallback updateCallback = new ExcelUpdateCallback(this); synchronized (WRITE_LOCK) { try { update.run(updateCallback); @@ -234,5 +235,6 @@ public final class ExcelDataContext extends QueryPostprocessDataContext implemen updateCallback.close(); } } + return updateCallback.getUpdateSummary(); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/metamodel/blob/a15ca724/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java ---------------------------------------------------------------------- diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java index 84254f9..a878a6d 100644 --- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java +++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java @@ -39,6 +39,7 @@ import org.apache.metamodel.BatchUpdateScript; import org.apache.metamodel.MetaModelException; import org.apache.metamodel.MetaModelHelper; import org.apache.metamodel.UpdateScript; +import org.apache.metamodel.UpdateSummary; import org.apache.metamodel.UpdateableDataContext; import org.apache.metamodel.data.DataSet; import org.apache.metamodel.data.EmptyDataSet; @@ -819,7 +820,7 @@ public class JdbcDataContext extends AbstractDataContext implements UpdateableDa } @Override - public void executeUpdate(final UpdateScript update) { + public UpdateSummary executeUpdate(final UpdateScript update) { final JdbcUpdateCallback updateCallback; if (_supportsBatchUpdates && update instanceof BatchUpdateScript) { @@ -844,6 +845,8 @@ public class JdbcDataContext extends AbstractDataContext implements UpdateableDa updateCallback.close(false); throw e; } + + return updateCallback.getUpdateSummary(); } protected boolean isSingleConnection() { http://git-wip-us.apache.org/repos/asf/metamodel/blob/a15ca724/mongodb/src/main/java/org/apache/metamodel/mongodb/MongoDbDataContext.java ---------------------------------------------------------------------- diff --git a/mongodb/src/main/java/org/apache/metamodel/mongodb/MongoDbDataContext.java b/mongodb/src/main/java/org/apache/metamodel/mongodb/MongoDbDataContext.java index 26db6d4..3bc068d 100644 --- a/mongodb/src/main/java/org/apache/metamodel/mongodb/MongoDbDataContext.java +++ b/mongodb/src/main/java/org/apache/metamodel/mongodb/MongoDbDataContext.java @@ -31,6 +31,7 @@ import org.apache.metamodel.DataContext; import org.apache.metamodel.MetaModelException; import org.apache.metamodel.QueryPostprocessDataContext; import org.apache.metamodel.UpdateScript; +import org.apache.metamodel.UpdateSummary; import org.apache.metamodel.UpdateableDataContext; import org.apache.metamodel.data.DataSet; import org.apache.metamodel.data.DataSetHeader; @@ -467,14 +468,16 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U /** * Executes an update with a specific {@link WriteConcernAdvisor}. + * @return */ - public void executeUpdate(UpdateScript update, WriteConcernAdvisor writeConcernAdvisor) { - MongoDbUpdateCallback callback = new MongoDbUpdateCallback(this, writeConcernAdvisor); + public UpdateSummary executeUpdate(UpdateScript update, WriteConcernAdvisor writeConcernAdvisor) { + final MongoDbUpdateCallback callback = new MongoDbUpdateCallback(this, writeConcernAdvisor); try { update.run(callback); } finally { callback.close(); } + return callback.getUpdateSummary(); } /** @@ -485,8 +488,8 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U } @Override - public void executeUpdate(UpdateScript update) { - executeUpdate(update, getWriteConcernAdvisor()); + public UpdateSummary executeUpdate(UpdateScript update) { + return executeUpdate(update, getWriteConcernAdvisor()); } /** http://git-wip-us.apache.org/repos/asf/metamodel/blob/a15ca724/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java ---------------------------------------------------------------------- diff --git a/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java b/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java index 2de3d59..9369e96 100644 --- a/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java +++ b/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java @@ -30,6 +30,7 @@ import org.apache.metamodel.MetaModelException; import org.apache.metamodel.MetaModelHelper; import org.apache.metamodel.QueryPostprocessDataContext; import org.apache.metamodel.UpdateScript; +import org.apache.metamodel.UpdateSummary; import org.apache.metamodel.UpdateableDataContext; import org.apache.metamodel.data.DataSet; import org.apache.metamodel.data.MaxRowsDataSet; @@ -140,11 +141,12 @@ public class PojoDataContext extends QueryPostprocessDataContext implements Upda } @Override - public void executeUpdate(UpdateScript update) { - PojoUpdateCallback updateCallback = new PojoUpdateCallback(this); + public UpdateSummary executeUpdate(UpdateScript update) { + final PojoUpdateCallback updateCallback = new PojoUpdateCallback(this); synchronized (this) { update.run(updateCallback); } + return updateCallback.getUpdateSummary(); } protected void addTableDataProvider(TableDataProvider<?> tableDataProvider) { http://git-wip-us.apache.org/repos/asf/metamodel/blob/a15ca724/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataContext.java ---------------------------------------------------------------------- diff --git a/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataContext.java b/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataContext.java index c8add52..793c42d 100644 --- a/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataContext.java +++ b/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataContext.java @@ -25,9 +25,11 @@ import java.util.Locale; import java.util.TimeZone; import com.sforce.ws.ConnectorConfig; + import org.apache.metamodel.MetaModelException; import org.apache.metamodel.QueryPostprocessDataContext; import org.apache.metamodel.UpdateScript; +import org.apache.metamodel.UpdateSummary; import org.apache.metamodel.UpdateableDataContext; import org.apache.metamodel.data.DataSet; import org.apache.metamodel.data.FirstRowDataSet; @@ -362,9 +364,10 @@ public class SalesforceDataContext extends QueryPostprocessDataContext implement } @Override - public void executeUpdate(UpdateScript update) { + public UpdateSummary executeUpdate(UpdateScript update) { final SalesforceUpdateCallback callback = new SalesforceUpdateCallback(this, _connection); update.run(callback); callback.close(); + return callback.getUpdateSummary(); } }