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;