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);