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

arjansh pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/metamodel.git

commit f27fc05b35167b5bd3fc44a3ff2c6c7e20565c8c
Author: Tim Kingsbury <tim.kingsb...@sas.com>
AuthorDate: Tue Jun 30 14:36:15 2020 -0400

    (METAMODEL-1226) Metadata for numeric data types does not include number of 
digits
---
 .../java/org/apache/metamodel/schema/Column.java   |  8 ++
 .../apache/metamodel/schema/ImmutableColumn.java   | 12 ++-
 .../org/apache/metamodel/schema/MutableColumn.java | 14 +++-
 .../builder/SingleMapColumnSchemaBuilder.java      |  2 +-
 .../create/AbstractCreateTableBuilderTest.java     |  2 +-
 .../org/apache/metamodel/query/FilterItemTest.java |  4 +-
 .../java/org/apache/metamodel/csv/CsvTable.java    |  2 +-
 .../apache/metamodel/jdbc/JdbcMetadataLoader.java  | 88 ++++++++++++----------
 .../mongo2/MongoDbTableCreationBuilder.java        |  2 +-
 .../mongo3/MongoDbTableCreationBuilder.java        |  2 +-
 10 files changed, 84 insertions(+), 52 deletions(-)

diff --git a/core/src/main/java/org/apache/metamodel/schema/Column.java 
b/core/src/main/java/org/apache/metamodel/schema/Column.java
index d27e791..1459feb 100644
--- a/core/src/main/java/org/apache/metamodel/schema/Column.java
+++ b/core/src/main/java/org/apache/metamodel/schema/Column.java
@@ -86,6 +86,14 @@ public interface Column extends Comparable<Column>, 
Serializable, NamedStructure
     public Integer getColumnSize();
 
     /**
+     * Gets the number of decimal digits this column.
+     *
+     * @return the number of decimal digits for this column or null if the 
size is not
+     *         determined or known.
+     */
+    public Integer getDecimalDigits();
+
+    /**
      * Gets the native type of this column. A native type is the name of the
      * data type as defined in the datastore.
      * 
diff --git 
a/core/src/main/java/org/apache/metamodel/schema/ImmutableColumn.java 
b/core/src/main/java/org/apache/metamodel/schema/ImmutableColumn.java
index c7e4387..679869b 100644
--- a/core/src/main/java/org/apache/metamodel/schema/ImmutableColumn.java
+++ b/core/src/main/java/org/apache/metamodel/schema/ImmutableColumn.java
@@ -38,6 +38,7 @@ public final class ImmutableColumn extends AbstractColumn 
implements Serializabl
     private final Boolean nullable;
     private final String remarks;
     private final Integer columnSize;
+    private final Integer decimalDigits;
     private final String nativeType;
     private final boolean indexed;
     private final boolean primaryKey;
@@ -71,12 +72,13 @@ public final class ImmutableColumn extends AbstractColumn 
implements Serializabl
      *            whether the column is a primary key or not
      */
     public ImmutableColumn(String name, ColumnType type, Table table, int 
columnNumber, Integer columnSize,
-            String nativeType, Boolean nullable, String remarks, boolean 
indexed, String quote, boolean primaryKey) {
+                           Integer decimalDigits, String nativeType, Boolean 
nullable, String remarks, boolean indexed, String quote, boolean primaryKey) {
         this.name = name;
         this.type = type;
         this.table = table;
         this.columnNumber = columnNumber;
         this.columnSize = columnSize;
+        this.decimalDigits = decimalDigits;
         this.nativeType = nativeType;
         this.nullable = nullable;
         this.remarks = remarks;
@@ -100,6 +102,7 @@ public final class ImmutableColumn extends AbstractColumn 
implements Serializabl
         this.table = table;
         this.columnNumber = column.getColumnNumber();
         this.columnSize = column.getColumnSize();
+        this.decimalDigits = column.getDecimalDigits();
         this.nativeType = column.getNativeType();
         this.nullable = column.isNullable();
         this.remarks = column.getRemarks();
@@ -109,8 +112,8 @@ public final class ImmutableColumn extends AbstractColumn 
implements Serializabl
     }
 
     protected ImmutableColumn(Column column, ImmutableTable table) {
-        this(column.getName(), column.getType(), table, 
column.getColumnNumber(), column.getColumnSize(), column
-                .getNativeType(), column.isNullable(), column.getRemarks(), 
column.isIndexed(), column.getQuote(),
+        this(column.getName(), column.getType(), table, 
column.getColumnNumber(), column.getColumnSize(), column.getDecimalDigits(),
+             column.getNativeType(), column.isNullable(), column.getRemarks(), 
column.isIndexed(), column.getQuote(),
                 column.isPrimaryKey());
     }
 
@@ -145,6 +148,9 @@ public final class ImmutableColumn extends AbstractColumn 
implements Serializabl
     }
 
     @Override
+    public Integer getDecimalDigits() { return decimalDigits; }
+
+    @Override
     public String getNativeType() {
         return nativeType;
     }
diff --git a/core/src/main/java/org/apache/metamodel/schema/MutableColumn.java 
b/core/src/main/java/org/apache/metamodel/schema/MutableColumn.java
index b1b6346..da7e195 100644
--- a/core/src/main/java/org/apache/metamodel/schema/MutableColumn.java
+++ b/core/src/main/java/org/apache/metamodel/schema/MutableColumn.java
@@ -39,6 +39,7 @@ public class MutableColumn extends AbstractColumn implements 
Serializable {
     private boolean _indexed = false;
     private boolean _primaryKey = false;
     private Integer _columnSize = null;
+    private Integer _decimalDigits = null;
     private String _nativeType = null;
     private String _quoteString = null;
 
@@ -70,9 +71,10 @@ public class MutableColumn extends AbstractColumn implements 
Serializable {
     }
 
     public MutableColumn(String name, ColumnType type, Table table, int 
columnNumber, Integer columnSize,
-            String nativeType, Boolean nullable, String remarks, boolean 
indexed, String quote) {
+                         Integer decimalDigits, String nativeType, Boolean 
nullable, String remarks, boolean indexed, String quote) {
         this(name, type, table, columnNumber, nullable);
         setColumnSize(columnSize);
+        setDecimalDigits(decimalDigits);
         setNativeType(nativeType);
         setRemarks(remarks);
         setIndexed(indexed);
@@ -145,6 +147,16 @@ public class MutableColumn extends AbstractColumn 
implements Serializable {
     }
 
     @Override
+    public Integer getDecimalDigits() {
+        return _decimalDigits;
+    }
+
+    public MutableColumn setDecimalDigits(Integer decimalDigits) {
+        _decimalDigits = decimalDigits;
+        return this;
+    }
+
+    @Override
     public Integer getColumnSize() {
         return _columnSize;
     }
diff --git 
a/core/src/main/java/org/apache/metamodel/schema/builder/SingleMapColumnSchemaBuilder.java
 
b/core/src/main/java/org/apache/metamodel/schema/builder/SingleMapColumnSchemaBuilder.java
index 440f69e..e7effe8 100644
--- 
a/core/src/main/java/org/apache/metamodel/schema/builder/SingleMapColumnSchemaBuilder.java
+++ 
b/core/src/main/java/org/apache/metamodel/schema/builder/SingleMapColumnSchemaBuilder.java
@@ -67,7 +67,7 @@ public class SingleMapColumnSchemaBuilder implements 
SchemaBuilder, DocumentConv
     public MutableSchema build() {
         MutableSchema schema = new MutableSchema(_schemaName);
         MutableTable table = new MutableTable(_tableName, schema);
-        table.addColumn(new MutableColumn(_columnName, ColumnType.MAP, table, 
1, null, null, false, null, false, null));
+        table.addColumn(new MutableColumn(_columnName, ColumnType.MAP, table, 
1, null, null, null, false, null, false, null));
         schema.addTable(table);
         return schema;
     }
diff --git 
a/core/src/test/java/org/apache/metamodel/create/AbstractCreateTableBuilderTest.java
 
b/core/src/test/java/org/apache/metamodel/create/AbstractCreateTableBuilderTest.java
index e108277..d95a1b0 100644
--- 
a/core/src/test/java/org/apache/metamodel/create/AbstractCreateTableBuilderTest.java
+++ 
b/core/src/test/java/org/apache/metamodel/create/AbstractCreateTableBuilderTest.java
@@ -83,7 +83,7 @@ public class AbstractCreateTableBuilderTest extends TestCase {
         assertFalse(executed.get().booleanValue());
 
         MutableTable likeTable = new MutableTable("blablablabla");
-        likeTable.addColumn(new MutableColumn("foo", ColumnType.VARCHAR, 
likeTable, 0, 1234, "vch", true, null, false,
+        likeTable.addColumn(new MutableColumn("foo", ColumnType.VARCHAR, 
likeTable, 0, 1234, null, "vch", true, null, false,
                 null).setPrimaryKey(true));
         likeTable.addColumn(new MutableColumn("bar"));
         likeTable.addColumn(new MutableColumn("baz"));
diff --git a/core/src/test/java/org/apache/metamodel/query/FilterItemTest.java 
b/core/src/test/java/org/apache/metamodel/query/FilterItemTest.java
index ab549b0..0eea4e2 100644
--- a/core/src/test/java/org/apache/metamodel/query/FilterItemTest.java
+++ b/core/src/test/java/org/apache/metamodel/query/FilterItemTest.java
@@ -414,7 +414,7 @@ public class FilterItemTest extends TestCase {
     }
 
     public void testInOperandSql() throws Exception {
-        SelectItem selectItem = new SelectItem(new MutableColumn("foo", 
ColumnType.VARCHAR, null, 1, null, null, true,
+        SelectItem selectItem = new SelectItem(new MutableColumn("foo", 
ColumnType.VARCHAR, null, 1, null, null, null, true,
                 null, false, null));
         Object operand = new String[] { "foo", "bar" };
         assertEquals("foo IN ('foo' , 'bar')", new FilterItem(selectItem, 
OperatorType.IN, operand).toSql());
@@ -458,7 +458,7 @@ public class FilterItemTest extends TestCase {
     }
 
     public void testInOperandEvaluate() throws Exception {
-        SelectItem selectItem = new SelectItem(new MutableColumn("foo", 
ColumnType.VARCHAR, null, 1, null, null, true,
+        SelectItem selectItem = new SelectItem(new MutableColumn("foo", 
ColumnType.VARCHAR, null, 1, null, null, null, true,
                 null, false, null));
         Object operand = new String[] { "foo", "bar" };
 
diff --git a/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java 
b/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java
index 5e0081c..45f94c8 100644
--- a/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java
+++ b/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java
@@ -134,7 +134,7 @@ final class CsvTable extends AbstractTable {
                         : columnNames.get(i);
                 final String columnName = namingSession.getNextColumnName(new 
ColumnNamingContextImpl(this,
                         intrinsicColumnName, i));
-                final Column column = new MutableColumn(columnName, 
ColumnType.STRING, this, i, null, null, nullable,
+                final Column column = new MutableColumn(columnName, 
ColumnType.STRING, this, i, null, null, null, nullable,
                         null, false, null);
                 columns.add(column);
             }
diff --git 
a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcMetadataLoader.java 
b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcMetadataLoader.java
index a57fbad..9b85df9 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcMetadataLoader.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcMetadataLoader.java
@@ -327,47 +327,7 @@ final class JdbcMetadataLoader implements MetadataLoader {
 
             while (rs.next()) {
                 columnNumber++;
-                final String columnName = rs.getString(4);
-                if (_identifierQuoteString == null && new 
StringTokenizer(columnName).countTokens() > 1) {
-                    logger.warn("column name contains whitespace: \"" + 
columnName + "\".");
-                }
-
-                final int jdbcType = rs.getInt(5);
-                final String nativeType = rs.getString(6);
-                final Integer columnSize = rs.getInt(7);
-
-                if (logger.isDebugEnabled()) {
-                    logger.debug("Found column: table=" + table.getName() + 
",columnName=" + columnName + ",nativeType="
-                            + nativeType + ",columnSize=" + columnSize);
-                }
-
-                ColumnType columnType = 
_dataContext.getQueryRewriter().getColumnType(jdbcType, nativeType, columnSize);
-                if (convertLobs) {
-                    if (columnType == ColumnType.CLOB || columnType == 
ColumnType.NCLOB) {
-                        columnType = 
JdbcDataContext.COLUMN_TYPE_CLOB_AS_STRING;
-                    } else if (columnType == ColumnType.BLOB) {
-                        columnType = JdbcDataContext.COLUMN_TYPE_BLOB_AS_BYTES;
-                    }
-                }
-
-                final int jdbcNullable = rs.getInt(11);
-                final Boolean nullable;
-                if (jdbcNullable == DatabaseMetaData.columnNullable) {
-                    nullable = true;
-                } else if (jdbcNullable == DatabaseMetaData.columnNoNulls) {
-                    nullable = false;
-                } else {
-                    nullable = null;
-                }
-
-                final String remarks = rs.getString(12);
-
-                final JdbcColumn column = new JdbcColumn(columnName, 
columnType, table, columnNumber, nullable);
-                column.setRemarks(remarks);
-                column.setNativeType(nativeType);
-                column.setColumnSize(columnSize);
-                column.setQuote(_identifierQuoteString);
-                table.addColumn(column);
+                processColumn(table, convertLobs, rs, columnNumber);
             }
 
             final int columnsReturned = columnNumber + 1;
@@ -383,6 +343,52 @@ final class JdbcMetadataLoader implements MetadataLoader {
         }
     }
 
+    private void processColumn(JdbcTable table, boolean convertLobs, ResultSet 
rs, int columnNumber) throws SQLException {
+        final String columnName = rs.getString(4);
+        if (_identifierQuoteString == null && new 
StringTokenizer(columnName).countTokens() > 1) {
+            logger.warn("column name contains whitespace: \"" + columnName + 
"\".");
+        }
+
+        final int jdbcType = rs.getInt(5);
+        final String nativeType = rs.getString(6);
+        final Integer columnSize = rs.getInt(7);
+        Integer decimalDigits = rs.getInt(9);
+
+        if (logger.isDebugEnabled()) {
+            logger.debug("Found column: table=" + table.getName() + 
",columnName=" + columnName + ",nativeType="
+                    + nativeType + ",columnSize=" + columnSize);
+        }
+
+        ColumnType columnType = 
_dataContext.getQueryRewriter().getColumnType(jdbcType, nativeType, columnSize);
+        if (convertLobs) {
+            if (columnType == ColumnType.CLOB || columnType == 
ColumnType.NCLOB) {
+                columnType = JdbcDataContext.COLUMN_TYPE_CLOB_AS_STRING;
+            } else if (columnType == ColumnType.BLOB) {
+                columnType = JdbcDataContext.COLUMN_TYPE_BLOB_AS_BYTES;
+            }
+        }
+
+        final int jdbcNullable = rs.getInt(11);
+        final Boolean nullable;
+        if (jdbcNullable == DatabaseMetaData.columnNullable) {
+            nullable = true;
+        } else if (jdbcNullable == DatabaseMetaData.columnNoNulls) {
+            nullable = false;
+        } else {
+            nullable = null;
+        }
+
+        final String remarks = rs.getString(12);
+
+        final JdbcColumn column = new JdbcColumn(columnName, columnType, 
table, columnNumber, nullable);
+        column.setRemarks(remarks);
+        column.setNativeType(nativeType);
+        column.setColumnSize(columnSize);
+        column.setDecimalDigits(decimalDigits);
+        column.setQuote(_identifierQuoteString);
+        table.addColumn(column);
+    }
+
     @Override
     public void loadRelations(JdbcSchema jdbcSchema) {
         final int identity = System.identityHashCode(jdbcSchema);
diff --git 
a/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbTableCreationBuilder.java
 
b/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbTableCreationBuilder.java
index c93acf1..816078b 100644
--- 
a/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbTableCreationBuilder.java
+++ 
b/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbTableCreationBuilder.java
@@ -46,7 +46,7 @@ final class MongoDbTableCreationBuilder extends
                        // all mongo db collections have an _id field as the 
first field.
                        ImmutableColumn idColumn = new ImmutableColumn("_id",
                                        ColumnType.ROWID, table, 
table.getColumnCount(), null,
-                                       null, null, null, true, null, true);
+                                       null, null, null, null, true, null, 
true);
                        table.addColumn(idColumn);
                }
                table.setSchema(schema);
diff --git 
a/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbTableCreationBuilder.java
 
b/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbTableCreationBuilder.java
index aaec48e..2f41eee 100644
--- 
a/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbTableCreationBuilder.java
+++ 
b/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbTableCreationBuilder.java
@@ -46,7 +46,7 @@ final class MongoDbTableCreationBuilder extends
                        // all mongo db collections have an _id field as the 
first field.
                        ImmutableColumn idColumn = new ImmutableColumn("_id",
                                        ColumnType.ROWID, table, 
table.getColumnCount(), null,
-                                       null, null, null, true, null, true);
+                                       null, null, null, null, true, null, 
true);
                        table.addColumn(idColumn);
                }
                table.setSchema(schema);

Reply via email to