This is an automated email from the ASF dual-hosted git repository.

dschneider pushed a commit to branch feature/GEODE-6291
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/feature/GEODE-6291 by this 
push:
     new 2adbcda  WIP: when loading pdx instances from SQL a pdx type is no 
longer required One will be created if it does not exist. Existing pdx fields 
will be found whose case differs Need a unit test for TypeRegistry to cover new 
method added to it. RegionMapping.getFieldNameForColumn should be removed. 
Callers of RegionMapping.getColumnNameForField need to be reviewed and need to 
do case insensitive compares
2adbcda is described below

commit 2adbcdadaf79a81b07499c9bc56bb46dd263371d
Author: Darrel Schneider <[email protected]>
AuthorDate: Fri Jan 25 17:14:55 2019 -0800

    WIP: when loading pdx instances from SQL a pdx type is no longer required
    One will be created if it does not exist.
    Existing pdx fields will be found whose case differs
    Need a unit test for TypeRegistry to cover new method added to it.
    RegionMapping.getFieldNameForColumn should be removed.
    Callers of RegionMapping.getColumnNameForField need to be reviewed and need 
to do case insensitive compares
---
 .../geode/connectors/jdbc/internal/SqlHandler.java |   2 +-
 .../jdbc/internal/SqlToPdxInstanceCreator.java     |  63 ++---
 .../CreateMappingPreconditionCheckFunction.java    |  50 +---
 .../jdbc/internal/configuration/FieldMapping.java  |  29 ++-
 .../jdbc/internal/SqlToPdxInstanceCreatorTest.java | 256 ++++++++++-----------
 ...CreateMappingPreconditionCheckFunctionTest.java |  53 +----
 .../apache/geode/pdx/internal/TypeRegistry.java    |  54 +++++
 7 files changed, 238 insertions(+), 269 deletions(-)

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 7185b6c..3629041 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
@@ -83,7 +83,7 @@ public class SqlHandler {
         try (ResultSet resultSet = executeReadQuery(statement, 
entryColumnData)) {
           InternalCache cache = (InternalCache) region.getRegionService();
           SqlToPdxInstanceCreator sqlToPdxInstanceCreator =
-              new SqlToPdxInstanceCreator(cache, regionMapping, resultSet, 
tableMetaData);
+              new SqlToPdxInstanceCreator(cache, regionMapping, resultSet);
           result = sqlToPdxInstanceCreator.create();
         }
       }
diff --git 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreator.java
 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreator.java
index f8c2056..84cdce0 100644
--- 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreator.java
+++ 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreator.java
@@ -21,28 +21,26 @@ import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 
 import org.apache.geode.connectors.jdbc.JdbcConnectorException;
+import org.apache.geode.connectors.jdbc.internal.configuration.FieldMapping;
 import org.apache.geode.connectors.jdbc.internal.configuration.RegionMapping;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.pdx.FieldType;
 import org.apache.geode.pdx.PdxInstance;
 import org.apache.geode.pdx.PdxInstanceFactory;
 import org.apache.geode.pdx.internal.PdxField;
-import org.apache.geode.pdx.internal.PdxType;
 import org.apache.geode.pdx.internal.TypeRegistry;
 
 class SqlToPdxInstanceCreator {
   private final InternalCache cache;
   private final RegionMapping regionMapping;
   private final ResultSet resultSet;
-  private final TableMetaDataView tableMetaData;
   private final PdxInstanceFactory factory;
 
   public SqlToPdxInstanceCreator(InternalCache cache, RegionMapping 
regionMapping,
-      ResultSet resultSet, TableMetaDataView tableMetaData) {
+      ResultSet resultSet) {
     this.cache = cache;
     this.regionMapping = regionMapping;
     this.resultSet = resultSet;
-    this.tableMetaData = tableMetaData;
     this.factory = createPdxInstanceFactory();
   }
 
@@ -55,9 +53,29 @@ class SqlToPdxInstanceCreator {
     final int columnCount = metaData.getColumnCount();
     for (int i = 1; i <= columnCount; i++) {
       String columnName = metaData.getColumnName(i);
-      String fieldName = regionMapping.getFieldNameForColumn(columnName);
-      FieldType fieldType = getFieldType(typeRegistry, fieldName);
-      writeField(columnName, i, fieldName, fieldType);
+      FieldMapping columnMapping = 
regionMapping.getFieldMappingByJdbcName(columnName);
+      if (columnMapping == null) {
+        // TODO: this column was added since create jdbc-mapping was done.
+        // Log a warning, once, and just ignore this column
+        continue;
+      }
+      String fieldName = columnMapping.getPdxName();
+      FieldType fieldType;
+      if (fieldName.isEmpty()) {
+        PdxField pdxField =
+            typeRegistry.findFieldThatMatchesName(regionMapping.getPdxName(), 
columnName);
+        if (pdxField == null) {
+          fieldName = columnName;
+          JDBCType columnType = JDBCType.valueOf(columnMapping.getJdbcType());
+          fieldType = computeFieldType(columnMapping.isJdbcNullable(), 
columnType);
+        } else {
+          fieldName = pdxField.getFieldName();
+          fieldType = pdxField.getFieldType();
+        }
+      } else {
+        fieldType = FieldType.valueOf(columnMapping.getPdxType());
+      }
+      writeField(columnMapping, i, fieldName, fieldType);
     }
     if (resultSet.next()) {
       throw new JdbcConnectorException(
@@ -74,7 +92,8 @@ class SqlToPdxInstanceCreator {
   /**
    * @throws SQLException if the column value get fails
    */
-  private void writeField(String columnName, int columnIndex, String 
fieldName, FieldType fieldType)
+  private void writeField(FieldMapping columnMapping, int columnIndex, String 
fieldName,
+      FieldType fieldType)
       throws SQLException {
     switch (fieldType) {
       case STRING:
@@ -110,12 +129,12 @@ class SqlToPdxInstanceCreator {
         factory.writeBoolean(fieldName, resultSet.getBoolean(columnIndex));
         break;
       case DATE: {
-        factory.writeDate(fieldName, getPdxDate(columnName, columnIndex));
+        factory.writeDate(fieldName, getPdxDate(columnIndex, columnMapping));
         break;
       }
       case BYTE_ARRAY:
         byte[] byteData;
-        if (isBlobColumn(columnName)) {
+        if (isBlobColumn(columnMapping)) {
           byteData = getBlobData(columnIndex);
         } else {
           byteData = resultSet.getBytes(columnIndex);
@@ -164,7 +183,7 @@ class SqlToPdxInstanceCreator {
         break;
       case OBJECT: {
         Object v;
-        if (isBlobColumn(columnName)) {
+        if (isBlobColumn(columnMapping)) {
           v = getBlobData(columnIndex);
         } else {
           v = resultSet.getObject(columnIndex);
@@ -187,9 +206,10 @@ class SqlToPdxInstanceCreator {
     }
   }
 
-  private java.util.Date getPdxDate(String columnName, int columnIndex) throws 
SQLException {
+  private java.util.Date getPdxDate(int columnIndex, FieldMapping 
columnMapping)
+      throws SQLException {
     java.util.Date sqlDate;
-    JDBCType columnType = this.tableMetaData.getColumnDataType(columnName);
+    JDBCType columnType = JDBCType.valueOf(columnMapping.getJdbcType());
     switch (columnType) {
       case DATE:
         sqlDate = resultSet.getDate(columnIndex);
@@ -209,8 +229,8 @@ class SqlToPdxInstanceCreator {
     return pdxDate;
   }
 
-  private boolean isBlobColumn(String columnName) throws SQLException {
-    return this.tableMetaData.getColumnDataType(columnName) == JDBCType.BLOB;
+  private boolean isBlobColumn(FieldMapping columnMapping) throws SQLException 
{
+    return JDBCType.BLOB.name().equals(columnMapping.getJdbcType());
   }
 
   /**
@@ -246,19 +266,6 @@ class SqlToPdxInstanceCreator {
     }
   }
 
-  private FieldType getFieldType(TypeRegistry typeRegistry, String fieldName) {
-    String pdxClassName = regionMapping.getPdxName();
-    PdxType pdxType = typeRegistry.getPdxTypeForField(fieldName, pdxClassName);
-    if (pdxType != null) {
-      PdxField pdxField = pdxType.getPdxField(fieldName);
-      if (pdxField != null) {
-        return pdxField.getFieldType();
-      }
-    }
-    throw new JdbcConnectorException("Could not find PdxType for field " + 
fieldName
-        + ". Add class " + pdxClassName + " with " + fieldName + " to pdx 
registry.");
-  }
-
   static FieldType computeFieldType(boolean isNullable, JDBCType jdbcType) {
     switch (jdbcType) {
       case BIT: // 1 bit
diff --git 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingPreconditionCheckFunction.java
 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingPreconditionCheckFunction.java
index e2c52e7..f41e232 100644
--- 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingPreconditionCheckFunction.java
+++ 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingPreconditionCheckFunction.java
@@ -19,9 +19,7 @@ import java.sql.Connection;
 import java.sql.JDBCType;
 import java.sql.SQLException;
 import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 
 import javax.sql.DataSource;
 
@@ -38,7 +36,6 @@ import org.apache.geode.internal.jndi.JNDIInvoker;
 import org.apache.geode.management.cli.CliFunction;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.pdx.internal.PdxField;
-import org.apache.geode.pdx.internal.PdxType;
 import org.apache.geode.pdx.internal.TypeRegistry;
 
 @Experimental
@@ -105,49 +102,16 @@ public class CreateMappingPreconditionCheckFunction 
extends CliFunction<RegionMa
   private void updateFieldMappingFromExistingPdxType(FieldMapping fieldMapping,
       TypeRegistry typeRegistry, String pdxClassName) {
     String columnName = fieldMapping.getJdbcName();
-    Set<PdxType> pdxTypes = typeRegistry.getPdxTypesForClassName(pdxClassName);
-    if (pdxTypes.isEmpty()) {
-      return;
-    }
-    PdxField foundField = findExactMatch(columnName, pdxTypes);
-    if (foundField == null) {
-      foundField = findCaseInsensitiveMatch(columnName, pdxTypes);
-    }
-    if (foundField != null) {
-      fieldMapping.setPdxName(foundField.getFieldName());
-      fieldMapping.setPdxType(foundField.getFieldType().name());
-    }
-  }
-
-  private PdxField findCaseInsensitiveMatch(String columnName, Set<PdxType> 
pdxTypes) {
-    HashSet<String> matchingFieldNames = new HashSet<>();
-    for (PdxType pdxType : pdxTypes) {
-      for (String existingFieldName : pdxType.getFieldNames()) {
-        if (existingFieldName.equalsIgnoreCase(columnName)) {
-          matchingFieldNames.add(existingFieldName);
-        }
+    try {
+      PdxField foundField = 
typeRegistry.findFieldThatMatchesName(pdxClassName, columnName);
+      if (foundField != null) {
+        fieldMapping.setPdxName(foundField.getFieldName());
+        fieldMapping.setPdxType(foundField.getFieldType().name());
       }
-    }
-    if (matchingFieldNames.isEmpty()) {
-      return null;
-    } else if (matchingFieldNames.size() > 1) {
+    } catch (IllegalStateException ex) {
       throw new JdbcConnectorException(
           "Could not determine what pdx field to use for the column name " + 
columnName
-              + " because the pdx fields " + String.join(", ", 
matchingFieldNames)
-              + " all match it.");
+              + " because " + ex.getMessage());
     }
-    String matchingFieldName = matchingFieldNames.iterator().next();
-    return findExactMatch(matchingFieldName, pdxTypes);
   }
-
-  private PdxField findExactMatch(String columnName, Set<PdxType> pdxTypes) {
-    for (PdxType pdxType : pdxTypes) {
-      PdxField foundField = pdxType.getPdxField(columnName);
-      if (foundField != null) {
-        return foundField;
-      }
-    }
-    return null;
-  }
-
 }
diff --git 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/configuration/FieldMapping.java
 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/configuration/FieldMapping.java
index 26680e7..b66a78f 100644
--- 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/configuration/FieldMapping.java
+++ 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/configuration/FieldMapping.java
@@ -25,12 +25,6 @@ import javax.xml.bind.annotation.XmlAttribute;
 @SuppressWarnings("serial")
 @XmlAccessorType(XmlAccessType.FIELD)
 public class FieldMapping implements Serializable {
-  @Override
-  public String toString() {
-    return "FieldMapping [pdxName=" + pdxName + ", pdxType=" + pdxType + ", 
jdbcName=" + jdbcName
-        + ", jdbcType=" + jdbcType + ", jdbcNullable=" + jdbcNullable + "]";
-  }
-
   @XmlAttribute(name = "pdx-name")
   private String pdxName;
   @XmlAttribute(name = "pdx-type")
@@ -58,11 +52,15 @@ public class FieldMapping implements Serializable {
   }
 
   public void setPdxName(String value) {
-    this.pdxName = value;
+    pdxName = value;
+  }
+
+  public String getPdxType() {
+    return pdxType;
   }
 
   public void setPdxType(String value) {
-    this.pdxType = value;
+    pdxType = value;
   }
 
   public String getJdbcName() {
@@ -70,11 +68,15 @@ public class FieldMapping implements Serializable {
   }
 
   public void setJdbcName(String value) {
-    this.jdbcName = value;
+    jdbcName = value;
+  }
+
+  public String getJdbcType() {
+    return jdbcType;
   }
 
   public boolean isJdbcNullable() {
-    return this.jdbcNullable;
+    return jdbcNullable;
   }
 
   @Override
@@ -135,4 +137,11 @@ public class FieldMapping implements Serializable {
     return true;
   }
 
+  @Override
+  public String toString() {
+    return "FieldMapping [pdxName=" + pdxName + ", pdxType=" + pdxType + ", 
jdbcName=" + jdbcName
+        + ", jdbcType=" + jdbcType + ", jdbcNullable=" + jdbcNullable + "]";
+  }
+
+
 }
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 a97ccf5..d4b7214 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
@@ -16,10 +16,8 @@ package org.apache.geode.connectors.jdbc.internal;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.catchThrowable;
-import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -31,7 +29,6 @@ import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
-import java.util.Arrays;
 import java.util.Date;
 
 import junitparams.JUnitParamsRunner;
@@ -43,13 +40,13 @@ import org.junit.rules.ExpectedException;
 import org.junit.runner.RunWith;
 
 import org.apache.geode.connectors.jdbc.JdbcConnectorException;
+import org.apache.geode.connectors.jdbc.internal.configuration.FieldMapping;
 import org.apache.geode.connectors.jdbc.internal.configuration.RegionMapping;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.pdx.FieldType;
 import org.apache.geode.pdx.PdxInstance;
 import org.apache.geode.pdx.PdxInstanceFactory;
 import org.apache.geode.pdx.internal.PdxField;
-import org.apache.geode.pdx.internal.PdxType;
 import org.apache.geode.pdx.internal.TypeRegistry;
 
 @RunWith(JUnitParamsRunner.class)
@@ -65,8 +62,8 @@ public class SqlToPdxInstanceCreatorTest {
 
   private InternalCache cache;
   private RegionMapping regionMapping;
+  private FieldMapping columnMapping = mock(FieldMapping.class);
   private ResultSet resultSet;
-  private TableMetaDataView tableMetaDataView;
 
   @Rule
   public ExpectedException thrown = ExpectedException.none();
@@ -75,9 +72,12 @@ public class SqlToPdxInstanceCreatorTest {
   public void setup() throws Exception {
     cache = mock(InternalCache.class);
     regionMapping = mock(RegionMapping.class);
+    columnMapping = mock(FieldMapping.class);
+    when(columnMapping.getJdbcName()).thenReturn(COLUMN_NAME_1);
+    when(columnMapping.getPdxName()).thenReturn(PDX_FIELD_NAME_1);
+    when(columnMapping.getPdxType()).thenReturn(FieldType.OBJECT.name());
+    
when(regionMapping.getFieldMappingByJdbcName(COLUMN_NAME_1)).thenReturn(columnMapping);
     resultSet = mock(ResultSet.class);
-    tableMetaDataView = mock(TableMetaDataView.class);
-    
when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList(KEY_COLUMN));
   }
 
   @Test
@@ -106,24 +106,14 @@ public class SqlToPdxInstanceCreatorTest {
     setupResultSetForTwoObjectColumns(resultSet);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = mock(PdxInstanceFactory.class);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
-        .thenReturn(PDX_FIELD_NAME_1);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_2)))
-        .thenReturn(PDX_FIELD_NAME_2);
-    tableMetaDataView = mock(TableMetaDataView.class);
-    
when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList(COLUMN_NAME_1));
-    TypeRegistry pdxTypeRegistry = mock(TypeRegistry.class);
-    when(cache.getPdxRegistry()).thenReturn(pdxTypeRegistry);
     String pdxClassName = "myPdxClassName";
     when(cache.createPdxInstanceFactory(pdxClassName)).thenReturn(factory);
-    PdxType pdxType = mock(PdxType.class);
     when(regionMapping.getPdxName()).thenReturn(pdxClassName);
-    when(pdxTypeRegistry.getPdxTypeForField(PDX_FIELD_NAME_1, 
pdxClassName)).thenReturn(pdxType);
-    PdxField pdxField = mock(PdxField.class);
-    when(pdxField.getFieldType()).thenReturn(FieldType.OBJECT);
-    when(pdxType.getPdxField(PDX_FIELD_NAME_1)).thenReturn(pdxField);
-    when(pdxTypeRegistry.getPdxTypeForField(PDX_FIELD_NAME_2, 
pdxClassName)).thenReturn(pdxType);
-    when(pdxType.getPdxField(PDX_FIELD_NAME_2)).thenReturn(pdxField);
+    FieldMapping columnMapping2 = mock(FieldMapping.class);
+    when(columnMapping2.getJdbcName()).thenReturn(COLUMN_NAME_2);
+    when(columnMapping2.getPdxName()).thenReturn(PDX_FIELD_NAME_2);
+    when(columnMapping2.getPdxType()).thenReturn(FieldType.OBJECT.name());
+    
when(regionMapping.getFieldMappingByJdbcName(COLUMN_NAME_2)).thenReturn(columnMapping2);
 
     createPdxInstance();
 
@@ -140,20 +130,12 @@ public class SqlToPdxInstanceCreatorTest {
     String pdxClassName = "myPdxClassName";
     when(cache.createPdxInstanceFactory(pdxClassName)).thenReturn(factory);
     when(cache.createPdxInstanceFactory(anyString(), 
anyBoolean())).thenReturn(factory);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
-        .thenReturn(PDX_FIELD_NAME_1);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_2)))
-        .thenReturn(PDX_FIELD_NAME_2);
-    TypeRegistry pdxTypeRegistry = mock(TypeRegistry.class);
-    when(cache.getPdxRegistry()).thenReturn(pdxTypeRegistry);
-    PdxType pdxType = mock(PdxType.class);
     when(regionMapping.getPdxName()).thenReturn(pdxClassName);
-    when(pdxTypeRegistry.getPdxTypeForField(PDX_FIELD_NAME_1, 
pdxClassName)).thenReturn(pdxType);
-    PdxField pdxField = mock(PdxField.class);
-    when(pdxField.getFieldType()).thenReturn(FieldType.OBJECT);
-    when(pdxType.getPdxField(PDX_FIELD_NAME_1)).thenReturn(pdxField);
-    when(pdxTypeRegistry.getPdxTypeForField(PDX_FIELD_NAME_2, 
pdxClassName)).thenReturn(pdxType);
-    when(pdxType.getPdxField(PDX_FIELD_NAME_2)).thenReturn(pdxField);
+    FieldMapping columnMapping2 = mock(FieldMapping.class);
+    when(columnMapping2.getJdbcName()).thenReturn(COLUMN_NAME_2);
+    when(columnMapping2.getPdxName()).thenReturn(PDX_FIELD_NAME_2);
+    when(columnMapping2.getPdxType()).thenReturn(FieldType.OBJECT.name());
+    
when(regionMapping.getFieldMappingByJdbcName(COLUMN_NAME_2)).thenReturn(columnMapping2);
 
     createPdxInstance();
 
@@ -168,21 +150,101 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = mock(PdxInstanceFactory.class);
     String fieldName1 = "pdxFieldName1";
-    
when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1))).thenReturn(fieldName1);
+    when(columnMapping.getPdxName()).thenReturn(fieldName1);
+    String pdxClassName = "myPdxClassName";
+    when(cache.createPdxInstanceFactory(pdxClassName)).thenReturn(factory);
+    when(regionMapping.getPdxName()).thenReturn(pdxClassName);
+
+    createPdxInstance();
+
+    verify(factory).writeObject(fieldName1, COLUMN_VALUE_1);
+    verify(factory).create();
+  }
+
+  @Test
+  public void fieldsAreNotWrittenIfNoFieldMapping() throws Exception {
+    setupResultSet(resultSet, FieldType.OBJECT, COLUMN_VALUE_1);
+    when(resultSet.next()).thenReturn(true).thenReturn(false);
+    PdxInstanceFactory factory = mock(PdxInstanceFactory.class);
+    String pdxClassName = "myPdxClassName";
+    when(cache.createPdxInstanceFactory(pdxClassName)).thenReturn(factory);
+    when(regionMapping.getPdxName()).thenReturn(pdxClassName);
+    
when(regionMapping.getFieldMappingByJdbcName(COLUMN_NAME_1)).thenReturn(null);
+
+    createPdxInstance();
+
+    verify(factory).create();
+    verifyNoMoreInteractions(factory);
+  }
+
+  @Test
+  public void 
readingNonNullIntegerColumnWithNoPdxTypeCausesIntPdxFieldToBeWritten()
+      throws Exception {
+    setupResultSet(resultSet, FieldType.INT, Integer.valueOf(1979));
+    when(resultSet.next()).thenReturn(true).thenReturn(false);
+    PdxInstanceFactory factory = mock(PdxInstanceFactory.class);
+    String pdxClassName = "myPdxClassName";
+    when(cache.createPdxInstanceFactory(pdxClassName)).thenReturn(factory);
     TypeRegistry pdxTypeRegistry = mock(TypeRegistry.class);
     when(cache.getPdxRegistry()).thenReturn(pdxTypeRegistry);
+    when(regionMapping.getPdxName()).thenReturn(pdxClassName);
+    when(columnMapping.getPdxName()).thenReturn("");
+    when(columnMapping.getPdxType()).thenReturn("");
+    when(columnMapping.getJdbcType()).thenReturn(JDBCType.INTEGER.name());
+    when(columnMapping.isJdbcNullable()).thenReturn(false);
+
+    createPdxInstance();
+
+    verify(factory).writeInt(COLUMN_NAME_1, 1979);
+    verify(factory).create();
+  }
+
+  @Test
+  public void 
readingNullableIntegerColumnWithNoPdxTypeCausesObjectPdxFieldToBeWritten()
+      throws Exception {
+    setupResultSet(resultSet, FieldType.OBJECT, Integer.valueOf(1979));
+    when(resultSet.next()).thenReturn(true).thenReturn(false);
+    PdxInstanceFactory factory = mock(PdxInstanceFactory.class);
     String pdxClassName = "myPdxClassName";
     when(cache.createPdxInstanceFactory(pdxClassName)).thenReturn(factory);
-    PdxType pdxType = mock(PdxType.class);
+    TypeRegistry pdxTypeRegistry = mock(TypeRegistry.class);
+    when(cache.getPdxRegistry()).thenReturn(pdxTypeRegistry);
     when(regionMapping.getPdxName()).thenReturn(pdxClassName);
-    when(pdxTypeRegistry.getPdxTypeForField(fieldName1, 
pdxClassName)).thenReturn(pdxType);
+    when(columnMapping.getPdxName()).thenReturn("");
+    when(columnMapping.getPdxType()).thenReturn("");
+    when(columnMapping.getJdbcType()).thenReturn(JDBCType.INTEGER.name());
+    when(columnMapping.isJdbcNullable()).thenReturn(true);
+
+    createPdxInstance();
+
+    verify(factory).writeObject(COLUMN_NAME_1, Integer.valueOf(1979));
+    verify(factory).create();
+  }
+
+  @Test
+  public void 
fieldWritingGivesPrecedenceToFindFieldThatMatchesNameWhenRegionMappingPdxNameIsEmpty()
+      throws Exception {
+    setupResultSet(resultSet, FieldType.SHORT, Short.valueOf((short) 1979));
+    when(resultSet.next()).thenReturn(true).thenReturn(false);
+    PdxInstanceFactory factory = mock(PdxInstanceFactory.class);
+    String pdxClassName = "myPdxClassName";
+    when(cache.createPdxInstanceFactory(pdxClassName)).thenReturn(factory);
+    TypeRegistry pdxTypeRegistry = mock(TypeRegistry.class);
     PdxField pdxField = mock(PdxField.class);
-    when(pdxField.getFieldType()).thenReturn(FieldType.OBJECT);
-    when(pdxType.getPdxField(fieldName1)).thenReturn(pdxField);
+    when(pdxField.getFieldName()).thenReturn("myPdxField1");
+    when(pdxField.getFieldType()).thenReturn(FieldType.SHORT);
+    when(pdxTypeRegistry.findFieldThatMatchesName(pdxClassName, COLUMN_NAME_1))
+        .thenReturn(pdxField);
+    when(cache.getPdxRegistry()).thenReturn(pdxTypeRegistry);
+    when(regionMapping.getPdxName()).thenReturn(pdxClassName);
+    when(columnMapping.getPdxName()).thenReturn("");
+    when(columnMapping.getPdxType()).thenReturn("");
+    when(columnMapping.getJdbcType()).thenReturn(JDBCType.INTEGER.name());
+    when(columnMapping.isJdbcNullable()).thenReturn(true);
 
     createPdxInstance();
 
-    verify(factory).writeObject(fieldName1, COLUMN_VALUE_1);
+    verify(factory).writeShort("myPdxField1", (short) 1979);
     verify(factory).create();
   }
 
@@ -192,9 +254,8 @@ public class SqlToPdxInstanceCreatorTest {
     setupResultSet(resultSet, fieldType);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
-        .thenReturn(PDX_FIELD_NAME_1);
-    when(tableMetaDataView.getColumnDataType(any())).thenReturn(JDBCType.NULL);
+    when(columnMapping.getJdbcType()).thenReturn(JDBCType.NULL.name());
+    when(columnMapping.getPdxType()).thenReturn(fieldType.name());
 
     createPdxInstance();
 
@@ -204,7 +265,7 @@ public class SqlToPdxInstanceCreatorTest {
 
   private PdxInstance createPdxInstance() throws SQLException {
     SqlToPdxInstanceCreator sqlToPdxInstanceCreator =
-        new SqlToPdxInstanceCreator(cache, regionMapping, resultSet, 
tableMetaDataView);
+        new SqlToPdxInstanceCreator(cache, regionMapping, resultSet);
     return sqlToPdxInstanceCreator.create();
   }
 
@@ -214,9 +275,8 @@ public class SqlToPdxInstanceCreatorTest {
     setupResultSet(resultSet, fieldType, null);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
-        .thenReturn(PDX_FIELD_NAME_1);
-    when(tableMetaDataView.getColumnDataType(any())).thenReturn(JDBCType.NULL);
+    when(columnMapping.getJdbcType()).thenReturn(JDBCType.NULL.name());
+    when(columnMapping.getPdxType()).thenReturn(fieldType.name());
 
     createPdxInstance();
 
@@ -235,8 +295,6 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getString(1)).thenReturn("");
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
-        .thenReturn(PDX_FIELD_NAME_1);
 
     createPdxInstance();
 
@@ -251,14 +309,12 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getMetaData()).thenReturn(metaData);
     when(metaData.getColumnCount()).thenReturn(1);
     when(metaData.getColumnName(1)).thenReturn(COLUMN_NAME_1);
-    
when(tableMetaDataView.getColumnDataType(COLUMN_NAME_1)).thenReturn(JDBCType.DATE);
     java.sql.Date sqlDate = java.sql.Date.valueOf("1979-09-11");
     Date expectedValue = new Date(sqlDate.getTime());
     when(resultSet.getDate(1)).thenReturn(sqlDate);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
-        .thenReturn(PDX_FIELD_NAME_1);
+    when(columnMapping.getJdbcType()).thenReturn(JDBCType.DATE.name());
 
     createPdxInstance();
 
@@ -273,7 +329,6 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getMetaData()).thenReturn(metaData);
     when(metaData.getColumnCount()).thenReturn(1);
     when(metaData.getColumnName(1)).thenReturn(COLUMN_NAME_1);
-    
when(tableMetaDataView.getColumnDataType(COLUMN_NAME_1)).thenReturn(JDBCType.BLOB);
     byte[] expectedValue = new byte[] {1, 2, 3};
     Blob blob = mock(Blob.class);
     when(blob.length()).thenReturn((long) expectedValue.length);
@@ -281,8 +336,7 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getBlob(1)).thenReturn(blob);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
-        .thenReturn(PDX_FIELD_NAME_1);
+    when(columnMapping.getJdbcType()).thenReturn(JDBCType.BLOB.name());
 
     createPdxInstance();
 
@@ -297,14 +351,12 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getMetaData()).thenReturn(metaData);
     when(metaData.getColumnCount()).thenReturn(1);
     when(metaData.getColumnName(1)).thenReturn(COLUMN_NAME_1);
-    
when(tableMetaDataView.getColumnDataType(COLUMN_NAME_1)).thenReturn(JDBCType.BLOB);
     byte[] expectedValue = null;
     Blob blob = null;
     when(resultSet.getBlob(1)).thenReturn(blob);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
-        .thenReturn(PDX_FIELD_NAME_1);
+    when(columnMapping.getJdbcType()).thenReturn(JDBCType.BLOB.name());
 
     createPdxInstance();
 
@@ -319,14 +371,12 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getMetaData()).thenReturn(metaData);
     when(metaData.getColumnCount()).thenReturn(1);
     when(metaData.getColumnName(1)).thenReturn(COLUMN_NAME_1);
-    
when(tableMetaDataView.getColumnDataType(COLUMN_NAME_1)).thenReturn(JDBCType.BLOB);
     Blob blob = mock(Blob.class);
     when(blob.length()).thenReturn((long) Integer.MAX_VALUE + 1);
     when(resultSet.getBlob(1)).thenReturn(blob);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
-        .thenReturn(PDX_FIELD_NAME_1);
+    when(columnMapping.getJdbcType()).thenReturn(JDBCType.BLOB.name());
     thrown.expect(JdbcConnectorException.class);
     thrown.expectMessage("Blob of length 2147483648 is too big to be converted 
to a byte array.");
 
@@ -340,7 +390,6 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getMetaData()).thenReturn(metaData);
     when(metaData.getColumnCount()).thenReturn(1);
     when(metaData.getColumnName(1)).thenReturn(COLUMN_NAME_1);
-    
when(tableMetaDataView.getColumnDataType(COLUMN_NAME_1)).thenReturn(JDBCType.BLOB);
     byte[] expectedValue = new byte[] {1, 2, 3};
     Blob blob = mock(Blob.class);
     when(blob.length()).thenReturn((long) expectedValue.length);
@@ -348,8 +397,7 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getBlob(1)).thenReturn(blob);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
-        .thenReturn(PDX_FIELD_NAME_1);
+    when(columnMapping.getJdbcType()).thenReturn(JDBCType.BLOB.name());
 
     createPdxInstance();
 
@@ -364,14 +412,12 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getMetaData()).thenReturn(metaData);
     when(metaData.getColumnCount()).thenReturn(1);
     when(metaData.getColumnName(1)).thenReturn(COLUMN_NAME_1);
-    
when(tableMetaDataView.getColumnDataType(COLUMN_NAME_1)).thenReturn(JDBCType.TIME);
     java.sql.Time sqlTime = java.sql.Time.valueOf("22:33:44");
     Date expectedValue = new Date(sqlTime.getTime());
     when(resultSet.getTime(1)).thenReturn(sqlTime);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
-        .thenReturn(PDX_FIELD_NAME_1);
+    when(columnMapping.getJdbcType()).thenReturn(JDBCType.TIME.name());
 
     createPdxInstance();
 
@@ -386,14 +432,12 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getMetaData()).thenReturn(metaData);
     when(metaData.getColumnCount()).thenReturn(1);
     when(metaData.getColumnName(1)).thenReturn(COLUMN_NAME_1);
-    
when(tableMetaDataView.getColumnDataType(COLUMN_NAME_1)).thenReturn(JDBCType.TIMESTAMP);
     java.sql.Timestamp sqlTimestamp = java.sql.Timestamp.valueOf("1979-09-11 
22:33:44.567");
     Date expectedValue = new Date(sqlTimestamp.getTime());
     when(resultSet.getTimestamp(1)).thenReturn(sqlTimestamp);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
-        .thenReturn(PDX_FIELD_NAME_1);
+    when(columnMapping.getJdbcType()).thenReturn(JDBCType.TIMESTAMP.name());
 
     createPdxInstance();
 
@@ -413,8 +457,6 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getObject(1)).thenReturn(sqlDate);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
-        .thenReturn(PDX_FIELD_NAME_1);
 
     createPdxInstance();
 
@@ -433,8 +475,6 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getObject(1)).thenReturn(expectedValue);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
-        .thenReturn(PDX_FIELD_NAME_1);
 
     createPdxInstance();
 
@@ -454,8 +494,6 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getObject(1)).thenReturn(sqlTime);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
-        .thenReturn(PDX_FIELD_NAME_1);
 
     createPdxInstance();
 
@@ -475,8 +513,6 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getObject(1)).thenReturn(sqlTimestamp);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
-        .thenReturn(PDX_FIELD_NAME_1);
 
     createPdxInstance();
 
@@ -492,10 +528,6 @@ public class SqlToPdxInstanceCreatorTest {
     setupPdxInstanceFactory(fieldType);
     setupResultSetForObject(resultSet, returnValue);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
-        .thenReturn(PDX_FIELD_NAME_1);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_2)))
-        .thenReturn(PDX_FIELD_NAME_2);
     thrown.expect(JdbcConnectorException.class);
     thrown.expectMessage("Could not convert ");
 
@@ -510,62 +542,13 @@ public class SqlToPdxInstanceCreatorTest {
     PdxInstanceFactory factory = mock(PdxInstanceFactory.class);
     String pdxClassName = "myPdxClassName";
     when(cache.createPdxInstanceFactory(pdxClassName)).thenReturn(factory);
-    TypeRegistry pdxTypeRegistry = mock(TypeRegistry.class);
-    when(cache.getPdxRegistry()).thenReturn(pdxTypeRegistry);
-    PdxType pdxType = mock(PdxType.class);
     when(regionMapping.getPdxName()).thenReturn(pdxClassName);
-    when(pdxTypeRegistry.getPdxTypeForField(PDX_FIELD_NAME_1, 
pdxClassName)).thenReturn(pdxType);
-    PdxField pdxField = mock(PdxField.class);
-    when(pdxField.getFieldType()).thenReturn(FieldType.OBJECT);
-    when(pdxType.getPdxField(PDX_FIELD_NAME_1)).thenReturn(pdxField);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
-        .thenReturn(PDX_FIELD_NAME_1);
     thrown.expect(JdbcConnectorException.class);
     thrown.expectMessage("Multiple rows returned for query: ");
 
     createPdxInstance();
   }
 
-  @Test
-  public void readThrowsGivenPdxTypeWithFieldMissing() throws Exception {
-    setupResultSet(resultSet, FieldType.OBJECT);
-    when(resultSet.next()).thenReturn(true).thenReturn(false);
-    PdxInstanceFactory factory = mock(PdxInstanceFactory.class);
-    String pdxClassName = "myPdxClassName";
-    when(cache.createPdxInstanceFactory(pdxClassName)).thenReturn(factory);
-    TypeRegistry pdxTypeRegistry = mock(TypeRegistry.class);
-    when(cache.getPdxRegistry()).thenReturn(pdxTypeRegistry);
-    PdxType pdxType = mock(PdxType.class);
-    when(regionMapping.getPdxName()).thenReturn(pdxClassName);
-    when(pdxTypeRegistry.getPdxTypeForField(PDX_FIELD_NAME_1, 
pdxClassName)).thenReturn(pdxType);
-    when(pdxType.getPdxField(PDX_FIELD_NAME_1)).thenReturn(null);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
-        .thenReturn(PDX_FIELD_NAME_1);
-    thrown.expect(JdbcConnectorException.class);
-    thrown.expectMessage("Could not find PdxType");
-
-    createPdxInstance();
-  }
-
-  @Test
-  public void readThrowsWithMissingPdxType() throws Exception {
-    setupResultSet(resultSet, FieldType.OBJECT);
-    when(resultSet.next()).thenReturn(true).thenReturn(false);
-    PdxInstanceFactory factory = mock(PdxInstanceFactory.class);
-    String pdxClassName = "myPdxClassName";
-    when(cache.createPdxInstanceFactory(pdxClassName)).thenReturn(factory);
-    TypeRegistry pdxTypeRegistry = mock(TypeRegistry.class);
-    when(cache.getPdxRegistry()).thenReturn(pdxTypeRegistry);
-    when(regionMapping.getPdxName()).thenReturn(pdxClassName);
-    when(pdxTypeRegistry.getPdxTypeForField(PDX_FIELD_NAME_1, 
pdxClassName)).thenReturn(null);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
-        .thenReturn(PDX_FIELD_NAME_1);
-    thrown.expect(JdbcConnectorException.class);
-    thrown.expectMessage("Could not find PdxType");
-
-    createPdxInstance();
-  }
-
   private void setupResultSetForTwoObjectColumns(ResultSet result) throws 
SQLException {
     setupResultSet(result, FieldType.OBJECT);
     ResultSetMetaData metaData = mock(ResultSetMetaData.class);
@@ -726,15 +709,8 @@ public class SqlToPdxInstanceCreatorTest {
     String pdxClassName = "myPdxClassName";
     when(cache.createPdxInstanceFactory(pdxClassName)).thenReturn(factory);
 
-    TypeRegistry pdxTypeRegistry = mock(TypeRegistry.class);
-    when(cache.getPdxRegistry()).thenReturn(pdxTypeRegistry);
-    PdxType pdxType = mock(PdxType.class);
-
     when(regionMapping.getPdxName()).thenReturn(pdxClassName);
-    when(pdxTypeRegistry.getPdxTypeForField(PDX_FIELD_NAME_1, 
pdxClassName)).thenReturn(pdxType);
-    PdxField pdxField = mock(PdxField.class);
-    when(pdxType.getPdxField(PDX_FIELD_NAME_1)).thenReturn(pdxField);
-    when(pdxField.getFieldType()).thenReturn(fieldType);
+    when(columnMapping.getPdxType()).thenReturn(fieldType.name());
 
     return factory;
   }
diff --git 
a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingPreconditionCheckFunctionTest.java
 
b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingPreconditionCheckFunctionTest.java
index 01e87e9..801f9eb 100644
--- 
a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingPreconditionCheckFunctionTest.java
+++ 
b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingPreconditionCheckFunctionTest.java
@@ -26,7 +26,6 @@ import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.Set;
 
@@ -48,7 +47,6 @@ import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.pdx.FieldType;
 import org.apache.geode.pdx.internal.PdxField;
-import org.apache.geode.pdx.internal.PdxType;
 import org.apache.geode.pdx.internal.TypeRegistry;
 
 public class CreateMappingPreconditionCheckFunctionTest {
@@ -179,53 +177,16 @@ public class CreateMappingPreconditionCheckFunctionTest {
   }
 
   @Test
-  public void 
executeFunctionReturnsFieldMappingsThatMatchTableMetaDataAndExistingPdxType()
-      throws Exception {
-    Set<String> columnNames = new LinkedHashSet<>(Arrays.asList("col1", 
"col2"));
-    when(tableMetaDataView.getColumnNames()).thenReturn(columnNames);
-    when(tableMetaDataView.isColumnNullable("col1")).thenReturn(false);
-    
when(tableMetaDataView.getColumnDataType("col1")).thenReturn(JDBCType.DATE);
-    when(tableMetaDataView.isColumnNullable("col2")).thenReturn(true);
-    
when(tableMetaDataView.getColumnDataType("col2")).thenReturn(JDBCType.DATE);
-    PdxType pdxType = mock(PdxType.class);
-    PdxField pdxField1 = mock(PdxField.class);
-    when(pdxField1.getFieldName()).thenReturn("pdxField1");
-    when(pdxField1.getFieldType()).thenReturn(FieldType.LONG);
-    when(pdxType.getPdxField("col1")).thenReturn(pdxField1);
-    Set<PdxType> pdxTypes = new HashSet<>(Arrays.asList(pdxType));
-    
when(typeRegistry.getPdxTypesForClassName(PDX_CLASS_NAME)).thenReturn(pdxTypes);
-
-    CliFunctionResult result = function.executeFunction(context);
-
-    assertThat(result.isSuccessful()).isTrue();
-    Object[] outputs = (Object[]) result.getResultObject();
-    ArrayList<FieldMapping> fieldsMappings = (ArrayList<FieldMapping>) 
outputs[1];
-    assertThat(fieldsMappings).hasSize(2);
-    assertThat(fieldsMappings.get(0))
-        .isEqualTo(
-            new FieldMapping("pdxField1", FieldType.LONG.name(), "col1", 
JDBCType.DATE.name(),
-                false));
-    assertThat(fieldsMappings.get(1))
-        .isEqualTo(
-            new FieldMapping("", "", "col2", JDBCType.DATE.name(), true));
-  }
-
-  @Test
-  public void 
executeFunctionReturnsFieldMappingsThatMatchTableMetaDataAndExistingPdxTypeWithInexactMatch()
+  public void 
executeFunctionReturnsFieldMappingsThatMatchTableMetaDataAndExistingPdxField()
       throws Exception {
     Set<String> columnNames = new LinkedHashSet<>(Arrays.asList("col1"));
     when(tableMetaDataView.getColumnNames()).thenReturn(columnNames);
     when(tableMetaDataView.isColumnNullable("col1")).thenReturn(false);
     
when(tableMetaDataView.getColumnDataType("col1")).thenReturn(JDBCType.DATE);
-    PdxType pdxType = mock(PdxType.class);
     PdxField pdxField1 = mock(PdxField.class);
     when(pdxField1.getFieldName()).thenReturn("COL1");
     when(pdxField1.getFieldType()).thenReturn(FieldType.LONG);
-    when(pdxType.getPdxField("col1")).thenReturn(null);
-    when(pdxType.getFieldNames()).thenReturn(Arrays.asList("someOtherField", 
"COL1"));
-    when(pdxType.getPdxField("COL1")).thenReturn(pdxField1);
-    Set<PdxType> pdxTypes = new HashSet<>(Arrays.asList(pdxType));
-    
when(typeRegistry.getPdxTypesForClassName(PDX_CLASS_NAME)).thenReturn(pdxTypes);
+    when(typeRegistry.findFieldThatMatchesName(PDX_CLASS_NAME, 
"col1")).thenReturn(pdxField1);
 
     CliFunctionResult result = function.executeFunction(context);
 
@@ -245,16 +206,14 @@ public class CreateMappingPreconditionCheckFunctionTest {
     when(tableMetaDataView.getColumnNames()).thenReturn(columnNames);
     when(tableMetaDataView.isColumnNullable("col1")).thenReturn(false);
     
when(tableMetaDataView.getColumnDataType("col1")).thenReturn(JDBCType.DATE);
-    PdxType pdxType = mock(PdxType.class);
-    when(pdxType.getFieldNames()).thenReturn(Arrays.asList("Col1", "COL1"));
-    Set<PdxType> pdxTypes = new HashSet<>(Arrays.asList(pdxType));
-    
when(typeRegistry.getPdxTypesForClassName(PDX_CLASS_NAME)).thenReturn(pdxTypes);
+    when(typeRegistry.findFieldThatMatchesName(PDX_CLASS_NAME, "col1"))
+        .thenThrow(new IllegalStateException("reason"));
 
     Throwable throwable = catchThrowable(() -> 
function.executeFunction(context));
 
     assertThat(throwable).isInstanceOf(JdbcConnectorException.class)
-        .hasMessage("Could not determine what pdx field to use for the column 
name col1"
-            + " because the pdx fields Col1, COL1 all match it.");
+        .hasMessage(
+            "Could not determine what pdx field to use for the column name 
col1 because reason");
   }
 
   @Test
diff --git 
a/geode-core/src/main/java/org/apache/geode/pdx/internal/TypeRegistry.java 
b/geode-core/src/main/java/org/apache/geode/pdx/internal/TypeRegistry.java
index 4fb691c..58bbaaf 100644
--- a/geode-core/src/main/java/org/apache/geode/pdx/internal/TypeRegistry.java
+++ b/geode-core/src/main/java/org/apache/geode/pdx/internal/TypeRegistry.java
@@ -16,6 +16,7 @@ package org.apache.geode.pdx.internal;
 
 import static java.lang.Integer.valueOf;
 
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicReference;
@@ -538,4 +539,57 @@ public class TypeRegistry {
   public void setPdxReadSerializedOverride(boolean overridePdxReadSerialized) {
     pdxReadSerializedOverride.set(overridePdxReadSerialized);
   }
+
+  /**
+   * Find and return the pdx field that matches the given name.
+   * An exact match will be looked for first; followed by a
+   * case insensitive match.
+   *
+   * @param pdxClassName the pdx type's class
+   * @param name the name of the field to find
+   * @return PdxField that matches name or null if no match
+   * @throws IllegalStateException if more than one field matched
+   */
+  public PdxField findFieldThatMatchesName(String pdxClassName, String name) {
+    Set<PdxType> pdxTypes = getPdxTypesForClassName(pdxClassName);
+    if (pdxTypes.isEmpty()) {
+      return null;
+    }
+    PdxField foundField = findExactMatch(name, pdxTypes);
+    if (foundField == null) {
+      foundField = findCaseInsensitiveMatch(name, pdxTypes);
+    }
+    return foundField;
+  }
+
+
+  private PdxField findCaseInsensitiveMatch(String name, Set<PdxType> 
pdxTypes) {
+    HashSet<String> matchingFieldNames = new HashSet<>();
+    for (PdxType pdxType : pdxTypes) {
+      for (String existingFieldName : pdxType.getFieldNames()) {
+        if (existingFieldName.equalsIgnoreCase(name)) {
+          matchingFieldNames.add(existingFieldName);
+        }
+      }
+    }
+    if (matchingFieldNames.isEmpty()) {
+      return null;
+    } else if (matchingFieldNames.size() > 1) {
+      throw new IllegalStateException(
+          "the pdx fields " + String.join(", ", matchingFieldNames) + " all 
match " + name);
+    }
+    String matchingFieldName = matchingFieldNames.iterator().next();
+    return findExactMatch(matchingFieldName, pdxTypes);
+  }
+
+  private PdxField findExactMatch(String name, Set<PdxType> pdxTypes) {
+    for (PdxType pdxType : pdxTypes) {
+      PdxField foundField = pdxType.getPdxField(name);
+      if (foundField != null) {
+        return foundField;
+      }
+    }
+    return null;
+  }
+
 }

Reply via email to