You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ds...@apache.org on 2018/12/13 18:00:57 UTC
[geode] 01/01: WIP
This is an automated email from the ASF dual-hosted git repository.
dschneider pushed a commit to branch feature/GEODE-6194
in repository https://gitbox.apache.org/repos/asf/geode.git
commit 0aba1e0478408bde4d3704ec66e1dde94d1036ca
Author: bross <br...@pivotal.io>
AuthorDate: Wed Dec 12 16:48:58 2018 -0800
WIP
---
.../TableMetaDataManagerIntegrationTest.java | 6 +-
.../geode/connectors/jdbc/internal/SqlHandler.java | 4 +-
.../connectors/jdbc/internal/TableMetaData.java | 11 ++--
.../jdbc/internal/TableMetaDataManager.java | 50 ++++++++-------
.../jdbc/internal/TableMetaDataView.java | 4 +-
.../connectors/jdbc/internal/SqlHandlerTest.java | 2 +-
.../jdbc/internal/SqlToPdxInstanceCreatorTest.java | 5 +-
.../jdbc/internal/TableMetaDataManagerTest.java | 73 +++++++++++++++-------
8 files changed, 95 insertions(+), 60 deletions(-)
diff --git a/geode-connectors/src/acceptanceTest/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataManagerIntegrationTest.java b/geode-connectors/src/acceptanceTest/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataManagerIntegrationTest.java
index 399229c..b86eb9f 100644
--- a/geode-connectors/src/acceptanceTest/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataManagerIntegrationTest.java
+++ b/geode-connectors/src/acceptanceTest/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataManagerIntegrationTest.java
@@ -85,7 +85,7 @@ public abstract class TableMetaDataManagerIntegrationTest {
createTable();
TableMetaDataView metaData = manager.getTableMetaDataView(connection, REGION_TABLE_NAME, null);
- String keyColumnName = metaData.getKeyColumnName();
+ String keyColumnName = metaData.getKeyColumnNames();
assertThat(keyColumnName).isEqualTo("id");
}
@@ -96,7 +96,7 @@ public abstract class TableMetaDataManagerIntegrationTest {
TableMetaDataView metaData =
manager.getTableMetaDataView(connection, REGION_TABLE_NAME, "nonprimaryid");
- String keyColumnName = metaData.getKeyColumnName();
+ String keyColumnName = metaData.getKeyColumnNames();
assertThat(keyColumnName).isEqualTo("nonprimaryid");
}
@@ -107,7 +107,7 @@ public abstract class TableMetaDataManagerIntegrationTest {
TableMetaDataView metaData =
manager.getTableMetaDataView(connection, REGION_TABLE_NAME, "NonPrimaryId");
- String keyColumnName = metaData.getKeyColumnName();
+ String keyColumnName = metaData.getKeyColumnNames();
assertThat(keyColumnName).isEqualTo("NonPrimaryId");
}
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlHandler.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlHandler.java
index 9335d03..06baf64 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlHandler.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlHandler.java
@@ -230,7 +230,7 @@ public class SqlHandler {
<K> EntryColumnData getEntryColumnData(TableMetaDataView tableMetaData,
RegionMapping regionMapping, K key, PdxInstance value, Operation operation) {
- String keyColumnName = tableMetaData.getKeyColumnName();
+ String keyColumnName = "ERROR";//tableMetaData.getKeyColumnNames();
ColumnData keyColumnData =
new ColumnData(keyColumnName, key, tableMetaData.getColumnDataType(keyColumnName));
List<ColumnData> valueColumnData = null;
@@ -247,7 +247,7 @@ public class SqlHandler {
List<ColumnData> result = new ArrayList<>();
for (String fieldName : value.getFieldNames()) {
String columnName = regionMapping.getColumnNameForField(fieldName, tableMetaData);
- if (tableMetaData.getKeyColumnName().equals(columnName)) {
+ if (tableMetaData.getKeyColumnNames().equals(columnName)) {
continue;
}
ColumnData columnData = new ColumnData(columnName, value.getField(fieldName),
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/TableMetaData.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/TableMetaData.java
index 301e8b1..904acba 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/TableMetaData.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/TableMetaData.java
@@ -17,18 +17,19 @@
package org.apache.geode.connectors.jdbc.internal;
import java.util.HashMap;
+import java.util.List;
import java.util.Set;
public class TableMetaData implements TableMetaDataView {
private final String tableName;
- private final String keyColumnName;
+ private final List<String> keyColumnNames;
private final HashMap<String, Integer> columnNameToTypeMap;
private final String identifierQuoteString;
- public TableMetaData(String tableName, String keyColumnName, String quoteString) {
+ public TableMetaData(String tableName, List<String> keyColumnNames, String quoteString) {
this.tableName = tableName;
- this.keyColumnName = keyColumnName;
+ this.keyColumnNames = keyColumnNames;
this.columnNameToTypeMap = new HashMap<>();
this.identifierQuoteString = quoteString;
}
@@ -39,8 +40,8 @@ public class TableMetaData implements TableMetaDataView {
}
@Override
- public String getKeyColumnName() {
- return this.keyColumnName;
+ public List<String> getKeyColumnNames() {
+ return this.keyColumnNames;
}
@Override
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataManager.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataManager.java
index a454d3e..bd6f779 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataManager.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataManager.java
@@ -14,6 +14,9 @@
*/
package org.apache.geode.connectors.jdbc.internal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
@@ -47,12 +50,12 @@ public class TableMetaDataManager {
DatabaseMetaData metaData = connection.getMetaData();
try (ResultSet tables = metaData.getTables(null, null, "%", null)) {
String realTableName = getTableNameFromMetaData(tableName, tables);
- String key = getPrimaryKeyColumnNameFromMetaData(realTableName, metaData, ids);
+ List<String> keys = getPrimaryKeyColumnNamesFromMetaData(realTableName, metaData, ids);
String quoteString = metaData.getIdentifierQuoteString();
if (quoteString == null) {
quoteString = "";
}
- result = new TableMetaData(realTableName, key, quoteString);
+ result = new TableMetaData(realTableName, keys, quoteString);
getDataTypesFromMetaData(realTableName, metaData, result);
}
} catch (SQLException e) {
@@ -85,28 +88,29 @@ public class TableMetaDataManager {
return result;
}
- private String getPrimaryKeyColumnNameFromMetaData(String tableName, DatabaseMetaData metaData,
- String ids)
+ private List<String> getPrimaryKeyColumnNamesFromMetaData(String tableName, DatabaseMetaData metaData,
+ String ids)
throws SQLException {
+ List<String> keys = new ArrayList<>();
+
if (ids != null && !ids.isEmpty()) {
- if (!doesColumnExistInTable(tableName, metaData, ids)) {
- throw new JdbcConnectorException(
- "The table " + tableName + " does not have a column named " + ids);
- }
- return ids;
- }
- try (ResultSet primaryKeys = metaData.getPrimaryKeys(null, null, tableName)) {
- if (!primaryKeys.next()) {
- throw new JdbcConnectorException(
- "The table " + tableName + " does not have a primary key column.");
+ keys.addAll(Arrays.asList(ids.split(",")));
+ for( String key : keys) {
+ checkColumnExistsInTable(tableName, metaData, key);
}
- String key = primaryKeys.getString("COLUMN_NAME");
- if (primaryKeys.next()) {
- throw new JdbcConnectorException(
- "The table " + tableName + " has more than one primary key column.");
+ } else {
+ try (ResultSet primaryKeys = metaData.getPrimaryKeys(null, null, tableName)) {
+ while(primaryKeys.next()) {
+ String key = primaryKeys.getString("COLUMN_NAME");
+ keys.add(key);
+ }
+ if (keys.isEmpty()) {
+ throw new JdbcConnectorException(
+ "The table " + tableName + " does not have a primary key column.");
+ }
}
- return key;
}
+ return keys;
}
private void getDataTypesFromMetaData(String tableName, DatabaseMetaData metaData,
@@ -120,14 +124,14 @@ public class TableMetaDataManager {
}
}
- private boolean doesColumnExistInTable(String tableName, DatabaseMetaData metaData,
+ private void checkColumnExistsInTable(String tableName, DatabaseMetaData metaData,
String columnName) throws SQLException {
int caseInsensitiveMatches = 0;
try (ResultSet columnData = metaData.getColumns(null, null, tableName, "%")) {
while (columnData.next()) {
String realColumnName = columnData.getString("COLUMN_NAME");
if (columnName.equals(realColumnName)) {
- return true;
+ return;
} else if (columnName.equalsIgnoreCase(realColumnName)) {
caseInsensitiveMatches++;
}
@@ -136,7 +140,9 @@ public class TableMetaDataManager {
if (caseInsensitiveMatches > 1) {
throw new JdbcConnectorException(
"The table " + tableName + " has more than one column that matches " + columnName);
+ } else if(caseInsensitiveMatches == 0) {
+ throw new JdbcConnectorException(
+ "The table " + tableName + " does not have a column named " + columnName);
}
- return caseInsensitiveMatches != 0;
}
}
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataView.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataView.java
index 189d794..3c18dd4 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataView.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataView.java
@@ -16,12 +16,14 @@
*/
package org.apache.geode.connectors.jdbc.internal;
+
+import java.util.List;
import java.util.Set;
public interface TableMetaDataView {
String getTableName();
- String getKeyColumnName();
+ List<String> getKeyColumnNames();
int getColumnDataType(String columnName);
diff --git a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlHandlerTest.java b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlHandlerTest.java
index d93743f..edb2604 100644
--- a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlHandlerTest.java
+++ b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlHandlerTest.java
@@ -90,7 +90,7 @@ public class SqlHandlerTest {
tableMetaDataManager = mock(TableMetaDataManager.class);
tableMetaDataView = mock(TableMetaDataView.class);
when(tableMetaDataView.getTableName()).thenReturn(TABLE_NAME);
- when(tableMetaDataView.getKeyColumnName()).thenReturn(KEY_COLUMN);
+ when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList(KEY_COLUMN));
final String IDS = "ids";
when(tableMetaDataManager.getTableMetaDataView(connection, TABLE_NAME, IDS))
.thenReturn(tableMetaDataView);
diff --git a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreatorTest.java b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreatorTest.java
index 22fe169..df042df 100644
--- a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreatorTest.java
+++ b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreatorTest.java
@@ -30,6 +30,7 @@ import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;
+import java.util.Arrays;
import java.util.Date;
import junitparams.JUnitParamsRunner;
@@ -75,7 +76,7 @@ public class SqlToPdxInstanceCreatorTest {
regionMapping = mock(RegionMapping.class);
resultSet = mock(ResultSet.class);
tableMetaDataView = mock(TableMetaDataView.class);
- when(tableMetaDataView.getKeyColumnName()).thenReturn(KEY_COLUMN);
+ when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList(KEY_COLUMN));
}
@Test
@@ -109,7 +110,7 @@ public class SqlToPdxInstanceCreatorTest {
when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_2), any()))
.thenReturn(PDX_FIELD_NAME_2);
tableMetaDataView = mock(TableMetaDataView.class);
- when(tableMetaDataView.getKeyColumnName()).thenReturn(COLUMN_NAME_1);
+ when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList(COLUMN_NAME_1));
TypeRegistry pdxTypeRegistry = mock(TypeRegistry.class);
when(cache.getPdxRegistry()).thenReturn(pdxTypeRegistry);
String pdxClassName = "myPdxClassName";
diff --git a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataManagerTest.java b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataManagerTest.java
index 91e8a73..b159b0f 100644
--- a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataManagerTest.java
+++ b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/TableMetaDataManagerTest.java
@@ -39,6 +39,7 @@ import org.apache.geode.connectors.jdbc.JdbcConnectorException;
public class TableMetaDataManagerTest {
private static final String TABLE_NAME = "testTable";
private static final String KEY_COLUMN = "keyColumn";
+ private static final String KEY_COLUMN2 = "keyColumn2";
private TableMetaDataManager tableMetaDataManager;
private Connection connection;
@@ -69,14 +70,26 @@ public class TableMetaDataManagerTest {
when(primaryKeysResultSet.next()).thenReturn(true).thenReturn(false);
TableMetaDataView data = tableMetaDataManager.getTableMetaDataView(connection, TABLE_NAME, "");
- assertThat(data.getKeyColumnName()).isEqualTo(KEY_COLUMN);
+
+ assertThat(data.getKeyColumnNames()).isEqualTo(Arrays.asList(KEY_COLUMN));
verify(connection).getMetaData();
}
@Test
+ public void returnsCompositePrimaryKeyColumnNames() throws Exception {
+ setupCompositePrimaryKeysMetaData();
+
+ TableMetaDataView data = tableMetaDataManager.getTableMetaDataView(connection, TABLE_NAME, "");
+
+ assertThat(data.getKeyColumnNames()).isEqualTo(Arrays.asList(KEY_COLUMN, KEY_COLUMN2));
+ verify(connection).getMetaData();
+ }
+
+
+
+ @Test
public void givenNoColumnsAndNonNullIdsThenExpectException() throws Exception {
- when(tablesResultSet.next()).thenReturn(true).thenReturn(false);
- when(tablesResultSet.getString("TABLE_NAME")).thenReturn(TABLE_NAME);
+ setupTableMetaData();
when(columnResultSet.next()).thenReturn(false);
assertThatThrownBy(
@@ -87,8 +100,7 @@ public class TableMetaDataManagerTest {
@Test
public void givenOneColumnAndNonNullIdsThatDoesNotMatchThenExpectException() throws Exception {
- when(tablesResultSet.next()).thenReturn(true).thenReturn(false);
- when(tablesResultSet.getString("TABLE_NAME")).thenReturn(TABLE_NAME);
+ setupTableMetaData();
when(columnResultSet.next()).thenReturn(true).thenReturn(false);
when(columnResultSet.getString("COLUMN_NAME")).thenReturn("existingColumn");
@@ -101,8 +113,7 @@ public class TableMetaDataManagerTest {
@Test
public void givenTwoColumnsAndNonNullIdsThatDoesNotExactlyMatchThenExpectException()
throws Exception {
- when(tablesResultSet.next()).thenReturn(true).thenReturn(false);
- when(tablesResultSet.getString("TABLE_NAME")).thenReturn(TABLE_NAME);
+ setupTableMetaData();
when(columnResultSet.next()).thenReturn(true).thenReturn(true).thenReturn(false);
when(columnResultSet.getString("COLUMN_NAME")).thenReturn("nonexistentid")
.thenReturn("NONEXISTENTID");
@@ -116,8 +127,7 @@ public class TableMetaDataManagerTest {
@Test
public void givenThreeColumnsAndNonNullIdsThatDoesExactlyMatchThenKeyColumnNameIsReturned()
throws Exception {
- when(tablesResultSet.next()).thenReturn(true).thenReturn(false);
- when(tablesResultSet.getString("TABLE_NAME")).thenReturn(TABLE_NAME);
+ setupTableMetaData();
when(columnResultSet.next()).thenReturn(true).thenReturn(true).thenReturn(true)
.thenReturn(false);
when(columnResultSet.getString("COLUMN_NAME")).thenReturn("existentid").thenReturn("EXISTENTID")
@@ -126,21 +136,35 @@ public class TableMetaDataManagerTest {
TableMetaDataView data =
tableMetaDataManager.getTableMetaDataView(connection, TABLE_NAME, "ExistentId");
- assertThat(data.getKeyColumnName()).isEqualTo("ExistentId");
+ assertThat(data.getKeyColumnNames()).isEqualTo(Arrays.asList("ExistentId"));
+ }
+
+ @Test
+ public void givenFourColumnsAndCompositeIdsThenOnlyKeyColumnNamesAreReturned()
+ throws Exception {
+ setupTableMetaData();
+ when(columnResultSet.next()).thenReturn(true).thenReturn(true).thenReturn(true)
+ .thenReturn(true).thenReturn(false);
+ when(columnResultSet.getString("COLUMN_NAME")).thenReturn("LeadingNonKeyColumn").thenReturn(KEY_COLUMN).thenReturn(KEY_COLUMN2)
+ .thenReturn("NonKeyColumn");
+
+ TableMetaDataView data =
+ tableMetaDataManager.getTableMetaDataView(connection, TABLE_NAME, KEY_COLUMN + "," + KEY_COLUMN2);
+
+ assertThat(data.getKeyColumnNames()).isEqualTo(Arrays.asList(KEY_COLUMN, KEY_COLUMN2));
}
@Test
public void givenColumnAndNonNullIdsThatDoesInexactlyMatchThenKeyColumnNameIsReturned()
throws Exception {
- when(tablesResultSet.next()).thenReturn(true).thenReturn(false);
- when(tablesResultSet.getString("TABLE_NAME")).thenReturn(TABLE_NAME);
+ setupTableMetaData();
when(columnResultSet.next()).thenReturn(true).thenReturn(false);
when(columnResultSet.getString("COLUMN_NAME")).thenReturn("existentid");
TableMetaDataView data =
tableMetaDataManager.getTableMetaDataView(connection, TABLE_NAME, "ExistentId");
- assertThat(data.getKeyColumnName()).isEqualTo("ExistentId");
+ assertThat(data.getKeyColumnNames()).isEqualTo(Arrays.asList("ExistentId"));
}
@Test
@@ -201,17 +225,6 @@ public class TableMetaDataManagerTest {
}
@Test
- public void throwsExceptionIfTableHasCompositePrimaryKey() throws Exception {
- setupPrimaryKeysMetaData();
- when(primaryKeysResultSet.next()).thenReturn(true);
-
- assertThatThrownBy(
- () -> tableMetaDataManager.getTableMetaDataView(connection, TABLE_NAME, null))
- .isInstanceOf(JdbcConnectorException.class)
- .hasMessage("The table " + TABLE_NAME + " has more than one primary key column.");
- }
-
- @Test
public void returnsExactMatchTableNameWhenTwoTablesHasCaseInsensitiveSameName() throws Exception {
setupPrimaryKeysMetaData();
when(primaryKeysResultSet.next()).thenReturn(true).thenReturn(false);
@@ -360,7 +373,19 @@ public class TableMetaDataManagerTest {
private void setupPrimaryKeysMetaData() throws SQLException {
when(primaryKeysResultSet.getString("COLUMN_NAME")).thenReturn(KEY_COLUMN);
+ setupTableMetaData();
+ }
+
+ private void setupCompositePrimaryKeysMetaData() throws SQLException {
+ when(primaryKeysResultSet.getString("COLUMN_NAME")).thenReturn(KEY_COLUMN).thenReturn(KEY_COLUMN2);
+ when(primaryKeysResultSet.next()).thenReturn(true).thenReturn(true).thenReturn(false);
+ setupTableMetaData();
+ }
+
+ private void setupTableMetaData() throws SQLException {
when(tablesResultSet.next()).thenReturn(true).thenReturn(false);
when(tablesResultSet.getString("TABLE_NAME")).thenReturn(TABLE_NAME);
}
+
+
}