You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by ad...@apache.org on 2007/05/30 05:31:26 UTC

svn commit: r542740 - in /incubator/tuscany/cpp/das: VSExpress/tuscany_das/ VSExpress/tuscany_das/das_test/ runtime/core/include/apache/das/rdb/ runtime/core/src/apache/das/rdb/ runtime/test/resource/ runtime/test/src/

Author: adrianocrestani
Date: Tue May 29 20:31:25 2007
New Revision: 542740

URL: http://svn.apache.org/viewvc?view=rev&rev=542740
Log:
- added support to one to one relationship
- fixed minor bugs on Config class
- added testcase to one to one and many to one relationship

Added:
    incubator/tuscany/cpp/das/runtime/test/resource/testKeyPairColumnTypeNotEqual.xml
    incubator/tuscany/cpp/das/runtime/test/resource/testManyRelationship1.xml
    incubator/tuscany/cpp/das/runtime/test/resource/testManyRelationship2.xml
Modified:
    incubator/tuscany/cpp/das/VSExpress/tuscany_das/das_test/das_test.vcproj
    incubator/tuscany/cpp/das/VSExpress/tuscany_das/tuscany_das.suo
    incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/ColumnData.h
    incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/ConfigImpl.h
    incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/Relationship.h
    incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/Table.h
    incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ColumnData.cpp
    incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ConfigImpl.cpp
    incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/GraphBuilder.cpp
    incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/GraphBuilderMetaData.cpp
    incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/Relationship.cpp
    incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/Table.cpp
    incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/TableData.cpp
    incubator/tuscany/cpp/das/runtime/test/src/main.cpp

Modified: incubator/tuscany/cpp/das/VSExpress/tuscany_das/das_test/das_test.vcproj
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/VSExpress/tuscany_das/das_test/das_test.vcproj?view=diff&rev=542740&r1=542739&r2=542740
==============================================================================
--- incubator/tuscany/cpp/das/VSExpress/tuscany_das/das_test/das_test.vcproj (original)
+++ incubator/tuscany/cpp/das/VSExpress/tuscany_das/das_test/das_test.vcproj Tue May 29 20:31:25 2007
@@ -182,7 +182,27 @@
 			Name="Resource Files"
 			>
 			<File
-				RelativePath="..\..\..\runtime\test\resource\testIncompleteCompositeRelationship.xml"
+				RelativePath="..\..\..\runtime\test\resource\testCompositeRelationship.xml"
+				>
+			</File>
+			<File
+				RelativePath="..\..\..\runtime\test\resource\testIncompleteCompositeRelationship1.xml"
+				>
+			</File>
+			<File
+				RelativePath="..\..\..\runtime\test\resource\testIncompleteCompositeRelationship2.xml"
+				>
+			</File>
+			<File
+				RelativePath="..\..\..\runtime\test\resource\testKeyPairColumnTypeNotEqual.xml"
+				>
+			</File>
+			<File
+				RelativePath="..\..\..\runtime\test\resource\testManyRelationship1.xml"
+				>
+			</File>
+			<File
+				RelativePath="..\..\..\runtime\test\resource\testManyRelationship2.xml"
 				>
 			</File>
 		</Filter>

Modified: incubator/tuscany/cpp/das/VSExpress/tuscany_das/tuscany_das.suo
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/VSExpress/tuscany_das/tuscany_das.suo?view=diff&rev=542740&r1=542739&r2=542740
==============================================================================
Binary files - no diff available.

Modified: incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/ColumnData.h
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/ColumnData.h?view=diff&rev=542740&r1=542739&r2=542740
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/ColumnData.h (original)
+++ incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/ColumnData.h Tue May 29 20:31:25 2007
@@ -38,18 +38,18 @@
 class ColumnData {
 
 	private:
-		Column* column;
+		const Column* column;
 		void* data;
 
 	public:
-		ColumnData(Column& column, ResultSetPtr resultSet);
+		ColumnData(const Column& column, ResultSetPtr resultSet);
 		virtual ~ColumnData(void);
 
 		bool operator==(ColumnData& columnData) const;
 		bool operator!=(ColumnData& columnData) const;
 		bool operator<(ColumnData& columnData) const;
 		bool operator>(ColumnData& columnData) const;
-		Column& getColumn(void) const;
+		const Column& getColumn(void) const;
 
 		void populateDataGraph(TableData& tableData) const;
 

Modified: incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/ConfigImpl.h
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/ConfigImpl.h?view=diff&rev=542740&r1=542739&r2=542740
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/ConfigImpl.h (original)
+++ incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/ConfigImpl.h Tue May 29 20:31:25 2007
@@ -48,8 +48,8 @@
 class ConfigImpl : public ::apache::das::Config {
 
 	private:
-		std::map<std::string, Relationship*>* relationships;
-		std::map<std::string, Table*>* tables;
+		std::map<std::string, const Relationship*>* relationships;
+		std::map<std::string, const Table*>* tables;
 		bool convOverConfig;
 
 		Table& newTable(Table& table);
@@ -66,14 +66,14 @@
 		Relationship& addRelationship(std::string pkTableName, std::string fkTableName, std::string name = "");
 		Relationship& addRelationship(const Relationship& relationship);
 
-		std::map<std::string, Relationship*>& getRelationships(void) const;
-		std::map<std::string, Table*>& getTables(void) const;
+		const std::map<std::string, Relationship*>& getRelationships(void) const;
+		const std::map<std::string, Table*>& getTables(void) const;
 
 		DAS& getDAS(void) const;
 		bool isConvOverConfig(void) const;
 
-		Table* getTable(std::string tableName) const;
-		Relationship* getRelationship(std::string pkTableName, std::string fkTableName) const;
+		const Table* getTable(std::string tableName) const;
+		const Relationship* getRelationship(std::string pkTableName, std::string fkTableName) const;
 		
 };
 

Modified: incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/Relationship.h
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/Relationship.h?view=diff&rev=542740&r1=542739&r2=542740
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/Relationship.h (original)
+++ incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/Relationship.h Tue May 29 20:31:25 2007
@@ -37,7 +37,8 @@
 		std::string relationshipName;
 		std::string pkTableName;
 		std::string fkTableName;
-		std::map<std::string, KeyPair*>* keyPairs;
+		bool many;
+		std::map<std::string, const KeyPair*>* keyPairs;
 
 		KeyPair& newKeyPair(KeyPair& keyPair);
 		
@@ -48,14 +49,16 @@
 
 		KeyPair& addKeyPair(std::string pkColumnName, std::string fkColumnName);
 		KeyPair& addKeyPair(const KeyPair& keyPair);
+		void setMany(bool many);
 
 		std::string getPKTableName(void) const;
 		std::string getFKTableName(void) const;
 		std::string getName(void) const;
+		bool isMany(void) const;
 
-		std::map<std::string, KeyPair*>& getKeyPairs(void) const;
-		KeyPair* getKeyPair(std::string pkColumnName, std::string fkColumnName) const;
-		std::list<KeyPair*>* getKeyPair(std::string columnName, bool pkColumn = true) const;
+		const std::map<std::string, const KeyPair*>& getKeyPairs(void) const;
+		const KeyPair* getKeyPair(std::string pkColumnName, std::string fkColumnName) const;
+		std::list<const KeyPair*>* getKeyPair(std::string columnName, bool pkColumn = true) const;
 		bool containsColumn(std::string columnName, bool pkColumn = true) const;
 		
 };

Modified: incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/Table.h
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/Table.h?view=diff&rev=542740&r1=542739&r2=542740
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/Table.h (original)
+++ incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/Table.h Tue May 29 20:31:25 2007
@@ -47,7 +47,7 @@
 class Table {
 
 	private:
-		std::map<std::string, Column*>* columns;
+		std::map<std::string, const Column*>* columns;
 		std::string tableName;
 		std::string typeName;
 
@@ -64,8 +64,9 @@
 		
 		std::string getTypeName(void) const;
 		std::string getTableName(void) const;
-		Column* getColumn(std::string columnName) const;
-		const std::map<std::string, Column*>& getColumns(void) const;
+		const Column* getColumn(std::string columnName) const;
+		Column* getColumn(std::string columnName);
+		const std::map<std::string, const Column*>& getColumns(void) const;
 		unsigned int getPKColumnCount(void) const;
 		
 		void createGraph(const GraphBuilderMetaData& graphBuilderMetaData, commonj::sdo::DataFactoryPtr dataFactory) const;

Modified: incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ColumnData.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ColumnData.cpp?view=diff&rev=542740&r1=542739&r2=542740
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ColumnData.cpp (original)
+++ incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ColumnData.cpp Tue May 29 20:31:25 2007
@@ -22,7 +22,7 @@
 	namespace das {
 		namespace rdb {
 
-ColumnData::ColumnData(Column& column, ResultSetPtr resultSet) {
+ColumnData::ColumnData(const Column& column, ResultSetPtr resultSet) {
 	this->column = &column;
 
 	switch (column.getSQLType()) {
@@ -220,7 +220,7 @@
 	return !(*this == columnData);
 }
 
-Column& ColumnData::getColumn(void) const {
+const Column& ColumnData::getColumn(void) const {
 	return *column;
 }
 

Modified: incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ConfigImpl.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ConfigImpl.cpp?view=diff&rev=542740&r1=542739&r2=542740
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ConfigImpl.cpp (original)
+++ incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ConfigImpl.cpp Tue May 29 20:31:25 2007
@@ -23,19 +23,19 @@
 		namespace rdb {
 
 ConfigImpl::ConfigImpl(void) {
-	relationships = new std::map<std::string, Relationship*>();
-	tables = new std::map<std::string, Table*>();
+	relationships = new std::map<std::string, const Relationship*>();
+	tables = new std::map<std::string, const Table*>();
 	convOverConfig = false;
 		
 }
 
 ConfigImpl::ConfigImpl(const Config& config) : Config(config) {
 	ConfigImpl& thisConfig = (ConfigImpl&) config;
-	tables = new std::map<std::string, Table*>(*thisConfig.tables);
-	relationships = new std::map<std::string, Relationship*>(*thisConfig.relationships);
+	tables = new std::map<std::string, const Table*>(*thisConfig.tables);
+	relationships = new std::map<std::string, const Relationship*>(*thisConfig.relationships);
 
-	std::map<std::string, Table*>::iterator tableIterator;
-	std::map<std::string, Relationship*>::iterator relationshipIterator;
+	std::map<std::string, const Table*>::iterator tableIterator;
+	std::map<std::string, const Relationship*>::iterator relationshipIterator;
 
 	for (tableIterator = tables->begin() ; tableIterator != tables->end() ; 
 		tableIterator++) {
@@ -55,8 +55,8 @@
 }
 
 ConfigImpl::ConfigImpl(std::string xmlFile) {
-	relationships = new std::map<std::string, Relationship*>();
-	tables = new std::map<std::string, Table*>();
+	relationships = new std::map<std::string, const Relationship*>();
+	tables = new std::map<std::string, const Table*>();
 	convOverConfig = false;
 
 	commonj::sdo::DataFactoryPtr df = commonj::sdo::DataFactory::getDataFactory();
@@ -112,6 +112,7 @@
 		std::string name = SDODataObjectWrapper(relationshipList[i]).getString("name");;
 		
 		Relationship& relationship = addRelationship(primaryKeyTable, foreignKeyTable);
+		relationship.setMany(relationshipList[i]->getBoolean("many"));
 
 		commonj::sdo::DataObjectList& keyPairList = relationshipList[i]->getList("KeyPair");
 
@@ -127,8 +128,8 @@
 }
 
 ConfigImpl::~ConfigImpl(void) {
-	std::map<std::string, Table*>::iterator tableIterator;
-	std::map<std::string, Relationship*>::iterator relationshipIterator;
+	std::map<std::string, const Table*>::const_iterator tableIterator;
+	std::map<std::string, const Relationship*>::const_iterator relationshipIterator;
 
 	tableIterator = tables->begin();
 	for ( ; tableIterator != tables->end() ; 
@@ -156,21 +157,21 @@
 
 Table& ConfigImpl::newTable(Table& table) {
 	std::string tableName = table.getTableName();
-	Table* configTable = getTable(tableName);
-
-	if (configTable == 0) {
+	std::map<std::string, const Table*>::iterator tableIterator = tables->find(tableName);
+	
+	if (tableIterator == tables->end()) {
 		tables->insert(std::make_pair(tableName, &table));
 
 		return table;
 
 	}
 
-	return *configTable;
+	return (Table&) *tableIterator->second;
 
 }
 
-std::map<std::string, Relationship*>& ConfigImpl::getRelationships(void) const {
-	return *relationships;
+const std::map<std::string, Relationship*>& ConfigImpl::getRelationships(void) const {
+	return (const std::map<std::string, Relationship*>&) *relationships;
 }
 
 Relationship& ConfigImpl::addRelationship(std::string pkTableName, std::string fkTableName, std::string name) {
@@ -182,21 +183,22 @@
 }
 
 Relationship& ConfigImpl::newRelationship(Relationship& relationship) {
-	Relationship* configRelationship = getRelationship(relationship.getPKTableName(), relationship.getFKTableName());
-
-	if (configRelationship == 0) {
-		relationships->insert(std::make_pair(relationship.getPKTableName() + "." + relationship.getFKTableName(), &relationship));
+	std::string pkXfk = relationship.getPKTableName() + "." + relationship.getFKTableName();
+	std::map<std::string, const Relationship*>::iterator it = relationships->find(pkXfk);
+	
+	if (it == relationships->end()) {
+		relationships->insert(std::make_pair(pkXfk, &relationship));
 
 		return relationship;
 
 	}
 
-	return *configRelationship;
+	return (Relationship&) *it->second;
 
 }
 
-Relationship* ConfigImpl::getRelationship(std::string pkTableName, std::string fkTableName) const {
-	std::map<std::string, Relationship*>::iterator it = relationships->find(pkTableName + "." + fkTableName);
+const Relationship* ConfigImpl::getRelationship(std::string pkTableName, std::string fkTableName) const {
+	std::map<std::string, const Relationship*>::iterator it = relationships->find(pkTableName + "." + fkTableName);
 
 	if (it == relationships->end()) {
 		return 0;
@@ -206,16 +208,16 @@
 
 }
 
-std::map<std::string, Table*>& ConfigImpl::getTables(void) const {
-	return *tables;
+const std::map<std::string, Table*>& ConfigImpl::getTables(void) const {
+	return (const std::map<std::string, Table*>&) *tables;
 }
 
 bool ConfigImpl::isConvOverConfig(void) const {
 	return convOverConfig;
 }
 
-Table* ConfigImpl::getTable(std::string tableName) const {
-	std::map<std::string, Table*>::iterator tableIterator = tables->find(tableName);
+const Table* ConfigImpl::getTable(std::string tableName) const {
+	std::map<std::string, const Table*>::iterator tableIterator = tables->find(tableName);
 
 	if (tableIterator == tables->end()) {
 		return 0;

Modified: incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/GraphBuilder.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/GraphBuilder.cpp?view=diff&rev=542740&r1=542739&r2=542740
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/GraphBuilder.cpp (original)
+++ incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/GraphBuilder.cpp Tue May 29 20:31:25 2007
@@ -129,14 +129,14 @@
 					fkTablesList.end() ; tableDataIterator++) {
 
 					TableData& fkTableData = **tableDataIterator;
-					std::map<std::string, KeyPair*>& keyPairs = (*relationshipIterator)->getKeyPairs();
-					std::map<std::string, KeyPair*>::iterator keyPairIterator;
+					const std::map<std::string, const KeyPair*>& keyPairs = (*relationshipIterator)->getKeyPairs();
+					std::map<std::string, const KeyPair*>::const_iterator keyPairIterator;
 					KeyDataList fksColumnList;
 
 					for (keyPairIterator = keyPairs.begin() ; keyPairIterator != keyPairs.end() ;
 						keyPairIterator++) {
 					
-							KeyPair& keyPair = *keyPairIterator->second;
+							const KeyPair& keyPair = *keyPairIterator->second;
 							ColumnData* columnData = fkTableData.
 								getColumnData(keyPair.getFKColumnName());
 
@@ -151,8 +151,15 @@
 					if (pkTablaDataIterator != pkTablesData.end()) {
 						TableData& pkTableData = *pkTablaDataIterator->second;
 					
-						pkTableData.getGraphObject()->getList((*relationshipIterator)->getName().c_str()).
-							append(fkTableData.getGraphObject());
+						if ((*relationshipIterator)->isMany()) {
+							pkTableData.getGraphObject()->getList((*relationshipIterator)->getName().c_str()).
+								append(fkTableData.getGraphObject());
+
+						} else {
+							pkTableData.getGraphObject()->setDataObject((*relationshipIterator)->getName().c_str(), 
+								fkTableData.getGraphObject());
+
+						}
 
 					}
 

Modified: incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/GraphBuilderMetaData.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/GraphBuilderMetaData.cpp?view=diff&rev=542740&r1=542739&r2=542740
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/GraphBuilderMetaData.cpp (original)
+++ incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/GraphBuilderMetaData.cpp Tue May 29 20:31:25 2007
@@ -26,9 +26,9 @@
 	this->resultSetMetaData = &resultSetMetaData;
 	this->config = &config;
 	graphTables = new std::map<std::string, Table*>();
-	std::map<std::string, Relationship*>& configRelationships = config.getRelationships();
+	const std::map<std::string, Relationship*>& configRelationships = config.getRelationships();
 	relationships = new std::map<std::string, Relationship*>();
-	std::map<std::string, Relationship*>::iterator relationshipIterator;
+	std::map<std::string, Relationship*>::const_iterator relationshipIterator;
 
 	unsigned int colCount = resultSetMetaData.getColumnCount();
 	std::map<std::string, std::list<Column*>*> tablesColumns;
@@ -41,7 +41,7 @@
 			find(columnTableName);
 
 		Table* table = 0;
-		Table* configTable = config.getTable(columnTableName);
+		const Table* configTable = config.getTable(columnTableName);
 		
 		if (tableIterator == graphTables->end()) {
 			table = new Table(columnTableName);
@@ -59,7 +59,7 @@
 		if (configTable == 0) {
 			table->addColumn(columnName, columnSQLType);
 		} else {
-			Column* column = configTable->getColumn(columnName);
+			Column* column = (Column*) configTable->getColumn(columnName);
 
 			if (column != 0) {
 				table->addColumn(Column(*column));
@@ -76,7 +76,7 @@
 		tableIterator++) {
 
 			Table& table = *tableIterator->second;
-			Table* configTable = config.getTable(table.getTableName());
+			const Table* configTable = config.getTable(table.getTableName());
 			bool hasPK = false;
 
 			if (configTable != 0 && configTable->getPKColumnCount() == 
@@ -85,24 +85,19 @@
 				
 			}
 
-			const std::map<std::string, Column*>& tableColumns = table.getColumns();
-			std::map<std::string, Column*>::const_iterator columnIterator;
+			const std::map<std::string, const Column*>& tableColumns = table.getColumns();
+			std::map<std::string, const Column*>::const_iterator columnIterator;
 
 			if (!hasPK) {
-				for (columnIterator = tableColumns.begin() ; 
-					columnIterator != tableColumns.end() ; columnIterator++) {
+				Column* column = table.getColumn("id");
 
-						std::string columnName = columnIterator->second->getName();
-
-						if (columnName == "id") {
-							columnIterator->second->setPK(true);
-							hasPK = true;
-							break;
-
-						}
+				if (column != 0) {
+					column->setPK(true);
+					hasPK = true;
 
 				}
 
+
 			}
 
 			if (!hasPK) {
@@ -111,7 +106,7 @@
 
 					for (columnIterator = tableColumns.begin() ; 
 						columnIterator != tableColumns.end() ; columnIterator++) {
-							columnIterator->second->setPK(true);
+							((Column*) columnIterator->second)->setPK(true);
 					}
 
 				}
@@ -125,39 +120,37 @@
 
 			Relationship& relationship = *relationshipIterator->second;
 			bool contains = true;
-			std::map<std::string, KeyPair*>& keyPairs = relationship.getKeyPairs();
-			std::map<std::string, KeyPair*>::iterator keyPairIterator;
+			const std::map<std::string, const KeyPair*>& keyPairs = relationship.getKeyPairs();
+			std::map<std::string, const KeyPair*>::const_iterator keyPairIterator;
 			std::map<std::string, Table*>::iterator pkTableIterator = 
 				graphTables->find(relationship.getPKTableName());
 
-			if (pkTableIterator == graphTables->end()) {
+			std::map<std::string, Table*>::iterator fkTableIterator = 
+				graphTables->find(relationship.getFKTableName());
+
+			if (pkTableIterator == graphTables->end() || 
+				fkTableIterator == graphTables->end()) {
 				continue;
 			}
 
 			Table& pkTable = *pkTableIterator->second;
+			Table& fkTable = *fkTableIterator->second;
 			
 			for (keyPairIterator = keyPairs.begin() ; keyPairIterator != keyPairs.end() ; 
 				keyPairIterator++) {
 
-					KeyPair& keyPair = *keyPairIterator->second;
+					const KeyPair& keyPair = *keyPairIterator->second;
 					Column* pkColumn = pkTable.getColumn(keyPair.getPKColumnName());
+					Column* fkColumn = fkTable.getColumn(keyPair.getFKColumnName());
+
+					if (fkColumn == 0 || pkColumn == 0 || !pkColumn->isPK() ||
+						fkColumn->getSQLType() != pkColumn->getSQLType()) {
 
-					if (pkColumn == 0 || !pkColumn->isPK()) {
 						contains = false;
 						break;
 
 					}
-
-					if (!resultSetMetaData.containsColumn(relationship.getPKTableName(), 
-						keyPair.getPKColumnName()) || 
-						!resultSetMetaData.containsColumn(relationship.getFKTableName(), 
-						keyPair.getFKColumnName())) {
-							
-							contains = false;
-							break;
-
-					}
-
+					
 			}
 
 			if (contains) {
@@ -173,8 +166,8 @@
 		tableIterator++) {
 
 			Table& table = *tableIterator->second;
-			const std::map<std::string, Column*>& tableColumns = table.getColumns();
-			std::map<std::string, Column*>::const_iterator columnIterator;
+			const std::map<std::string, const Column*>& tableColumns = table.getColumns();
+			std::map<std::string, const Column*>::const_iterator columnIterator;
 
 			for (columnIterator = tableColumns.begin() ; 
 				columnIterator != tableColumns.end() ; columnIterator++) {
@@ -195,7 +188,8 @@
 						}
 
 						Column* pkColumn = pkTableIterator->second->getColumn("id");
-						if (!pkColumn) {
+						if (pkColumn == 0 || 
+							columnIterator->second->getSQLType() != pkColumn->getSQLType()) {
 							continue;
 						}
 
@@ -262,7 +256,7 @@
 
 		dataFactory->addPropertyToType(DAS_NAMESPACE, relationship.getPKTableName().c_str(),
 			relationship.getName().c_str(), DAS_NAMESPACE, 
-			relationship.getFKTableName().c_str(), true, false, false);
+			relationship.getFKTableName().c_str(), relationship.isMany(), false, false);
 
 	}
 

Modified: incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/Relationship.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/Relationship.cpp?view=diff&rev=542740&r1=542739&r2=542740
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/Relationship.cpp (original)
+++ incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/Relationship.cpp Tue May 29 20:31:25 2007
@@ -23,12 +23,13 @@
 		namespace rdb {
 
 Relationship::Relationship(const Relationship& relationship) {
+	many = relationship.many;
 	relationshipName = relationship.relationshipName;
 	pkTableName = relationship.pkTableName;
 	fkTableName = relationship.fkTableName;
 	keyPairs = relationship.keyPairs;
 
-	std::map<std::string, KeyPair*>::iterator it;
+	std::map<std::string, const KeyPair*>::iterator it;
 	for (it = keyPairs->begin() ; it != keyPairs->end() ; it++) {
 		KeyPair* newKeyPair = new KeyPair(*it->second);
 		newKeyPair->setRelationship(this);
@@ -49,10 +50,19 @@
 	
 	this->pkTableName = pkTableName;
 	this->fkTableName = fkTableName;
-	keyPairs = new std::map<std::string, KeyPair*>();
+	many = true;
+	keyPairs = new std::map<std::string, const KeyPair*>();
 
 }
 
+void Relationship::setMany(bool many) {
+	this->many = many;
+}
+
+bool Relationship::isMany(void) const {
+	return many;
+}
+
 KeyPair& Relationship::addKeyPair(std::string pkColumnName, std::string fkColumnName) {
 	return newKeyPair(*(new KeyPair(pkColumnName, fkColumnName)));
 }
@@ -62,7 +72,7 @@
 }
 
 KeyPair& Relationship::newKeyPair(KeyPair& keyPair) {
-	KeyPair* configKeyPair = getKeyPair(keyPair.getPKColumnName(), keyPair.getFKColumnName());
+	const KeyPair* configKeyPair = getKeyPair(keyPair.getPKColumnName(), keyPair.getFKColumnName());
 
 	if (configKeyPair == 0) {
 		keyPairs->insert(std::make_pair(keyPair.getPKColumnName() + "." + keyPair.getFKColumnName(), &keyPair));
@@ -71,7 +81,7 @@
 
 	}
 
-	return *configKeyPair;
+	return (KeyPair&) *configKeyPair;
 
 }
 
@@ -91,12 +101,12 @@
 	return fkTableName;
 }
 
-std::map<std::string, KeyPair*>& Relationship::getKeyPairs(void) const {
-	return *keyPairs;
+const std::map<std::string, const KeyPair*>& Relationship::getKeyPairs(void) const {
+	return (const std::map<std::string, const KeyPair*>&) *keyPairs;
 }
 
-KeyPair* Relationship::getKeyPair(std::string pkColumnName, std::string fkColumnName) const {
-	std::map<std::string, KeyPair*>::iterator it = keyPairs->
+const KeyPair* Relationship::getKeyPair(std::string pkColumnName, std::string fkColumnName) const {
+	std::map<std::string, const KeyPair*>::iterator it = keyPairs->
 		find(pkColumnName + "." + fkColumnName);
 
 	if (it == keyPairs->end()) {
@@ -107,9 +117,9 @@
 
 }
 
-std::list<KeyPair*>* Relationship::getKeyPair(std::string columnName, bool pkColumn) const {
-	std::map<std::string, KeyPair*>::const_iterator it;
-	std::list<KeyPair*>* ret = new std::list<KeyPair*>();
+std::list<const KeyPair*>* Relationship::getKeyPair(std::string columnName, bool pkColumn) const {
+	std::map<std::string, const KeyPair*>::const_iterator it;
+	std::list<const KeyPair*>* ret = new std::list<const KeyPair*>();
 
 	for (it = keyPairs->begin() ; it != keyPairs->end() ; it++) {
 		std::string actualColumnName;
@@ -132,7 +142,7 @@
 
 
 bool Relationship::containsColumn(std::string columnName, bool pkColumn) const {
-	std::map<std::string, KeyPair*>::const_iterator it;	
+	std::map<std::string, const KeyPair*>::const_iterator it;	
 
 	for (it = keyPairs->begin() ; it != keyPairs->end() ; it++) {
 

Modified: incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/Table.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/Table.cpp?view=diff&rev=542740&r1=542739&r2=542740
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/Table.cpp (original)
+++ incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/Table.cpp Tue May 29 20:31:25 2007
@@ -25,16 +25,16 @@
 Table::Table(std::string tableName) {
 	this->tableName = tableName;
 	this->typeName = tableName;
-	this->columns = new std::map<std::string, Column*>();
+	this->columns = new std::map<std::string, const Column*>();
 
 }
 
 Table::Table(const Table& table) {
 	tableName = table.tableName;
 	typeName = table.typeName;
-	this->columns = new std::map<std::string, Column*>(*table.columns);
+	this->columns = new std::map<std::string, const Column*>(*table.columns);
 
-	std::map<std::string, Column*>::iterator it;
+	std::map<std::string, const Column*>::iterator it;
 	for (it = columns->begin() ; it != columns->end() ; it++) {
 		Column* newColumn = new Column(*it->second);
 		newColumn->setContainerTable(this);
@@ -45,7 +45,7 @@
 }
 
 Table::~Table(void) {
-	std::map<std::string, Column*>::iterator it;
+	std::map<std::string, const Column*>::iterator it;
 
 	for (it = columns->begin() ; it != columns->end() ; it++) {
 		delete it->second;
@@ -85,7 +85,7 @@
 }
 
 void Table::createGraph(const GraphBuilderMetaData& graphBuilderMetaData, commonj::sdo::DataFactoryPtr dataFactory) const {
-	std::map<std::string, Column*>::const_iterator it;
+	std::map<std::string, const Column*>::const_iterator it;
 	std::map<std::string, Relationship*>& relationships = graphBuilderMetaData.getRelationships();
 	std::map<std::string, Relationship*>::const_iterator relationshipIterator;
 	std::list<Relationship*> tablePKRelationships;
@@ -96,8 +96,8 @@
 		relationships.end() ; relationshipIterator++) {
 
 			if (relationshipIterator->second->getFKTableName() == tableName) {
-				std::map<std::string, KeyPair*>& keyPairs = relationshipIterator->second->getKeyPairs();
-				std::map<std::string, KeyPair*>::const_iterator keyPairIterator;
+				const std::map<std::string, const KeyPair*>& keyPairs = relationshipIterator->second->getKeyPairs();
+				std::map<std::string, const KeyPair*>::const_iterator keyPairIterator;
 
 				for (keyPairIterator = keyPairs.begin() ; keyPairIterator != 
 					keyPairs.end() ; keyPairIterator++) {
@@ -112,7 +112,7 @@
 	}
 	
 	for (it = columns->begin() ; it != columns->end() ; it++) {
-		Column& column = *(it->second);
+		const Column& column = *(it->second);
 
 		if (graphBuilderMetaData.getResultSetMetaData().containsColumn(tableName, column.getName())) {
 
@@ -137,28 +137,32 @@
 	this->typeName = typeName;
 }
 
-Column* Table::getColumn(std::string columnName) const {
-	std::map<std::string, Column*>::const_iterator it = columns->find(columnName);
+Column* Table::getColumn(std::string columnName) {
+	std::map<std::string, const Column*>::const_iterator it = columns->find(columnName);
 
 	if (it == columns->end()) {
 		return 0;
 	}
 
-	return it->second;
+	return (Column*) it->second;
 
 }
 
+const Column* Table::getColumn(std::string columnName) const {
+	return ((Table*) this)->getColumn(columnName);
+}
+
 std::string Table::getTypeName(void) const {
 	return typeName;
 }
 
-const std::map<std::string, Column*>& Table::getColumns(void) const {
+const std::map<std::string, const Column*>& Table::getColumns(void) const {
 	return *columns;
 }
 
 unsigned int Table::getPKColumnCount(void) const {
 	unsigned int count = 0;
-	std::map<std::string, Column*>::const_iterator it;
+	std::map<std::string, const Column*>::const_iterator it;
 
 	for (it = columns->begin() ; it != columns->end() ; it++) {
 

Modified: incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/TableData.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/TableData.cpp?view=diff&rev=542740&r1=542739&r2=542740
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/TableData.cpp (original)
+++ incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/TableData.cpp Tue May 29 20:31:25 2007
@@ -26,14 +26,14 @@
 	this->table = &table;
 	primaryKeys = new KeyDataList();
 	dataObject = 0;
-	const std::map<std::string, Column*>& columns = table.getColumns();
-	std::map<std::string, Column*>::const_iterator columnIterator;
+	const std::map<std::string, const Column*>& columns = table.getColumns();
+	std::map<std::string, const Column*>::const_iterator columnIterator;
 	ResultSetMetaData& metaData = resultSet->getResultSetMetaData();
 	
 	for (columnIterator = columns.begin() ; columnIterator != columns.end() ; 
 		columnIterator++) {
 
-			Column& column = *columnIterator->second;
+			const Column& column = *columnIterator->second;
 			std::string columnName = column.getName();
 
 			if (metaData.containsColumn(table.getTableName(), columnName)) {

Added: incubator/tuscany/cpp/das/runtime/test/resource/testKeyPairColumnTypeNotEqual.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/test/resource/testKeyPairColumnTypeNotEqual.xml?view=auto&rev=542740
==============================================================================
--- incubator/tuscany/cpp/das/runtime/test/resource/testKeyPairColumnTypeNotEqual.xml (added)
+++ incubator/tuscany/cpp/das/runtime/test/resource/testKeyPairColumnTypeNotEqual.xml Tue May 29 20:31:25 2007
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+ -->
+
+<Config xmlns="http:///org.apache.tuscany.das.rdb/config.xsd"> 
+
+	<Table tableName="department">
+      	<Column sqlType="integer" columnName="id" primaryKey="true"/>
+	</Table>
+
+	<Table tableName="employee">
+      	<Column sqlType="float" columnName="department_id" primaryKey="true"/>
+	</Table>
+
+	<Relationship primaryKeyTable="department" foreignKeyTable="employee" many="true">
+      	<KeyPair primaryKeyColumn="id" foreignKeyColumn="department_id"/>
+	</Relationship>
+
+</Config>
\ No newline at end of file

Added: incubator/tuscany/cpp/das/runtime/test/resource/testManyRelationship1.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/test/resource/testManyRelationship1.xml?view=auto&rev=542740
==============================================================================
--- incubator/tuscany/cpp/das/runtime/test/resource/testManyRelationship1.xml (added)
+++ incubator/tuscany/cpp/das/runtime/test/resource/testManyRelationship1.xml Tue May 29 20:31:25 2007
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+ -->
+
+<Config xmlns="http:///org.apache.tuscany.das.rdb/config.xsd"> 
+
+	<Relationship primaryKeyTable="company" foreignKeyTable="department" many="true">
+      	<KeyPair primaryKeyColumn="id" foreignKeyColumn="company_id"/>
+	</Relationship>
+
+</Config>
\ No newline at end of file

Added: incubator/tuscany/cpp/das/runtime/test/resource/testManyRelationship2.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/test/resource/testManyRelationship2.xml?view=auto&rev=542740
==============================================================================
--- incubator/tuscany/cpp/das/runtime/test/resource/testManyRelationship2.xml (added)
+++ incubator/tuscany/cpp/das/runtime/test/resource/testManyRelationship2.xml Tue May 29 20:31:25 2007
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+ -->
+
+<Config xmlns="http:///org.apache.tuscany.das.rdb/config.xsd"> 
+
+	<Relationship primaryKeyTable="company" foreignKeyTable="department" many="false">
+      	<KeyPair primaryKeyColumn="id" foreignKeyColumn="company_id"/>
+	</Relationship>
+
+</Config>
\ No newline at end of file

Modified: incubator/tuscany/cpp/das/runtime/test/src/main.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/test/src/main.cpp?view=diff&rev=542740&r1=542739&r2=542740
==============================================================================
--- incubator/tuscany/cpp/das/runtime/test/src/main.cpp (original)
+++ incubator/tuscany/cpp/das/runtime/test/src/main.cpp Tue May 29 20:31:25 2007
@@ -201,7 +201,6 @@
 
 	} catch (SDOPropertyNotFoundException ex) {
 		cout << "not created" << endl;
-		cout << "references set = not set" << endl;
 
 	}
 
@@ -238,12 +237,36 @@
 
 }
 
+void testKeyPairColumnTypeNotEqual() {
+	cout << "-------------testKeyPairColumnTypeNotEqual--------------" << endl;
+
+	Connection* conn = getConnection();
+	ConfigImpl config((std::string) TEST_RESOURCE_PATH + "testKeyPairColumnTypeNotEqual.xml");
+	DASImpl* das = (DASImpl*) DASImpl::getFACTORY()->createDAS(config, *conn);
+	CommandPtr command = das->createCommand("SELECT * FROM department, employee;");
+	commonj::sdo::DataObjectPtr root = command->executeQuery();
+
+	cout << "relationship ignored when keypair types are not equal = ";
+	try {
+		root->getDataFactory()->getType(DAS_NAMESPACE, "department").getProperty("employee");
+		cout << "not ignored" << endl;
+
+	} catch (SDOPropertyNotFoundException ex) {
+		cout << "OK" << endl;
+	}
+
+	delete conn;
+	
+	cout << "---------------------------------" << endl << endl;
+
+}
+
 void testUniqueObjectByID() {
 	cout << "-------------testUniqueObjectByID--------------" << endl;
 
 	Connection* conn = getConnection();
 	DASImpl* das = (DASImpl*) DASImpl::getFACTORY()->createDAS(*conn);
-	CommandPtr command = das->createCommand("SELECT * FROM company, employee where company.id = 1;");
+	CommandPtr command = das->createCommand("SELECT * FROM company, department where company.id = 1;");
 	commonj::sdo::DataObjectPtr root = command->executeQuery();
 
 	cout << "table duplicated row ignored = ";
@@ -259,12 +282,69 @@
 
 }
 
+void testManyRelationship() {
+	cout << "-------------testManyRelationship--------------" << endl;
+
+	Connection* conn = getConnection();
+	{
+		ConfigImpl config((std::string) TEST_RESOURCE_PATH + "testManyRelationship1.xml");
+		DASImpl* das = (DASImpl*) DASImpl::getFACTORY()->createDAS(config, *conn);
+		CommandPtr command = das->createCommand("SELECT * FROM company, department where company.id = 1;");
+		commonj::sdo::DataObjectPtr root = command->executeQuery();
+
+		cout << "reference created as many on data graph = ";
+		if (root->getDataFactory()->getType(DAS_NAMESPACE, "company").getProperty("department").isMany()) {
+			cout << "OK" << endl;
+
+			cout << "all data objects added on reference list = ";
+			if (root->getDataObject("company[1]")->getList("department").size() > 1) {
+				cout << "OK" << endl;
+			} else {
+				cout << "not added all data objects" << endl;
+			}
+
+		} else {
+			cout << "not created as many" << endl;
+		}
+	}
+
+	{
+		ConfigImpl config((std::string) TEST_RESOURCE_PATH + "testManyRelationship2.xml");
+		DASImpl* das = (DASImpl*) DASImpl::getFACTORY()->createDAS(config, *conn);
+		CommandPtr command = das->createCommand("SELECT * FROM company, department where company.id = 1;");
+		commonj::sdo::DataObjectPtr root = command->executeQuery();
+
+		cout << "reference created as not many on data graph = ";
+		if (!root->getDataFactory()->getType(DAS_NAMESPACE, "company").getProperty("department").isMany()) {
+			cout << "OK" << endl;
+
+			cout << "only one data object added on reference = ";
+			if (root->getDataObject("company[1]")->isNull("department")) {
+				cout << "reference data object not set" << endl;
+			} else {
+				cout << "OK" << endl;
+			}
+
+		} else {
+			cout << "not created as many" << endl;
+		}
+
+	}
+
+	delete conn;
+	
+	cout << "---------------------------------" << endl << endl;
+
+}
+
 int main() {
 	testPointers();
 	testUniqueObjectByID();
 	testIncompleteCompositeRelationship();
 	testCompositeRelationship();
 	testeCOCRelationship();
+	testKeyPairColumnTypeNotEqual();
+	testManyRelationship();
 
 	system("PAUSE");
 



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org