Changeset 479
- Timestamp:
- 07/22/08 15:26:07 (2 years ago)
- 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 54 54 public class XmlDataContextStrategy extends QueryPostprocessDataContextStrategy { 55 55 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"; 56 60 private static final String TEXT_CONTENT_TEMP_SUFFIX = "_metamodel_text_content"; 57 61 private static final Log _log = LogFactory … … 60 64 private Schema _schema; 61 65 private Map<String, List<Object[]>> _tableData; 62 private Map<String, Column> _idColumns;63 private Map<String, Column> _textContentColumns;64 66 private boolean _autoFlattenTables; 65 67 … … 145 147 _schema = new Schema(_file.getName()); 146 148 _tableData = new HashMap<String, List<Object[]>>(); 147 _idColumns = new HashMap<String, Column>();148 _textContentColumns = new HashMap<String, Column>();149 149 try { 150 150 DocumentBuilderFactory dbf = DocumentBuilderFactory … … 168 168 // Rename all ID columns to reasonable names (preferably 169 169 // "id") 170 Column idColumn = _idColumns.get(tableName);170 Column idColumn = getIdColumn(table); 171 171 Column column = table.getColumnByName("id"); 172 172 if (column == null) { … … 175 175 176 176 // Remove text content column, if it is never populated 177 Column textContentColumn = _textContentColumns178 .get(tableName);177 Column textContentColumn = getTextContentColumn(table, 178 null); 179 179 int textContentColumnIndex = textContentColumn 180 180 .getColumnNumber(); … … 188 188 if (!found) { 189 189 table.removeColumn(textContentColumn); 190 _textContentColumns.remove(tableName);191 190 } else { 192 191 // Rename all text content columns to reasonable … … 239 238 .getType(), table, table.getColumnCount(), 240 239 false); 240 foreignKeyColumn.setNativeType(NATIVE_TYPE_FOREIGN_KEY); 241 241 table.addColumn(foreignKeyColumn); 242 242 … … 269 269 column = new Column(name, ColumnType.VARCHAR, table, table 270 270 .getColumnCount(), true); 271 column.setNativeType(NATIVE_TYPE_ATTRIBUTE); 271 272 table.addColumn(column); 272 273 } … … 316 317 317 318 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()); 322 330 column = new Column(preferredColumnName + TEXT_CONTENT_TEMP_SUFFIX, 323 331 ColumnType.VARBINARY, table, table.getColumnCount(), true); 332 column.setNativeType(NATIVE_TYPE_TEXT); 324 333 table.addColumn(column); 325 _textContentColumns.put(tableName, column);326 334 } 327 335 return column; … … 329 337 330 338 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 } 333 347 if (column == null) { 348 String tableName = table.getName(); 334 349 _log.info("Creating id column for table: " + tableName); 335 350 column = new Column(tableName + "_metamodel_surrogate_id", 336 351 ColumnType.INTEGER, table, table.getColumnCount(), false); 352 column.setNativeType(NATIVE_TYPE_PRIMARY_KEY); 337 353 column.setIndexed(true); 338 354 table.addColumn(column); 339 _idColumns.put(tableName, column);340 355 } 341 356 return column; … … 414 429 // Remove the surrogate id 415 430 String foreignTableName = foreignTable.getName(); 416 Column idColumn = _idColumns.get(foreignTableName);431 Column idColumn = getIdColumn(foreignTable); 417 432 foreignColumns.remove(idColumn); 418 433 … … 445 460 foreignTable.getSchema().removeTable(foreignTable); 446 461 _tableData.remove(foreignTableName); 447 _idColumns.remove(foreignTableName);448 _textContentColumns.remove(foreignTableName);449 462 relationship.remove(); 450 463 } … … 456 469 .getForeignKeyRelationships(); 457 470 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 463 481 // If there is only one data carrying column in the table and 464 482 // the foreign key is unique for all rows, we 465 483 // will flatten it 466 if ( table.getColumnCount()== nonDataColumns + 1) {484 if (columns.length == nonDataColumns + 1) { 467 485 boolean uniqueForeignKeys = true; 468 486 -
commons/MetaModel/trunk/src/test/java/dk/eobjects/metamodel/XmlDataContextStrategyTest.java
r478 r479 62 62 assertEquals(2, table.getColumnCount()); 63 63 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>]}", 66 66 ArrayUtils.toString(table.getColumns())); 67 67 … … 69 69 assertEquals(1, table.getColumnCount()); 70 70 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>]}", 72 72 ArrayUtils.toString(table.getColumns())); 73 73 … … 75 75 assertEquals(3, table.getColumnCount()); 76 76 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>]}", 80 80 ArrayUtils.toString(table.getColumns())); 81 81 assertEquals( … … 87 87 assertEquals(3, table.getColumnCount()); 88 88 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>]}", 92 92 ArrayUtils.toString(table.getColumns())); 93 93 assertEquals( … … 99 99 assertEquals(3, table.getColumnCount()); 100 100 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>]}", 104 104 ArrayUtils.toString(table.getColumns())); 105 105 … … 108 108 assertEquals(2, table.getColumnCount()); 109 109 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>]}", 112 112 ArrayUtils.toString(table.getColumns())); 113 113 } … … 210 210 Table dependencyTable = schema.getTableByName("dependency"); 211 211 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>]}", 213 213 ArrayUtils.toString(dependencyTable.getColumns())); 214 214 List<Object[]> dependencyData = strategy.materializeTable( … … 234 234 235 235 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>]}", 238 238 ArrayUtils.toString(dependencyTable.getColumns())); 239 239 … … 250 250 ArrayUtils.toString(schema.getTables())); 251 251 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>]}", 257 257 ArrayUtils.toString(dependencyTable.getColumns())); 258 258
Note: See TracChangeset
for help on using the changeset viewer.
