Changeset 479


Ignore:
Timestamp:
07/22/08 15:26:07 (2 years ago)
Author:
kasper
Message:

Ticket #176: Added native type labels for XML-based columns

Location:
commons/MetaModel/trunk/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • commons/MetaModel/trunk/src/main/java/dk/eobjects/metamodel/XmlDataContextStrategy.java

    r478 r479  
    5454public class XmlDataContextStrategy extends QueryPostprocessDataContextStrategy { 
    5555 
     56        public static final String NATIVE_TYPE_PRIMARY_KEY = "Auto-generated primary key"; 
     57        public static final String NATIVE_TYPE_FOREIGN_KEY = "Auto-generated foreign key"; 
     58        public static final String NATIVE_TYPE_ATTRIBUTE = "XML Attribute"; 
     59        public static final String NATIVE_TYPE_TEXT = "XML Text"; 
    5660        private static final String TEXT_CONTENT_TEMP_SUFFIX = "_metamodel_text_content"; 
    5761        private static final Log _log = LogFactory 
     
    6064        private Schema _schema; 
    6165        private Map<String, List<Object[]>> _tableData; 
    62         private Map<String, Column> _idColumns; 
    63         private Map<String, Column> _textContentColumns; 
    6466        private boolean _autoFlattenTables; 
    6567 
     
    145147                        _schema = new Schema(_file.getName()); 
    146148                        _tableData = new HashMap<String, List<Object[]>>(); 
    147                         _idColumns = new HashMap<String, Column>(); 
    148                         _textContentColumns = new HashMap<String, Column>(); 
    149149                        try { 
    150150                                DocumentBuilderFactory dbf = DocumentBuilderFactory 
     
    168168                                                // Rename all ID columns to reasonable names (preferably 
    169169                                                // "id") 
    170                                                 Column idColumn = _idColumns.get(tableName); 
     170                                                Column idColumn = getIdColumn(table); 
    171171                                                Column column = table.getColumnByName("id"); 
    172172                                                if (column == null) { 
     
    175175 
    176176                                                // Remove text content column, if it is never populated 
    177                                                 Column textContentColumn = _textContentColumns 
    178                                                                 .get(tableName); 
     177                                                Column textContentColumn = getTextContentColumn(table, 
     178                                                                null); 
    179179                                                int textContentColumnIndex = textContentColumn 
    180180                                                                .getColumnNumber(); 
     
    188188                                                if (!found) { 
    189189                                                        table.removeColumn(textContentColumn); 
    190                                                         _textContentColumns.remove(tableName); 
    191190                                                } else { 
    192191                                                        // Rename all text content columns to reasonable 
     
    239238                                                                        .getType(), table, table.getColumnCount(), 
    240239                                                        false); 
     240                                        foreignKeyColumn.setNativeType(NATIVE_TYPE_FOREIGN_KEY); 
    241241                                        table.addColumn(foreignKeyColumn); 
    242242 
     
    269269                                        column = new Column(name, ColumnType.VARCHAR, table, table 
    270270                                                        .getColumnCount(), true); 
     271                                        column.setNativeType(NATIVE_TYPE_ATTRIBUTE); 
    271272                                        table.addColumn(column); 
    272273                                } 
     
    316317 
    317318        private Column getTextContentColumn(Table table, String preferredColumnName) { 
    318                 String tableName = table.getName(); 
    319                 Column column = _textContentColumns.get(tableName); 
    320                 if (column == null) { 
    321                         _log.info("Creating text content column for table: " + tableName); 
     319                Column[] columns = table.getColumns(); 
     320                Column column = null; 
     321                for (Column col : columns) { 
     322                        if (NATIVE_TYPE_TEXT.equals(col.getNativeType())) { 
     323                                column = col; 
     324                                break; 
     325                        } 
     326                } 
     327                if (column == null && preferredColumnName != null) { 
     328                        _log.info("Creating text content column for table: " 
     329                                        + table.getName()); 
    322330                        column = new Column(preferredColumnName + TEXT_CONTENT_TEMP_SUFFIX, 
    323331                                        ColumnType.VARBINARY, table, table.getColumnCount(), true); 
     332                        column.setNativeType(NATIVE_TYPE_TEXT); 
    324333                        table.addColumn(column); 
    325                         _textContentColumns.put(tableName, column); 
    326334                } 
    327335                return column; 
     
    329337 
    330338        private Column getIdColumn(Table table) { 
    331                 String tableName = table.getName(); 
    332                 Column column = _idColumns.get(tableName); 
     339                Column[] columns = table.getColumns(); 
     340                Column column = null; 
     341                for (Column col : columns) { 
     342                        if (NATIVE_TYPE_PRIMARY_KEY.equals(col.getNativeType())) { 
     343                                column = col; 
     344                                break; 
     345                        } 
     346                } 
    333347                if (column == null) { 
     348                        String tableName = table.getName(); 
    334349                        _log.info("Creating id column for table: " + tableName); 
    335350                        column = new Column(tableName + "_metamodel_surrogate_id", 
    336351                                        ColumnType.INTEGER, table, table.getColumnCount(), false); 
     352                        column.setNativeType(NATIVE_TYPE_PRIMARY_KEY); 
    337353                        column.setIndexed(true); 
    338354                        table.addColumn(column); 
    339                         _idColumns.put(tableName, column); 
    340355                } 
    341356                return column; 
     
    414429                // Remove the surrogate id 
    415430                String foreignTableName = foreignTable.getName(); 
    416                 Column idColumn = _idColumns.get(foreignTableName); 
     431                Column idColumn = getIdColumn(foreignTable); 
    417432                foreignColumns.remove(idColumn); 
    418433 
     
    445460                foreignTable.getSchema().removeTable(foreignTable); 
    446461                _tableData.remove(foreignTableName); 
    447                 _idColumns.remove(foreignTableName); 
    448                 _textContentColumns.remove(foreignTableName); 
    449462                relationship.remove(); 
    450463        } 
     
    456469                                        .getForeignKeyRelationships(); 
    457470                        if (foreignKeyRelationships.length == 1) { 
    458                                 String tableName = table.getName(); 
    459                                 int nonDataColumns = 1; 
    460                                 if (_idColumns.containsKey(tableName)) { 
    461                                         nonDataColumns++; 
    462                                 } 
     471                                int nonDataColumns = 0; 
     472                                Column[] columns = table.getColumns(); 
     473                                for (Column column : columns) { 
     474                                        String nativeType = column.getNativeType(); 
     475                                        if (NATIVE_TYPE_FOREIGN_KEY.equals(nativeType) 
     476                                                        || NATIVE_TYPE_PRIMARY_KEY.equals(nativeType)) { 
     477                                                nonDataColumns++; 
     478                                        } 
     479                                } 
     480 
    463481                                // If there is only one data carrying column in the table and 
    464482                                // the foreign key is unique for all rows, we 
    465483                                // will flatten it 
    466                                 if (table.getColumnCount() == nonDataColumns + 1) { 
     484                                if (columns.length == nonDataColumns + 1) { 
    467485                                        boolean uniqueForeignKeys = true; 
    468486 
  • commons/MetaModel/trunk/src/test/java/dk/eobjects/metamodel/XmlDataContextStrategyTest.java

    r478 r479  
    6262                assertEquals(2, table.getColumnCount()); 
    6363                assertEquals( 
    64                                 "{Column[name=id,columnNumber=0,type=INTEGER,nullable=false,indexed=true,nativeType=<null>,columnSize=<null>]," 
    65                                                 + "Column[name=website,columnNumber=2,type=VARCHAR,nullable=true,indexed=false,nativeType=<null>,columnSize=<null>]}", 
     64                                "{Column[name=id,columnNumber=0,type=INTEGER,nullable=false,indexed=true,nativeType=Auto-generated primary key,columnSize=<null>]," 
     65                                                + "Column[name=website,columnNumber=2,type=VARCHAR,nullable=true,indexed=false,nativeType=XML Attribute,columnSize=<null>]}", 
    6666                                ArrayUtils.toString(table.getColumns())); 
    6767 
     
    6969                assertEquals(1, table.getColumnCount()); 
    7070                assertEquals( 
    71                                 "{Column[name=id,columnNumber=0,type=INTEGER,nullable=false,indexed=true,nativeType=<null>,columnSize=<null>]}", 
     71                                "{Column[name=id,columnNumber=0,type=INTEGER,nullable=false,indexed=true,nativeType=Auto-generated primary key,columnSize=<null>]}", 
    7272                                ArrayUtils.toString(table.getColumns())); 
    7373 
     
    7575                assertEquals(3, table.getColumnCount()); 
    7676                assertEquals( 
    77                                 "{Column[name=id,columnNumber=0,type=INTEGER,nullable=false,indexed=true,nativeType=<null>,columnSize=<null>]," 
    78                                                 + "Column[name=contributors_person_id,columnNumber=1,type=INTEGER,nullable=false,indexed=false,nativeType=<null>,columnSize=<null>]," 
    79                                                 + "Column[name=name,columnNumber=2,type=VARBINARY,nullable=true,indexed=false,nativeType=<null>,columnSize=<null>]}", 
     77                                "{Column[name=id,columnNumber=0,type=INTEGER,nullable=false,indexed=true,nativeType=Auto-generated primary key,columnSize=<null>]," 
     78                                                + "Column[name=contributors_person_id,columnNumber=1,type=INTEGER,nullable=false,indexed=false,nativeType=Auto-generated foreign key,columnSize=<null>]," 
     79                                                + "Column[name=name,columnNumber=2,type=VARBINARY,nullable=true,indexed=false,nativeType=XML Text,columnSize=<null>]}", 
    8080                                ArrayUtils.toString(table.getColumns())); 
    8181                assertEquals( 
     
    8787                assertEquals(3, table.getColumnCount()); 
    8888                assertEquals( 
    89                                 "{Column[name=id,columnNumber=0,type=INTEGER,nullable=false,indexed=true,nativeType=<null>,columnSize=<null>]," 
    90                                                 + "Column[name=contributors_person_id,columnNumber=1,type=INTEGER,nullable=false,indexed=false,nativeType=<null>,columnSize=<null>]," 
    91                                                 + "Column[name=address,columnNumber=2,type=VARBINARY,nullable=true,indexed=false,nativeType=<null>,columnSize=<null>]}", 
     89                                "{Column[name=id,columnNumber=0,type=INTEGER,nullable=false,indexed=true,nativeType=Auto-generated primary key,columnSize=<null>]," 
     90                                                + "Column[name=contributors_person_id,columnNumber=1,type=INTEGER,nullable=false,indexed=false,nativeType=Auto-generated foreign key,columnSize=<null>]," 
     91                                                + "Column[name=address,columnNumber=2,type=VARBINARY,nullable=true,indexed=false,nativeType=XML Text,columnSize=<null>]}", 
    9292                                ArrayUtils.toString(table.getColumns())); 
    9393                assertEquals( 
     
    9999                assertEquals(3, table.getColumnCount()); 
    100100                assertEquals( 
    101                                 "{Column[name=id,columnNumber=0,type=INTEGER,nullable=false,indexed=true,nativeType=<null>,columnSize=<null>]," 
    102                                                 + "Column[name=project,columnNumber=1,type=VARBINARY,nullable=true,indexed=false,nativeType=<null>,columnSize=<null>]," 
    103                                                 + "Column[name=name,columnNumber=2,type=VARCHAR,nullable=true,indexed=false,nativeType=<null>,columnSize=<null>]}", 
     101                                "{Column[name=id,columnNumber=0,type=INTEGER,nullable=false,indexed=true,nativeType=Auto-generated primary key,columnSize=<null>]," 
     102                                                + "Column[name=project,columnNumber=1,type=VARBINARY,nullable=true,indexed=false,nativeType=XML Text,columnSize=<null>]," 
     103                                                + "Column[name=name,columnNumber=2,type=VARCHAR,nullable=true,indexed=false,nativeType=XML Attribute,columnSize=<null>]}", 
    104104                                ArrayUtils.toString(table.getColumns())); 
    105105 
     
    108108                assertEquals(2, table.getColumnCount()); 
    109109                assertEquals( 
    110                                 "{Column[name=id,columnNumber=0,type=INTEGER,nullable=false,indexed=true,nativeType=<null>,columnSize=<null>]," 
    111                                                 + "Column[name=name,columnNumber=1,type=VARBINARY,nullable=true,indexed=false,nativeType=<null>,columnSize=<null>]}", 
     110                                "{Column[name=id,columnNumber=0,type=INTEGER,nullable=false,indexed=true,nativeType=Auto-generated primary key,columnSize=<null>]," 
     111                                                + "Column[name=name,columnNumber=1,type=VARBINARY,nullable=true,indexed=false,nativeType=XML Text,columnSize=<null>]}", 
    112112                                ArrayUtils.toString(table.getColumns())); 
    113113        } 
     
    210210                Table dependencyTable = schema.getTableByName("dependency"); 
    211211                assertEquals( 
    212                                 "{Column[name=id,columnNumber=0,type=INTEGER,nullable=false,indexed=true,nativeType=<null>,columnSize=<null>]}", 
     212                                "{Column[name=id,columnNumber=0,type=INTEGER,nullable=false,indexed=true,nativeType=Auto-generated primary key,columnSize=<null>]}", 
    213213                                ArrayUtils.toString(dependencyTable.getColumns())); 
    214214                List<Object[]> dependencyData = strategy.materializeTable( 
     
    234234 
    235235                assertEquals( 
    236                                 "{Column[name=id,columnNumber=0,type=INTEGER,nullable=false,indexed=true,nativeType=<null>,columnSize=<null>]," 
    237                                                 + "Column[name=groupId,columnNumber=1,type=VARBINARY,nullable=true,indexed=false,nativeType=<null>,columnSize=<null>]}", 
     236                                "{Column[name=id,columnNumber=0,type=INTEGER,nullable=false,indexed=true,nativeType=Auto-generated primary key,columnSize=<null>]," 
     237                                                + "Column[name=groupId,columnNumber=1,type=VARBINARY,nullable=true,indexed=false,nativeType=XML Text,columnSize=<null>]}", 
    238238                                ArrayUtils.toString(dependencyTable.getColumns())); 
    239239 
     
    250250                                ArrayUtils.toString(schema.getTables())); 
    251251                assertEquals( 
    252                                 "{Column[name=id,columnNumber=0,type=INTEGER,nullable=false,indexed=true,nativeType=<null>,columnSize=<null>]," 
    253                                                 + "Column[name=groupId,columnNumber=1,type=VARBINARY,nullable=true,indexed=false,nativeType=<null>,columnSize=<null>]," 
    254                                                 + "Column[name=artifactId,columnNumber=2,type=VARBINARY,nullable=true,indexed=false,nativeType=<null>,columnSize=<null>]," 
    255                                                 + "Column[name=version,columnNumber=3,type=VARBINARY,nullable=true,indexed=false,nativeType=<null>,columnSize=<null>]," 
    256                                                 + "Column[name=scope,columnNumber=4,type=VARBINARY,nullable=true,indexed=false,nativeType=<null>,columnSize=<null>]}", 
     252                                "{Column[name=id,columnNumber=0,type=INTEGER,nullable=false,indexed=true,nativeType=Auto-generated primary key,columnSize=<null>]," 
     253                                                + "Column[name=groupId,columnNumber=1,type=VARBINARY,nullable=true,indexed=false,nativeType=XML Text,columnSize=<null>]," 
     254                                                + "Column[name=artifactId,columnNumber=2,type=VARBINARY,nullable=true,indexed=false,nativeType=XML Text,columnSize=<null>]," 
     255                                                + "Column[name=version,columnNumber=3,type=VARBINARY,nullable=true,indexed=false,nativeType=XML Text,columnSize=<null>]," 
     256                                                + "Column[name=scope,columnNumber=4,type=VARBINARY,nullable=true,indexed=false,nativeType=XML Text,columnSize=<null>]}", 
    257257                                ArrayUtils.toString(dependencyTable.getColumns())); 
    258258 
Note: See TracChangeset for help on using the changeset viewer.