[teiid-commits] teiid SVN: r4342 - in branches/8.1.x: engine/src/test/java/org/teiid/query/metadata and 3 other directories.

teiid-commits at lists.jboss.org teiid-commits at lists.jboss.org
Mon Aug 20 10:50:36 EDT 2012


Author: shawkins
Date: 2012-08-20 10:50:35 -0400 (Mon, 20 Aug 2012)
New Revision: 4342

Modified:
   branches/8.1.x/api/src/main/java/org/teiid/metadata/MetadataFactory.java
   branches/8.1.x/engine/src/test/java/org/teiid/query/metadata/TestTransformationMetadata.java
   branches/8.1.x/jboss-integration/src/main/java/org/teiid/jboss/VDBService.java
   branches/8.1.x/metadata/src/main/java/org/teiid/metadata/index/IndexMetadataRepository.java
   branches/8.1.x/runtime/src/main/java/org/teiid/runtime/EmbeddedServer.java
Log:
TEIID-2116 fix for serialized datatypes

Modified: branches/8.1.x/api/src/main/java/org/teiid/metadata/MetadataFactory.java
===================================================================
--- branches/8.1.x/api/src/main/java/org/teiid/metadata/MetadataFactory.java	2012-08-17 19:34:53 UTC (rev 4341)
+++ branches/8.1.x/api/src/main/java/org/teiid/metadata/MetadataFactory.java	2012-08-20 14:50:35 UTC (rev 4342)
@@ -24,7 +24,6 @@
 
 import java.io.Serializable;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -48,6 +47,7 @@
 	private String vdbName;
 	private int vdbVersion;
 	private Map<String, Datatype> dataTypes;
+	private Map<String, Datatype> builtinDataTypes;
 	private boolean autoCorrectColumnNames = true;
 	private Map<String, String> namespaces = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
 	private String rawMetadata;
@@ -56,10 +56,11 @@
 	private String idPrefix; 
 	private int count;
 	
-	public MetadataFactory(String vdbName, int vdbVersion, String schemaName, Map<String, Datatype> dataTypes, Properties importProperties, String rawMetadata) {
+	public MetadataFactory(String vdbName, int vdbVersion, String schemaName, Map<String, Datatype> runtimeTypes, Properties importProperties, String rawMetadata) {
 		this.vdbName = vdbName;
 		this.vdbVersion = vdbVersion;
-		this.dataTypes = dataTypes;
+		this.dataTypes = runtimeTypes;
+		this.builtinDataTypes = runtimeTypes;
 		schema.setName(schemaName);
 		long msb = longHash(vdbName, 0);
 		msb = 31*msb + vdbVersion;
@@ -359,7 +360,7 @@
 	
 	public void mergeInto (MetadataStore store) {
 		store.addSchema(this.schema);
-		store.addDataTypes(this.dataTypes.values());
+		store.addDataTypes(this.builtinDataTypes.values());
 	}
 	
 	public MetadataStore asMetadataStore() {
@@ -372,21 +373,56 @@
 		this.schema = schema;
 	}
 
+	/**
+	 * get runtime types keyed by runtime name, which is 
+	 * a type name known to the Teiid engine
+	 * @return
+	 */
 	public Map<String, Datatype> getDataTypes() {
 		return dataTypes;
 	}
 	
-	void addDataTypes(Collection<Datatype> types) {
-		for (Datatype type: types) {
-			addDatatype(type);
+	/**
+	 * To be called if the MetadataFactory is deserialized to set the canonical system
+	 * type value.
+	 * @param dt
+	 * @param builtin
+	 */
+	public void correctDatatypes(Map<String, Datatype> dt, Map<String, Datatype> builtin) {
+		this.dataTypes = dt;
+		this.builtinDataTypes = builtin;
+		for (Table t : this.schema.getTables().values()) {
+			correctDataTypes(t.getColumns());
 		}
+		for (Procedure p : this.schema.getProcedures().values()) {
+			correctDataTypes(p.getParameters());
+			if (p.getResultSet() != null) {
+				correctDataTypes(p.getResultSet().getColumns());
+			}
+		}
 	}
+
+	private void correctDataTypes(List<? extends BaseColumn> cols) {
+		if (cols == null) {
+			return;
+		}
+		for (BaseColumn c : cols) {
+			if (c.getDatatype() == null) {
+				continue;
+			}
+			Datatype dt = this.builtinDataTypes.get(c.getDatatype().getName());
+			if (dt != null) {
+				c.setDatatype(dt);
+			} else {
+				//must be an enterprise type
+				//if it's used in a single schema, we're ok, but when used in multiple there's an issue
+				addDatatype(dt);
+			}
+		}
+	}
 	
 	public void addDatatype(Datatype datatype) {
-		if (this.dataTypes == null) {
-			this.dataTypes = new TreeMap<String, Datatype>();
-		}
-		this.dataTypes.put(datatype.getName(), datatype);
+		this.builtinDataTypes.put(datatype.getName(), datatype);
 	}
 
 	public String getVdbName() {
@@ -400,4 +436,18 @@
 	public Map<String, String> getNamespaces() {
 		return namespaces;
 	}
+	
+	public void setBuiltinDataTypes(Map<String, Datatype> builtinDataTypes) {
+		this.builtinDataTypes = builtinDataTypes;
+	}
+
+	/**
+	 * get all built-in types, known to Designer and defined in the system metadata.
+	 * The entries are keyed by type name, which is typically the xsd type name. 
+	 * @see #getDataTypes() for run-time types
+	 * @return
+	 */
+	public Map<String, Datatype> getBuiltinDataTypes() {
+		return builtinDataTypes;
+	}
 }

Modified: branches/8.1.x/engine/src/test/java/org/teiid/query/metadata/TestTransformationMetadata.java
===================================================================
--- branches/8.1.x/engine/src/test/java/org/teiid/query/metadata/TestTransformationMetadata.java	2012-08-17 19:34:53 UTC (rev 4341)
+++ branches/8.1.x/engine/src/test/java/org/teiid/query/metadata/TestTransformationMetadata.java	2012-08-20 14:50:35 UTC (rev 4342)
@@ -37,6 +37,8 @@
 import org.teiid.adminapi.impl.VDBMetaData;
 import org.teiid.api.exception.query.QueryMetadataException;
 import org.teiid.core.types.DataTypeManager;
+import org.teiid.core.util.UnitTestUtil;
+import org.teiid.metadata.Column;
 import org.teiid.metadata.Datatype;
 import org.teiid.metadata.MetadataFactory;
 import org.teiid.metadata.Table;
@@ -160,4 +162,23 @@
 		assertEquals(1, tm.getXMLSchemas(tm.getGroupID("x1.doc")).size());
 	}
 	
+	@Test public void testTypeCorrection() throws Exception {
+		MetadataFactory mf = new MetadataFactory(null, 1, "x", SystemMetadata.getInstance().getBuiltinTypeMap(), new Properties(), null); //$NON-NLS-1$
+		mf.setBuiltinDataTypes(SystemMetadata.getInstance().getSystemStore().getDatatypes());
+		
+		Table t = mf.addTable("y"); //$NON-NLS-1$
+		mf.addColumn("test", "string", t);
+		
+		MetadataFactory mf1 = UnitTestUtil.helpSerialize(mf);
+		
+		Column column = mf1.getSchema().getTable("y").getColumns().get(0);
+		Datatype dt = column.getDatatype();
+		
+		assertNotSame(mf.getBuiltinDataTypes().get(dt.getName()), column.getDatatype());
+		
+		mf1.correctDatatypes(mf.getDataTypes(), mf.getBuiltinDataTypes());
+		
+		assertSame(mf.getBuiltinDataTypes().get(dt.getName()), column.getDatatype());
+	}
+	
 }

Modified: branches/8.1.x/jboss-integration/src/main/java/org/teiid/jboss/VDBService.java
===================================================================
--- branches/8.1.x/jboss-integration/src/main/java/org/teiid/jboss/VDBService.java	2012-08-17 19:34:53 UTC (rev 4341)
+++ branches/8.1.x/jboss-integration/src/main/java/org/teiid/jboss/VDBService.java	2012-08-20 14:50:35 UTC (rev 4342)
@@ -76,7 +76,6 @@
 import org.teiid.metadata.MetadataFactory;
 import org.teiid.metadata.MetadataRepository;
 import org.teiid.metadata.MetadataStore;
-import org.teiid.metadata.index.IndexMetadataRepository;
 import org.teiid.query.ObjectReplicator;
 import org.teiid.query.metadata.TransformationMetadata;
 import org.teiid.query.metadata.TransformationMetadata.Resource;
@@ -340,23 +339,20 @@
 			@Override
 			public void run() {
 				
-				boolean metadataLoaded = false;
 				boolean cached = false;
 				Exception ex = null;
-				
+				// designer based models define data types based on their built in data types, which are system vdb data types
+				Map<String, Datatype> datatypes = getVDBRepository().getBuiltinDatatypes();
+				Map<String, Datatype> builtin = getVDBRepository().getSystemStore().getDatatypes();
 				final File cachedFile = getSerializer().buildModelFile(vdb, model.getName());
 				MetadataFactory factory = getSerializer().loadSafe(cachedFile, MetadataFactory.class);
 				if (factory != null) {
-					metadataLoaded = true;
+					factory.correctDatatypes(datatypes, builtin);
 					cached = true;
 					LogManager.logTrace(LogConstants.CTX_RUNTIME, "Model ", model.getName(), "in VDB ", vdb.getName(), " was loaded from cached metadata"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				}
-				
-				if (!metadataLoaded) {
-					boolean indexStore = (metadataRepo instanceof IndexMetadataRepository);
-					// designer based models define data types based on their built in data types, which are system vdb data types
-					Map<String, Datatype> datatypes = indexStore?getVDBRepository().getSystemStore().getDatatypes():getVDBRepository().getBuiltinDatatypes();
+				} else {
 					factory = new MetadataFactory(vdb.getName(), vdb.getVersion(), model.getName(), datatypes, model.getProperties(), model.getSchemaText());
+					factory.setBuiltinDataTypes(builtin);
 					factory.getSchema().setPhysical(model.isSource());
 					
 					ExecutionFactory ef = null;
@@ -374,14 +370,13 @@
 					try {
 						metadataRepo.loadMetadata(factory, ef, cf);		
 						LogManager.logInfo(LogConstants.CTX_RUNTIME, IntegrationPlugin.Util.gs(IntegrationPlugin.Event.TEIID50030,vdb.getName(), vdb.getVersion(), model.getName(), SimpleDateFormat.getInstance().format(new Date())));
-						metadataLoaded = true;
 					} catch (Exception e) {
 						ex = e;
 					}
 				}
 		    					
 				synchronized (vdb) {
-			    	if (metadataLoaded) {
+			    	if (ex == null) {
 			    		if (!cached) {
 				    		// cache the schema to disk
 							cacheMetadataStore(model, factory);

Modified: branches/8.1.x/metadata/src/main/java/org/teiid/metadata/index/IndexMetadataRepository.java
===================================================================
--- branches/8.1.x/metadata/src/main/java/org/teiid/metadata/index/IndexMetadataRepository.java	2012-08-17 19:34:53 UTC (rev 4341)
+++ branches/8.1.x/metadata/src/main/java/org/teiid/metadata/index/IndexMetadataRepository.java	2012-08-20 14:50:35 UTC (rev 4342)
@@ -41,7 +41,7 @@
 			throws TranslatorException {
 		try {
 			if (this.idxStore.getSchema(factory.getName()) == null) {
-				this.idxStore.load(factory.getName(), factory.getDataTypes() == null?null:factory.getDataTypes().values());
+				this.idxStore.load(factory.getName(), factory.getBuiltinDataTypes().values());
 			}
 			if (this.idxStore.getSchema(factory.getName()) == null) {
 				throw new TranslatorException(RuntimeMetadataPlugin.Util.gs(RuntimeMetadataPlugin.Event.TEIID80004, factory.getName()));

Modified: branches/8.1.x/runtime/src/main/java/org/teiid/runtime/EmbeddedServer.java
===================================================================
--- branches/8.1.x/runtime/src/main/java/org/teiid/runtime/EmbeddedServer.java	2012-08-17 19:34:53 UTC (rev 4341)
+++ branches/8.1.x/runtime/src/main/java/org/teiid/runtime/EmbeddedServer.java	2012-08-20 14:50:35 UTC (rev 4342)
@@ -37,7 +37,6 @@
 import java.util.Properties;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
 
 import javax.transaction.RollbackException;
 import javax.transaction.Synchronization;
@@ -538,6 +537,7 @@
 			AtomicInteger loadCount) throws TranslatorException {
 		Map<String, Datatype> datatypes = this.repo.getBuiltinDatatypes();
 		MetadataFactory factory = new MetadataFactory(vdb.getName(), vdb.getVersion(), model.getName(), datatypes, model.getProperties(), model.getSchemaText());
+		factory.setBuiltinDataTypes(this.repo.getSystemStore().getDatatypes());
 		factory.getSchema().setPhysical(model.isSource());
 		
 		ExecutionFactory ef = null;



More information about the teiid-commits mailing list