From f5256452e18a1f2ea8ae65d8a1e7724fc25bf357 Mon Sep 17 00:00:00 2001 From: vhalbert Date: Tue, 14 Jan 2014 13:56:48 -0600 Subject: [PATCH] TEIID-2799 When the metadata is imported for the cache, add the pkkey when its defined --- .../teiid/translator/object/ObjectPlugin.java | 3 +- .../InfinispanExecutionFactory.java | 10 ----- .../metadata/JavaBeanMetadataProcessor.java | 44 +++++++++++++------ .../teiid/translator/object/i18n.properties | 2 + .../object/TestObjectExecutionFactory.java | 2 + 5 files changed, 37 insertions(+), 24 deletions(-) diff --git a/connectors/translator-object/src/main/java/org/teiid/translator/object/ObjectPlugin.java b/connectors/translator-object/src/main/java/org/teiid/translator/object/ObjectPlugin.java index 90343430bc..441c82d4a5 100644 --- a/connectors/translator-object/src/main/java/org/teiid/translator/object/ObjectPlugin.java +++ b/connectors/translator-object/src/main/java/org/teiid/translator/object/ObjectPlugin.java @@ -38,6 +38,7 @@ public class ObjectPlugin { */ public static final BundleUtil Util = new BundleUtil(PLUGIN_ID, PLUGIN_ID + ".i18n", ResourceBundle.getBundle(PLUGIN_ID + ".i18n")); //$NON-NLS-1$ //$NON-NLS-2$ - public static enum Event implements BundleUtil.Event { + public static enum Event implements BundleUtil.Event{ + TEIID21000 } } diff --git a/connectors/translator-object/src/main/java/org/teiid/translator/object/infinispan/InfinispanExecutionFactory.java b/connectors/translator-object/src/main/java/org/teiid/translator/object/infinispan/InfinispanExecutionFactory.java index 21b0cf408e..4afbf5d0d8 100644 --- a/connectors/translator-object/src/main/java/org/teiid/translator/object/infinispan/InfinispanExecutionFactory.java +++ b/connectors/translator-object/src/main/java/org/teiid/translator/object/infinispan/InfinispanExecutionFactory.java @@ -91,12 +91,6 @@ public List search(Select command, String cacheName, ObjectConnection connection, ExecutionContext executionContext) throws TranslatorException { -// ClassLoader cl = Thread.currentThread().getContextClassLoader(); -// try { -// Thread.currentThread().setContextClassLoader( -// -// (executionContext.getCommandContext() != null ? executionContext.getCommandContext().getVDBClassLoader() : this.getClass().getClassLoader() ) ); - if (supportsLuceneSearching()) { Class type = connection.getType(cacheName); return LuceneSearch.performSearch(command, type, cacheName, @@ -104,10 +98,6 @@ public List search(Select command, String cacheName, } return super.search(command, cacheName, connection, executionContext); - -// } finally { -// Thread.currentThread().setContextClassLoader(cl); -// } } } diff --git a/connectors/translator-object/src/main/java/org/teiid/translator/object/metadata/JavaBeanMetadataProcessor.java b/connectors/translator-object/src/main/java/org/teiid/translator/object/metadata/JavaBeanMetadataProcessor.java index c444325535..e341d3d0e9 100644 --- a/connectors/translator-object/src/main/java/org/teiid/translator/object/metadata/JavaBeanMetadataProcessor.java +++ b/connectors/translator-object/src/main/java/org/teiid/translator/object/metadata/JavaBeanMetadataProcessor.java @@ -25,9 +25,12 @@ import java.lang.reflect.Method; import java.util.LinkedHashMap; import java.util.Map; +import java.util.ArrayList; import javax.script.ScriptException; +import org.teiid.logging.LogConstants; +import org.teiid.logging.LogManager; import org.teiid.metadata.BaseColumn.NullType; import org.teiid.metadata.Column; import org.teiid.metadata.Column.SearchType; @@ -38,6 +41,7 @@ import org.teiid.translator.TypeFacility; import org.teiid.translator.object.ObjectConnection; import org.teiid.translator.object.ObjectExecutionFactory; +import org.teiid.translator.object.ObjectPlugin; /** @@ -81,7 +85,7 @@ private Table createSourceTable(MetadataFactory mf, Class entity, String cach table.setProperty(ENTITYCLASS, entity.getName()); String columnName = tableName + OBJECT_COL_SUFFIX; - addColumn(mf, entity, entity, columnName, "this", SearchType.Unsearchable, table); //$NON-NLS-1$ + addColumn(mf, entity, entity, columnName, "this", SearchType.Unsearchable, table, true); //$NON-NLS-1$ Map methods; try { methods = engine.getMethodMap(entity); @@ -89,21 +93,33 @@ private Table createSourceTable(MetadataFactory mf, Class entity, String cach throw new MetadataException(e); } - Method pkMethod = null; - if (pkField != null) { - pkMethod = methods.get(pkField); - if (pkMethod != null) { - addColumn(mf, entity, pkMethod.getReturnType(), pkField, pkField, SearchType.Searchable, table); - } else { - //TODO: warning/error? - } - } - + Method pkMethod = null; + if (pkField != null) { + pkMethod = methods.get(pkField); + if (pkMethod != null) { + addColumn(mf, entity, pkMethod.getReturnType(), pkField, pkField, SearchType.Searchable, table, true); + } else { + // add a column so the PKey can be created, but make it not selectable + addColumn(mf, entity, java.lang.String.class, pkField, pkField, SearchType.Searchable, table, false); + + } + + String pkName = "PK_" + pkField.toUpperCase(); + ArrayList x = new ArrayList(1) ; + x.add(pkField); + mf.addPrimaryKey(pkName, x , table); + + } else { + // warn if no pk is defined + LogManager.logWarning(LogConstants.CTX_CONNECTOR, ObjectPlugin.Util.gs(ObjectPlugin.Event.TEIID21000, tableName)); + } + //we have to filter the duplicate names, isFoo vs. foo Map methodsToAdd = new LinkedHashMap(); for (Map.Entry entry : methods.entrySet()) { String name = methodsToAdd.get(entry.getValue()); if (name == null || name.length() > entry.getKey().length()) { + // dont create a column for the already created PKkey if (entry.getValue() == pkMethod || entry.getValue().getDeclaringClass() == Object.class || entry.getValue().getName().equals("toString") //$NON-NLS-1$ @@ -116,8 +132,9 @@ private Table createSourceTable(MetadataFactory mf, Class entity, String cach } for (Map.Entry entry : methodsToAdd.entrySet()) { - addColumn(mf, entity, entry.getKey().getReturnType(), entry.getValue(), entry.getValue(), SearchType.Unsearchable, table); + addColumn(mf, entity, entry.getKey().getReturnType(), entry.getValue(), entry.getValue(), SearchType.Unsearchable, table, true); } + return table; } @@ -145,7 +162,7 @@ protected boolean isUpdateable(Class entity, String columnName) { return this.isUpdatable; } - protected Column addColumn(MetadataFactory mf, Class entity, Class type, String attributeName, String nis, SearchType searchType, Table entityTable) { + protected Column addColumn(MetadataFactory mf, Class entity, Class type, String attributeName, String nis, SearchType searchType, Table entityTable, boolean selectable) { Column c = entityTable.getColumnByName(attributeName); if (c != null) { //TODO: there should be a log here @@ -158,6 +175,7 @@ protected Column addColumn(MetadataFactory mf, Class entity, Class type, S c.setUpdatable(isUpdateable(entity, attributeName)); c.setSearchType(searchType); c.setNativeType(type.getName()); + c.setSelectable(selectable); if (type.isPrimitive()) { c.setNullType(NullType.No_Nulls); } diff --git a/connectors/translator-object/src/main/resources/org/teiid/translator/object/i18n.properties b/connectors/translator-object/src/main/resources/org/teiid/translator/object/i18n.properties index 1852be95e8..36945b9cac 100644 --- a/connectors/translator-object/src/main/resources/org/teiid/translator/object/i18n.properties +++ b/connectors/translator-object/src/main/resources/org/teiid/translator/object/i18n.properties @@ -24,3 +24,5 @@ LuceneSearch.unsupportedComparingByNull=Comparing using a NULL is not currently LuceneSearch.Unsupported_expression=Unsupported expression of {0} when performing {1} MapCacheConnection.unexpectedObjectTypeInCache=Unexpected root object type in the cache is {0}, expected {1} + +TEIID21000=No primary key was defined for table {0}, consider defining one for better performance. \ No newline at end of file diff --git a/connectors/translator-object/src/test/java/org/teiid/translator/object/TestObjectExecutionFactory.java b/connectors/translator-object/src/test/java/org/teiid/translator/object/TestObjectExecutionFactory.java index d7d0908ec2..b7f13cba41 100644 --- a/connectors/translator-object/src/test/java/org/teiid/translator/object/TestObjectExecutionFactory.java +++ b/connectors/translator-object/src/test/java/org/teiid/translator/object/TestObjectExecutionFactory.java @@ -102,6 +102,8 @@ public TestFactory() { assertEquals(NullType.No_Nulls, physicalTable.getColumns().get(1).getNullType()); //name assertEquals("string", physicalTable.getColumns().get(2).getRuntimeType()); + + assertEquals(1, physicalTable.getAllKeys().size()); } }