teiid SVN: r2749 - branches/7.1.x/runtime/src/main/java/org/teiid/deployers.
by teiid-commits@lists.jboss.org
Author: rareddy
Date: 2010-11-30 13:55:44 -0500 (Tue, 30 Nov 2010)
New Revision: 2749
Modified:
branches/7.1.x/runtime/src/main/java/org/teiid/deployers/ObjectSerializer.java
branches/7.1.x/runtime/src/main/java/org/teiid/deployers/VDBDeployer.java
branches/7.1.x/runtime/src/main/java/org/teiid/deployers/VDBParserDeployer.java
Log:
TEIID-1380: Based on the last modified time of the VDB file, the old serialized metadata file will be deleted if the VDB file is updated during server …
[View More]shutdown.
Modified: branches/7.1.x/runtime/src/main/java/org/teiid/deployers/ObjectSerializer.java
===================================================================
--- branches/7.1.x/runtime/src/main/java/org/teiid/deployers/ObjectSerializer.java 2010-11-30 09:03:48 UTC (rev 2748)
+++ branches/7.1.x/runtime/src/main/java/org/teiid/deployers/ObjectSerializer.java 2010-11-30 18:55:44 UTC (rev 2749)
@@ -80,6 +80,10 @@
}
}
+ public boolean isStale(File cacheFile, long timeAfter) {
+ return (cacheFile.exists() && timeAfter > cacheFile.lastModified());
+ }
+
public void removeAttachments(VFSDeploymentUnit vf) {
String dirName = baseDirectory(vf);
FileUtils.removeDirectoryAndChildren(new File(dirName));
Modified: branches/7.1.x/runtime/src/main/java/org/teiid/deployers/VDBDeployer.java
===================================================================
--- branches/7.1.x/runtime/src/main/java/org/teiid/deployers/VDBDeployer.java 2010-11-30 09:03:48 UTC (rev 2748)
+++ branches/7.1.x/runtime/src/main/java/org/teiid/deployers/VDBDeployer.java 2010-11-30 18:55:44 UTC (rev 2749)
@@ -43,7 +43,6 @@
import org.teiid.adminapi.impl.VDBMetaData;
import org.teiid.adminapi.impl.VDBTranslatorMetaData;
import org.teiid.adminapi.impl.ModelMetaData.ValidationError;
-import org.teiid.core.util.FileUtils;
import org.teiid.dqp.internal.datamgr.ConnectorManager;
import org.teiid.dqp.internal.datamgr.ConnectorManagerRepository;
import org.teiid.dqp.internal.datamgr.TranslatorRepository;
@@ -236,7 +235,7 @@
deployment.setRemoved(true);
try {
- deleteMetadataStore((VFSDeploymentUnit)unit, deployment);
+ deleteMetadataStore((VFSDeploymentUnit)unit);
} catch (IOException e) {
LogManager.logWarning(LogConstants.CTX_RUNTIME, RuntimePlugin.Util.getString("vdb_delete_failed", e.getMessage())); //$NON-NLS-1$
}
@@ -249,18 +248,17 @@
}
private void saveMetadataStore(VFSDeploymentUnit unit, VDBMetaData vdb, MetadataStoreGroup store) throws IOException {
- File cacheFileName = this.serializer.getAttachmentPath(unit, vdb.getName()+"_"+vdb.getVersion()); //$NON-NLS-1$
+ File cacheFileName = buildCachedVDBFileName(this.serializer, unit, vdb);
if (!cacheFileName.exists()) {
this.serializer.saveAttachment(cacheFileName,store);
- }
+ LogManager.logTrace(LogConstants.CTX_RUNTIME, "VDB "+unit.getRoot().getName()+" metadata has been cached to "+ cacheFileName); //$NON-NLS-1$ //$NON-NLS-2$
+ }
}
- private void deleteMetadataStore(VFSDeploymentUnit unit, VDBMetaData vdb) throws IOException {
+ private void deleteMetadataStore(VFSDeploymentUnit unit) throws IOException {
if (!unit.getRoot().exists() || !shutdownListener.isShutdownInProgress()) {
- File cacheFileName = this.serializer.getAttachmentPath(unit, vdb.getName()+"_"+vdb.getVersion()); //$NON-NLS-1$
- if (cacheFileName.exists()) {
- FileUtils.removeDirectoryAndChildren(cacheFileName.getParentFile());
- }
+ this.serializer.removeAttachments(unit);
+ LogManager.logTrace(LogConstants.CTX_RUNTIME, "VDB "+unit.getRoot().getName()+" metadata removed"); //$NON-NLS-1$ //$NON-NLS-2$
}
}
@@ -273,7 +271,7 @@
}
final boolean cache = "cached".equalsIgnoreCase(vdb.getPropertyValue("UseConnectorMetadata")); //$NON-NLS-1$ //$NON-NLS-2$
- final File cacheFile = buildCachedFileName(unit, vdb, model.getName());
+ final File cacheFile = buildCachedModelFileName(unit, vdb, model.getName());
boolean loaded = false;
if (cache) {
MetadataStore store = this.serializer.loadSafe(cacheFile, MetadataStore.class);
@@ -346,10 +344,14 @@
}
}
- private File buildCachedFileName(VFSDeploymentUnit unit, VDBMetaData vdb, String modelName) {
+ private File buildCachedModelFileName(VFSDeploymentUnit unit, VDBMetaData vdb, String modelName) {
return this.serializer.getAttachmentPath(unit, vdb.getName()+"_"+vdb.getVersion()+"_"+modelName); //$NON-NLS-1$ //$NON-NLS-2$
}
+ static File buildCachedVDBFileName(ObjectSerializer serializer, VFSDeploymentUnit unit, VDBMetaData vdb) {
+ return serializer.getAttachmentPath(unit, vdb.getName()+"_"+vdb.getVersion()); //$NON-NLS-1$
+ }
+
public void setTranslatorRepository(TranslatorRepository repo) {
this.translatorRepository = repo;
}
Modified: branches/7.1.x/runtime/src/main/java/org/teiid/deployers/VDBParserDeployer.java
===================================================================
--- branches/7.1.x/runtime/src/main/java/org/teiid/deployers/VDBParserDeployer.java 2010-11-30 09:03:48 UTC (rev 2748)
+++ branches/7.1.x/runtime/src/main/java/org/teiid/deployers/VDBParserDeployer.java 2010-11-30 18:55:44 UTC (rev 2749)
@@ -142,12 +142,21 @@
unit.addAttachment(IndexMetadataFactory.class, imf);
// add the cached store.
- File cacheFile = this.serializer.getAttachmentPath(unit, vdb.getName()+"_"+vdb.getVersion()); //$NON-NLS-1$
+ File cacheFile = VDBDeployer.buildCachedVDBFileName(this.serializer, unit, vdb);
+ // check to see if the vdb has been modified when server is down; if it is then clear the old files
+ if (this.serializer.isStale(cacheFile, unit.getRoot().getLastModified())) {
+ this.serializer.removeAttachments(unit);
+ LogManager.logTrace(LogConstants.CTX_RUNTIME, "VDB "+unit.getRoot().getName()+" old cached metadata has been removed"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
MetadataStoreGroup stores = this.serializer.loadSafe(cacheFile, MetadataStoreGroup.class);
- if (stores == null) {
+ if (stores == null) {
+ // start to build the new metadata
stores = new MetadataStoreGroup();
stores.addStore(imf.getMetadataStore(vdbRepository.getSystemStore().getDatatypes()));
}
+ else {
+ LogManager.logTrace(LogConstants.CTX_RUNTIME, "VDB "+unit.getRoot().getName()+" has being loaded from cached metadata"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
unit.addAttachment(MetadataStoreGroup.class, stores);
}
[View Less]
14 years, 3 months
teiid SVN: r2748 - in branches/7.1.x/console/src/main: resources/META-INF and 1 other directory.
by teiid-commits@lists.jboss.org
Author: tejones
Date: 2010-11-30 04:03:48 -0500 (Tue, 30 Nov 2010)
New Revision: 2748
Modified:
branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/PlatformComponent.java
branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/PlatformDiscoveryComponent.java
branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/VDBDiscoveryComponent.java
branches/7.1.x/console/src/main/resources/META-INF/rhq-plugin.xml
Log:
TEIID-1364: Added a property to the Data Services tab to enable/…
[View More]disable filtering of preview VDBs.
Modified: branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/PlatformComponent.java
===================================================================
--- branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/PlatformComponent.java 2010-11-29 21:03:01 UTC (rev 2747)
+++ branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/PlatformComponent.java 2010-11-30 09:03:48 UTC (rev 2748)
@@ -179,7 +179,6 @@
try {
managementView.updateComponent(managedComponent);
- managementView.load();
} catch (Exception e) {
LOG.error("Unable to update component [" //$NON-NLS-1$
+ managedComponent.getName() + "] of type " //$NON-NLS-1$
@@ -193,6 +192,8 @@
report.setStatus(ConfigurationUpdateStatus.FAILURE);
report.setErrorMessageFromThrowable(e);
}
+
+ managementView.load();
}
@@ -205,8 +206,8 @@
public Configuration loadResourceConfiguration() {
// Get plugin config
- Configuration c = resourceContext.getPluginConfiguration();
-
+ Configuration c = resourceConfiguration;
+
getProperties(c);
return c;
Modified: branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/PlatformDiscoveryComponent.java
===================================================================
--- branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/PlatformDiscoveryComponent.java 2010-11-29 21:03:01 UTC (rev 2747)
+++ branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/PlatformDiscoveryComponent.java 2010-11-30 09:03:48 UTC (rev 2748)
@@ -90,8 +90,7 @@
);
Configuration configuration = detail.getPluginConfiguration();
- configuration.put(new PropertySimple(
- PluginConstants.Operation.Value.LONG_RUNNING_QUERY_LIMIT, 600));
+ configuration.put(new PropertySimple("displayPreviewVDBS", Boolean.FALSE));
detail.setPluginConfiguration(configuration);
// Add to return values
Modified: branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/VDBDiscoveryComponent.java
===================================================================
--- branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/VDBDiscoveryComponent.java 2010-11-29 21:03:01 UTC (rev 2747)
+++ branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/VDBDiscoveryComponent.java 2010-11-30 09:03:48 UTC (rev 2748)
@@ -28,6 +28,10 @@
import org.apache.commons.logging.LogFactory;
import org.jboss.managed.api.ComponentType;
import org.jboss.managed.api.ManagedComponent;
+import org.jboss.managed.plugins.ManagedObjectImpl;
+import org.jboss.metatype.api.values.CollectionValueSupport;
+import org.jboss.metatype.api.values.GenericValueSupport;
+import org.jboss.metatype.api.values.MetaValue;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
@@ -58,9 +62,35 @@
.getManagedComponents(connection, new ComponentType(
PluginConstants.ComponentType.VDB.TYPE,
PluginConstants.ComponentType.VDB.SUBTYPE));
-
+
+ PropertySimple displayPreviewVdbs = ((PlatformComponent)discoveryContext.getParentResourceComponent()).getResourceConfiguration().getSimple("displayPreviewVDBS");
+
for (ManagedComponent mcVdb : vdbs) {
+ boolean skipVdb = false;
+ if (!displayPreviewVdbs.getBooleanValue()){
+ MetaValue[] propsArray = ((CollectionValueSupport)mcVdb.getProperty("JAXBProperties").getValue()).getElements();
+ String isPreview = "false";
+
+ for (MetaValue propertyMetaData : propsArray) {
+ GenericValueSupport genValueSupport = (GenericValueSupport) propertyMetaData;
+ ManagedObjectImpl managedObject = (ManagedObjectImpl) genValueSupport
+ .getValue();
+
+ String propertyName = ProfileServiceUtil.getSimpleValue(
+ managedObject, "name", String.class);
+ if (propertyName.equals("preview")){
+ isPreview =ProfileServiceUtil.getSimpleValue(
+ managedObject, "value", String.class);
+ if (Boolean.valueOf(isPreview)) skipVdb=true;
+ break;
+ }
+ }
+ }
+
+ //If this is a Preview VDB and displayPreviewVdbs is false, skip this VDB
+ if (skipVdb) continue;
+
String vdbKey = (String)mcVdb.getName();
String vdbName = vdbKey;
String fullName = ProfileServiceUtil.getSimpleValue(mcVdb, "fullName",
Modified: branches/7.1.x/console/src/main/resources/META-INF/rhq-plugin.xml
===================================================================
--- branches/7.1.x/console/src/main/resources/META-INF/rhq-plugin.xml 2010-11-29 21:03:01 UTC (rev 2747)
+++ branches/7.1.x/console/src/main/resources/META-INF/rhq-plugin.xml 2010-11-30 09:03:48 UTC (rev 2748)
@@ -296,6 +296,13 @@
property="QUERY_SERVICE_RESULT_SET_CACHE.requestCount" description="Total number of requests made against cache" />
<resource-configuration>
+ <c:group name="SessionSettings" displayName="Settings for the Data Services plugin. Will be reset with a server restart."
+ hiddenByDefault="false">
+ <c:simple-property name="displayPreviewVDBS" displayName="Display Preview VDBs"
+ description="If 'Yes', Preview VDBs (created by the Teiid Designer) will display in the Virtual Database resource grouping. The default is 'No'"
+ required="true" readOnly="false" type="boolean" default="true" />
+ </c:group>
+
<c:group name="RuntimeEngineDeployer" displayName="Runtime Engine Properties (restart required before modifications take effect)"
hiddenByDefault="false">
<c:simple-property name="RuntimeEngineDeployer.maxRowsFetchSize"
[View Less]
14 years, 4 months
teiid SVN: r2747 - in branches/7.1.x/console/src/main: java/org/teiid/rhq/plugin and 2 other directories.
by teiid-commits@lists.jboss.org
Author: tejones
Date: 2010-11-29 16:03:01 -0500 (Mon, 29 Nov 2010)
New Revision: 2747
Modified:
branches/7.1.x/console/src/main/java/org/teiid/rhq/admin/DQPManagementView.java
branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/VDBComponent.java
branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/util/PluginConstants.java
branches/7.1.x/console/src/main/resources/META-INF/rhq-plugin.xml
Log:
TEIID-1367: Added VDB level operation to clear the cache for Result Sets or …
[View More]Prepared Plans.
Modified: branches/7.1.x/console/src/main/java/org/teiid/rhq/admin/DQPManagementView.java
===================================================================
--- branches/7.1.x/console/src/main/java/org/teiid/rhq/admin/DQPManagementView.java 2010-11-24 20:56:57 UTC (rev 2746)
+++ branches/7.1.x/console/src/main/java/org/teiid/rhq/admin/DQPManagementView.java 2010-11-29 21:03:01 UTC (rev 2747)
@@ -274,6 +274,20 @@
MetaValue resultsMetaValue = executeMaterializedViewQuery( connection, vdbName, Integer.parseInt(vdbVersion));
getResultsCollectionValue(resultsMetaValue, sqlResultsObject);
operationResult.setContent(createReportResultListForMatViewQuery(fieldNameList, sqlResultsObject.iterator()));
+ } else if (operationName.equals(VDB.Operations.CLEAR_CACHE)) {
+
+ try {
+ executeClearCache( connection, vdbName, Integer.parseInt(vdbVersion),
+ (String) valueMap.get(Operation.Value.CACHE_TYPE));
+
+ }catch(Exception e){
+ //Some failure during Clear Cache. Set message here since it has already been logged.
+ operationResult.setContent("failure - see log for details"); //$NON-NLS-1$
+ }
+
+ //If no exceptions, we assume the clear cache worked
+ operationResult.setContent("cache successfully cleared!"); //$NON-NLS-1$
+
} else if (operationName.equals(VDB.Operations.RELOAD_MATVIEW)) {
MetaValue resultsMetaValue = reloadMaterializedView(connection, vdbName, Integer.parseInt(vdbVersion),
(String) valueMap.get(Operation.Value.MATVIEW_SCHEMA),
@@ -330,6 +344,22 @@
}
+ protected void executeClearCache(
+ ProfileServiceConnection connection, String vdbName, int vdbVersion, String cacheType) throws Exception {
+
+ MetaValue[] args = new MetaValue[] {SimpleValueSupport.wrap(cacheType),
+ SimpleValueSupport.wrap(vdbName),
+ SimpleValueSupport.wrap(vdbVersion) };
+
+ try {
+ executeManagedOperation(connection, getRuntimeEngineDeployer(connection, mc), VDB.Operations.CLEAR_CACHE, args);
+ } catch (Exception e) {
+ final String msg = "Exception executing operation: " + VDB.Operations.EXECUTE_QUERIES; //$NON-NLS-1$
+ LOG.error(msg, e);
+ throw e;
+ }
+ }
+
protected MetaValue executeMaterializedViewQuery(
ProfileServiceConnection connection, String vdbName, int vdbVersion) {
Modified: branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/VDBComponent.java
===================================================================
--- branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/VDBComponent.java 2010-11-24 20:56:57 UTC (rev 2746)
+++ branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/VDBComponent.java 2010-11-29 21:03:01 UTC (rev 2747)
@@ -105,7 +105,7 @@
null));
String version = VDB.VERSION;
valueMap.put(version, this.resourceConfiguration.getSimpleValue(
- "version", null));
+ VDB.VERSION, null));
// Parameter logic for VDB Operations
if (name.equals(VDB.Operations.KILL_REQUEST)) {
@@ -113,6 +113,9 @@
Operation.Value.REQUEST_ID).getLongValue());
valueMap.put(Operation.Value.SESSION_ID, configuration.getSimple(
Operation.Value.SESSION_ID).getLongValue());
+ } else if (name.equals(VDB.Operations.CLEAR_CACHE)) {
+ valueMap.put(Operation.Value.CACHE_TYPE, configuration.getSimple(
+ Operation.Value.CACHE_TYPE).getStringValue());
} else if (name.equals(Platform.Operations.KILL_SESSION)) {
valueMap.put(Operation.Value.SESSION_ID, configuration.getSimple(
Operation.Value.SESSION_ID).getLongValue());
Modified: branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/util/PluginConstants.java
===================================================================
--- branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/util/PluginConstants.java 2010-11-24 20:56:57 UTC (rev 2746)
+++ branches/7.1.x/console/src/main/java/org/teiid/rhq/plugin/util/PluginConstants.java 2010-11-29 21:03:01 UTC (rev 2747)
@@ -98,6 +98,7 @@
public static interface Operations {
public final static String GET_QUERIES = "listQueries"; //$NON-NLS-1$
+ public final static String CLEAR_CACHE = "clearCache"; //$NON-NLS-1$
public final static String EXECUTE_QUERIES = "executeQuery"; //$NON-NLS-1$
public final static String GET_LONGRUNNINGQUERIES = "getLongRunningRequests"; //$NON-NLS-1$
public final static String KILL_REQUEST = "cancelRequest"; //$NON-NLS-1$
@@ -253,6 +254,7 @@
public final static String MATVIEW_SCHEMA = "schema"; //$NON-NLS-1$
public final static String MATVIEW_TABLE = "table"; //$NON-NLS-1$
public final static String INVALIDATE_MATVIEW = "invalidate"; //$NON-NLS-1$
+ public final static String CACHE_TYPE = "cacheType"; //$NON-NLS-1$
}
Modified: branches/7.1.x/console/src/main/resources/META-INF/rhq-plugin.xml
===================================================================
--- branches/7.1.x/console/src/main/resources/META-INF/rhq-plugin.xml 2010-11-24 20:56:57 UTC (rev 2746)
+++ branches/7.1.x/console/src/main/resources/META-INF/rhq-plugin.xml 2010-11-29 21:03:01 UTC (rev 2747)
@@ -526,7 +526,26 @@
type="string" description="Result of refresh" />
</results>
</operation>
+
+ <operation name="clearCache" displayName="Clear Cache"
+ description="Clears the cache for a given type for this VDB">
+ <parameters>
+ <c:simple-property displayName="Cache Type"
+ name="cacheType" type="string" required="true"
+ description="The cache type to clear" default="QUERY_SERVICE_RESULT_SET_CACHE">
+ <c:property-options>
+ <c:option value="QUERY_SERVICE_RESULT_SET_CACHE" default="true" name="Result Set" />
+ <c:option value="PREPARED_PLAN_CACHE" name="Prepared Plan" />
+ </c:property-options>
+ </c:simple-property>
+ </parameters>
+ <results>
+ <c:simple-property displayName="Result" name="operationResult"
+ type="string" description="Result of clear cache" />
+ </results>
+ </operation>
+
<metric displayName="Status" defaultOn="true" dataType="trait"
displayType="summary" category="availability" property="status"
description="The status of this VDB" />
[View Less]
14 years, 4 months
teiid SVN: r2746 - in trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution: visitors and 1 other directory.
by teiid-commits@lists.jboss.org
Author: jdoyle
Date: 2010-11-24 15:56:57 -0500 (Wed, 24 Nov 2010)
New Revision: 2746
Modified:
trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/QueryExecutionImpl.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/SelectVisitor.java
Log:
TEIID-1362
The Salesforce API created for CXF does not drill through the SF objects so that you can get the join results. This change drills down …
[View More]through the XML looking for the child objects.
Modified: trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/QueryExecutionImpl.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/QueryExecutionImpl.java 2010-11-24 18:41:55 UTC (rev 2745)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/QueryExecutionImpl.java 2010-11-24 20:56:57 UTC (rev 2746)
@@ -32,7 +32,6 @@
import java.util.Map;
import javax.resource.ResourceException;
-import javax.xml.namespace.QName;
import org.teiid.language.AggregateFunction;
import org.teiid.language.Join;
@@ -56,12 +55,22 @@
import org.teiid.translator.salesforce.execution.visitors.JoinQueryVisitor;
import org.teiid.translator.salesforce.execution.visitors.SelectVisitor;
import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
import com.sforce.soap.partner.QueryResult;
import com.sforce.soap.partner.sobject.SObject;
public class QueryExecutionImpl implements ResultSetExecution {
+ private static final String SF_ID = "sf:Id";
+
+ private static final String SF_TYPE = "sf:type";
+
+ private static final String SF_S_OBJECT = "sf:sObject";
+
+ private static final String XSI_TYPE = "xsi:type";
+
private SalesforceConnection connection;
private RuntimeMetadata metadata;
@@ -123,7 +132,6 @@
visitor.visitNode(query);
finalQuery = visitor.getQuery().trim();
LogManager.logDetail(LogConstants.CTX_CONNECTOR, getLogPreamble(), "Executing Query:", finalQuery); //$NON-NLS-1$
-
results = connection.query(finalQuery, this.context.getBatchSize(), visitor.getQueryAll());
} else {
visitor = new SelectVisitor(metadata);
@@ -202,27 +210,77 @@
List<Object> topFields = sObject.getAny();
logAndMapFields(sObject.getType(), topFields);
List<Object[]> result = new ArrayList<Object[]>();
- for(int i = 0; i < topFields.size(); i++) {
- Element element = (Element) topFields.get(i);
- QName qName = new QName(element.getNamespaceURI(), element.getLocalName());
- if(null != qName) {
- String type = qName.getLocalPart();
- if(type.equals("sObject")) { //$NON-NLS-1$
- //SObject parent = (SObject)element.;
- //result.addAll(getObjectData(parent));
- } else if(type.equals("QueryResult")) { //$NON-NLS-1$
- //QueryResult subResult = (QueryResult)element.getValue();
- //for(int resultIndex = 0; resultIndex < subResult.getSize(); resultIndex++) {
- // SObject subObject = subResult.getRecords().get(resultIndex);
- // result.addAll(getObjectData(subObject));
- //}
- }
+ if(visitor instanceof JoinQueryVisitor) {
+ for(int i = 0; i < topFields.size(); i++) {
+ Element element = (Element) topFields.get(i);
+ extactJoinResults(element, result);
}
}
return extractDataFromFields(sObject, topFields, result);
-
+
}
+ private void extactJoinResults(Element node, List<Object[]> result) throws TranslatorException {
+ if(isSObject(node)) {
+ extractValuesFromElement(node, result);
+ } else {
+ NodeList children = node.getChildNodes();
+ if(null != children && children.getLength() > 0) {
+ for( int i = 0; i < children.getLength(); i++) {
+ Node item = children.item(i);
+ if(item instanceof Element) {
+ Element childElement = (Element)item;
+ if(isSObject(childElement)) {
+ extractValuesFromElement(childElement, result);
+ } else if(item.getChildNodes().getLength() > 0) {
+ extactJoinResults(childElement, result);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private List<Object[]> extractValuesFromElement(Element sObject,
+ List<Object[]> result) throws TranslatorException {
+ Element typeElement = (Element) sObject.getElementsByTagName(SF_TYPE).item(0);
+ String sObjectName = typeElement.getFirstChild().getNodeValue();
+ Object[] row = new Object[visitor.getSelectSymbolCount()];
+ for (int j = 0; j < visitor.getSelectSymbolCount(); j++) {
+ Column element = visitor.getSelectSymbolMetadata(j);
+ AbstractMetadataRecord parent = element.getParent();
+ Table table;
+ if(parent instanceof Table) {
+ table = (Table)parent;
+ } else {
+ parent = parent.getParent();
+ if(parent instanceof Table) {
+ table = (Table)parent;
+ } else {
+ throw new TranslatorException("Could not resolve Table for column " + element.getName()); //$NON-NLS-1$
+ }
+ }
+ if(table.getNameInSource().equals(sObjectName)) {
+ Integer index = visitor.getSelectSymbolIndex(sObjectName + ':' + element.getNameInSource());
+ // id gets dropped from the result if it is not the
+ // first field in the querystring. Add it back in.
+ if (null == index) {
+ if (element.getNameInSource().equalsIgnoreCase("id")) { //$NON-NLS-1$
+ setElementValueInColumn(j, sObject.getElementsByTagName(SF_ID), row);
+ } else {
+ throw new TranslatorException(SalesForcePlugin.Util.getString("SalesforceQueryExecutionImpl.missing.field")+ element.getNameInSource()); //$NON-NLS-1$
+ }
+ } else {
+ Object cell;
+ cell = sObject.getElementsByTagName("sf:" + element.getNameInSource()).item(0);
+ setElementValueInColumn(j, cell, row);
+ }
+ }
+ }
+ result.add(row);
+ return result;
+ }
+
private List<Object[]> extractDataFromFields(SObject sObject,
List<Object> fields, List<Object[]> result) throws TranslatorException {
Map<String,Integer> fieldToIndexMap = sObjectToResponseField.get(sObject.getType());
@@ -260,6 +318,14 @@
return result;
}
+ private void setElementValueInColumn(int columnIndex, Object value, Object[] row) {
+ if(value instanceof Element) {
+ row[columnIndex] = ((Element)value).getFirstChild().getNodeValue();
+ } else {
+ row[columnIndex] = value;
+ }
+ }
+
private void setValueInColumn(int columnIndex, Object value, List<Object[]> result) {
if(result.isEmpty()) {
Object[] row = new Object[visitor.getSelectSymbolCount()];
@@ -271,7 +337,7 @@
row[columnIndex] = value;
}
}
-
+
/**
* Load the map of response field names to index.
* @param fields
@@ -353,8 +419,12 @@
}
return result;
}
+
+ private boolean isSObject(Element element) {
+ String type = element.getAttribute(XSI_TYPE);
+ return type != null && type.equals(SF_S_OBJECT);
+ }
-
private String getLogPreamble() {
if (null == logPreamble) {
StringBuffer preamble = new StringBuffer();
Modified: trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/SelectVisitor.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/SelectVisitor.java 2010-11-24 18:41:55 UTC (rev 2745)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/SelectVisitor.java 2010-11-24 20:56:57 UTC (rev 2746)
@@ -74,7 +74,8 @@
if (expression instanceof ColumnReference) {
Column element = ((ColumnReference) expression).getMetadataObject();
selectSymbolIndexToElement.put(index, element);
- selectSymbolNameToIndex .put(element.getNameInSource(), index);
+ String qualifiedName = element.getParent().getNameInSource() + ':' + element.getNameInSource();
+ selectSymbolNameToIndex .put(qualifiedName, index);
String nameInSource = element.getNameInSource();
if (null == nameInSource || nameInSource.length() == 0) {
exceptions.add(new TranslatorException("name in source is null or empty for column "+ symbol.toString()));
@@ -182,6 +183,10 @@
return result;
}
+ public Integer getSelectSymbolIndex(String name) {
+ return selectSymbolNameToIndex.get(name);
+ }
+
/**
* Returns the index of the ID column.
* @return the index of the ID column, -1 if there is no ID column.
[View Less]
14 years, 4 months
teiid SVN: r2745 - in branches/7.1.x/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution: visitors and 1 other directory.
by teiid-commits@lists.jboss.org
Author: jdoyle
Date: 2010-11-24 13:41:55 -0500 (Wed, 24 Nov 2010)
New Revision: 2745
Modified:
branches/7.1.x/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/QueryExecutionImpl.java
branches/7.1.x/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/SelectVisitor.java
Log:
TEIID-1362
The Salesforce API created for CXF does not drill through the SF objects so that you can get the join results. This …
[View More]change drills down through the XML looking for the child objects.
Modified: branches/7.1.x/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/QueryExecutionImpl.java
===================================================================
--- branches/7.1.x/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/QueryExecutionImpl.java 2010-11-24 18:15:45 UTC (rev 2744)
+++ branches/7.1.x/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/QueryExecutionImpl.java 2010-11-24 18:41:55 UTC (rev 2745)
@@ -32,7 +32,6 @@
import java.util.Map;
import javax.resource.ResourceException;
-import javax.xml.namespace.QName;
import org.teiid.language.AggregateFunction;
import org.teiid.language.Join;
@@ -56,12 +55,22 @@
import org.teiid.translator.salesforce.execution.visitors.JoinQueryVisitor;
import org.teiid.translator.salesforce.execution.visitors.SelectVisitor;
import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
import com.sforce.soap.partner.QueryResult;
import com.sforce.soap.partner.sobject.SObject;
public class QueryExecutionImpl implements ResultSetExecution {
+ private static final String SF_ID = "sf:Id";
+
+ private static final String SF_TYPE = "sf:type";
+
+ private static final String SF_S_OBJECT = "sf:sObject";
+
+ private static final String XSI_TYPE = "xsi:type";
+
private SalesforceConnection connection;
private RuntimeMetadata metadata;
@@ -123,7 +132,6 @@
visitor.visitNode(query);
finalQuery = visitor.getQuery().trim();
LogManager.logDetail(LogConstants.CTX_CONNECTOR, getLogPreamble(), "Executing Query:", finalQuery); //$NON-NLS-1$
-
results = connection.query(finalQuery, this.context.getBatchSize(), visitor.getQueryAll());
} else {
visitor = new SelectVisitor(metadata);
@@ -202,27 +210,77 @@
List<Object> topFields = sObject.getAny();
logAndMapFields(sObject.getType(), topFields);
List<Object[]> result = new ArrayList<Object[]>();
- for(int i = 0; i < topFields.size(); i++) {
- Element element = (Element) topFields.get(i);
- QName qName = new QName(element.getNamespaceURI(), element.getLocalName());
- if(null != qName) {
- String type = qName.getLocalPart();
- if(type.equals("sObject")) { //$NON-NLS-1$
- //SObject parent = (SObject)element.;
- //result.addAll(getObjectData(parent));
- } else if(type.equals("QueryResult")) { //$NON-NLS-1$
- //QueryResult subResult = (QueryResult)element.getValue();
- //for(int resultIndex = 0; resultIndex < subResult.getSize(); resultIndex++) {
- // SObject subObject = subResult.getRecords().get(resultIndex);
- // result.addAll(getObjectData(subObject));
- //}
- }
+ if(visitor instanceof JoinQueryVisitor) {
+ for(int i = 0; i < topFields.size(); i++) {
+ Element element = (Element) topFields.get(i);
+ extactJoinResults(element, result);
}
}
return extractDataFromFields(sObject, topFields, result);
-
+
}
+ private void extactJoinResults(Element node, List<Object[]> result) throws TranslatorException {
+ if(isSObject(node)) {
+ extractValuesFromElement(node, result);
+ } else {
+ NodeList children = node.getChildNodes();
+ if(null != children && children.getLength() > 0) {
+ for( int i = 0; i < children.getLength(); i++) {
+ Node item = children.item(i);
+ if(item instanceof Element) {
+ Element childElement = (Element)item;
+ if(isSObject(childElement)) {
+ extractValuesFromElement(childElement, result);
+ } else if(item.getChildNodes().getLength() > 0) {
+ extactJoinResults(childElement, result);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private List<Object[]> extractValuesFromElement(Element sObject,
+ List<Object[]> result) throws TranslatorException {
+ Element typeElement = (Element) sObject.getElementsByTagName(SF_TYPE).item(0);
+ String sObjectName = typeElement.getFirstChild().getNodeValue();
+ Object[] row = new Object[visitor.getSelectSymbolCount()];
+ for (int j = 0; j < visitor.getSelectSymbolCount(); j++) {
+ Column element = visitor.getSelectSymbolMetadata(j);
+ AbstractMetadataRecord parent = element.getParent();
+ Table table;
+ if(parent instanceof Table) {
+ table = (Table)parent;
+ } else {
+ parent = parent.getParent();
+ if(parent instanceof Table) {
+ table = (Table)parent;
+ } else {
+ throw new TranslatorException("Could not resolve Table for column " + element.getName()); //$NON-NLS-1$
+ }
+ }
+ if(table.getNameInSource().equals(sObjectName)) {
+ Integer index = visitor.getSelectSymbolIndex(sObjectName + ':' + element.getNameInSource());
+ // id gets dropped from the result if it is not the
+ // first field in the querystring. Add it back in.
+ if (null == index) {
+ if (element.getNameInSource().equalsIgnoreCase("id")) { //$NON-NLS-1$
+ setElementValueInColumn(j, sObject.getElementsByTagName(SF_ID), row);
+ } else {
+ throw new TranslatorException(SalesForcePlugin.Util.getString("SalesforceQueryExecutionImpl.missing.field")+ element.getNameInSource()); //$NON-NLS-1$
+ }
+ } else {
+ Object cell;
+ cell = sObject.getElementsByTagName("sf:" + element.getNameInSource()).item(0);
+ setElementValueInColumn(j, cell, row);
+ }
+ }
+ }
+ result.add(row);
+ return result;
+ }
+
private List<Object[]> extractDataFromFields(SObject sObject,
List<Object> fields, List<Object[]> result) throws TranslatorException {
Map<String,Integer> fieldToIndexMap = sObjectToResponseField.get(sObject.getType());
@@ -260,6 +318,14 @@
return result;
}
+ private void setElementValueInColumn(int columnIndex, Object value, Object[] row) {
+ if(value instanceof Element) {
+ row[columnIndex] = ((Element)value).getFirstChild().getNodeValue();
+ } else {
+ row[columnIndex] = value;
+ }
+ }
+
private void setValueInColumn(int columnIndex, Object value, List<Object[]> result) {
if(result.isEmpty()) {
Object[] row = new Object[visitor.getSelectSymbolCount()];
@@ -271,7 +337,7 @@
row[columnIndex] = value;
}
}
-
+
/**
* Load the map of response field names to index.
* @param fields
@@ -353,8 +419,12 @@
}
return result;
}
+
+ private boolean isSObject(Element element) {
+ String type = element.getAttribute(XSI_TYPE);
+ return type != null && type.equals(SF_S_OBJECT);
+ }
-
private String getLogPreamble() {
if (null == logPreamble) {
StringBuffer preamble = new StringBuffer();
Modified: branches/7.1.x/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/SelectVisitor.java
===================================================================
--- branches/7.1.x/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/SelectVisitor.java 2010-11-24 18:15:45 UTC (rev 2744)
+++ branches/7.1.x/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/execution/visitors/SelectVisitor.java 2010-11-24 18:41:55 UTC (rev 2745)
@@ -74,7 +74,8 @@
if (expression instanceof ColumnReference) {
Column element = ((ColumnReference) expression).getMetadataObject();
selectSymbolIndexToElement.put(index, element);
- selectSymbolNameToIndex .put(element.getNameInSource(), index);
+ String qualifiedName = element.getParent().getNameInSource() + ':' + element.getNameInSource();
+ selectSymbolNameToIndex .put(qualifiedName, index);
String nameInSource = element.getNameInSource();
if (null == nameInSource || nameInSource.length() == 0) {
exceptions.add(new TranslatorException("name in source is null or empty for column "+ symbol.toString()));
@@ -182,6 +183,10 @@
return result;
}
+ public Integer getSelectSymbolIndex(String name) {
+ return selectSymbolNameToIndex.get(name);
+ }
+
/**
* Returns the index of the ID column.
* @return the index of the ID column, -1 if there is no ID column.
[View Less]
14 years, 4 months
teiid SVN: r2744 - in branches/7.1.x: client/src/main/java/org/teiid/adminapi and 3 other directories.
by teiid-commits@lists.jboss.org
Author: rareddy
Date: 2010-11-24 13:15:45 -0500 (Wed, 24 Nov 2010)
New Revision: 2744
Modified:
branches/7.1.x/adminshell/src/main/java/org/teiid/adminshell/AdminShell.java
branches/7.1.x/client/src/main/java/org/teiid/adminapi/Admin.java
branches/7.1.x/client/src/main/java/org/teiid/adminapi/impl/DQPManagement.java
branches/7.1.x/jboss-integration/src/main/java/org/teiid/adminapi/jboss/Admin.java
branches/7.1.x/jboss-integration/src/main/java/org/teiid/jboss/deployers/…
[View More]RuntimeEngineDeployer.java
Log:
TEIID-1379: Adding a new "clearCache" admin api call that can be used clear cache specific to a VDB.
Modified: branches/7.1.x/adminshell/src/main/java/org/teiid/adminshell/AdminShell.java
===================================================================
--- branches/7.1.x/adminshell/src/main/java/org/teiid/adminshell/AdminShell.java 2010-11-24 18:11:42 UTC (rev 2743)
+++ branches/7.1.x/adminshell/src/main/java/org/teiid/adminshell/AdminShell.java 2010-11-24 18:15:45 UTC (rev 2744)
@@ -141,6 +141,14 @@
@Doc(text = "cache type") String cacheType) throws AdminException {
getAdmin().clearCache(cacheType);
}
+
+ @Doc(text = "Clear the given cache for a VDB")
+ public static void clearCache(
+ @Doc(text = "cache type") String cacheType, @Doc(text = "vdb name") String vdbName,
+ @Doc(text = "vdb version") int vdbVersion
+ ) throws AdminException {
+ getAdmin().clearCache(cacheType, vdbName, vdbVersion);
+ }
@Doc(text = "Delete a VDB")
public static void deleteVDB(
Modified: branches/7.1.x/client/src/main/java/org/teiid/adminapi/Admin.java
===================================================================
--- branches/7.1.x/client/src/main/java/org/teiid/adminapi/Admin.java 2010-11-24 18:11:42 UTC (rev 2743)
+++ branches/7.1.x/client/src/main/java/org/teiid/adminapi/Admin.java 2010-11-24 18:15:45 UTC (rev 2744)
@@ -168,6 +168,16 @@
* @throws AdminException
*/
void clearCache(String cacheType) throws AdminException;
+
+ /**
+ * Clear the cache of the given VDB for provided cache type
+ * @param cacheType Cache Type
+ * No wild cards currently supported, must be explicit
+ * @param vdbName - Name of the VDB
+ * @param vdbVersion - VDB version
+ * @throws AdminException
+ */
+ void clearCache(String cacheType, String vdbName, int vdbVersion) throws AdminException;
/**
Modified: branches/7.1.x/client/src/main/java/org/teiid/adminapi/impl/DQPManagement.java
===================================================================
--- branches/7.1.x/client/src/main/java/org/teiid/adminapi/impl/DQPManagement.java 2010-11-24 18:11:42 UTC (rev 2743)
+++ branches/7.1.x/client/src/main/java/org/teiid/adminapi/impl/DQPManagement.java 2010-11-24 18:15:45 UTC (rev 2744)
@@ -35,6 +35,7 @@
boolean cancelRequest(String sessionId, long requestId) throws AdminException;
Collection<String> getCacheTypes();
void clearCache(String cacheType);
+ void clearCache(String cacheType, String vdbName, int version);
Collection<SessionMetadata> getActiveSessions() throws AdminException;
int getActiveSessionsCount() throws AdminException;
Collection<org.teiid.adminapi.Transaction> getTransactions();
Modified: branches/7.1.x/jboss-integration/src/main/java/org/teiid/adminapi/jboss/Admin.java
===================================================================
--- branches/7.1.x/jboss-integration/src/main/java/org/teiid/adminapi/jboss/Admin.java 2010-11-24 18:11:42 UTC (rev 2743)
+++ branches/7.1.x/jboss-integration/src/main/java/org/teiid/adminapi/jboss/Admin.java 2010-11-24 18:15:45 UTC (rev 2744)
@@ -329,6 +329,17 @@
}
@Override
+ public void clearCache(String cacheType, String vdbName, int version) throws AdminException{
+ try {
+ ManagedComponent mc = getView().getComponent(DQPNAME, DQPTYPE);
+ ManagedUtil.executeOperation(mc, "clearCache", SimpleValueSupport.wrap(cacheType), //$NON-NLS-1$
+ SimpleValueSupport.wrap(vdbName), SimpleValueSupport.wrap(version));
+ } catch (Exception e) {
+ throw new AdminComponentException(e.getMessage(), e);
+ }
+ }
+
+ @Override
public Collection<Transaction> getTransactions() throws AdminException {
try {
Collection<Transaction> txnList = new ArrayList<Transaction>();
Modified: branches/7.1.x/jboss-integration/src/main/java/org/teiid/jboss/deployers/RuntimeEngineDeployer.java
===================================================================
--- branches/7.1.x/jboss-integration/src/main/java/org/teiid/jboss/deployers/RuntimeEngineDeployer.java 2010-11-24 18:11:42 UTC (rev 2743)
+++ branches/7.1.x/jboss-integration/src/main/java/org/teiid/jboss/deployers/RuntimeEngineDeployer.java 2010-11-24 18:15:45 UTC (rev 2744)
@@ -426,6 +426,12 @@
}
@Override
+ @ManagementOperation(description="Clear the caches in the system for a VDB", params={@ManagementParameter(name="cacheType",description="Type of Cache"), @ManagementParameter(name="vdbName",description="VDB Name"),@ManagementParameter(name="version",description="VDB Version")}, impact=Impact.ReadOnly)
+ public void clearCache(String cacheType, String vdbName, int version) {
+ this.dqpCore.clearCache(cacheType, vdbName, version);
+ }
+
+ @Override
@ManagementOperation(description="Get the cache statistics", impact=Impact.ReadOnly)
public CacheStatisticsMetadata getCacheStatistics(String cacheType) {
return this.dqpCore.getCacheStatistics(cacheType);
[View Less]
14 years, 4 months
teiid SVN: r2743 - in trunk: engine/src/main/java/org/teiid/query/optimizer/relational/rules and 4 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2010-11-24 13:11:42 -0500 (Wed, 24 Nov 2010)
New Revision: 2743
Modified:
trunk/documentation/reference/src/main/docbook/en-US/content/updatable_views.xml
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java
trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java
trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
trunk/engine/src/main/java/org/teiid/query/validator/…
[View More]UpdateValidator.java
trunk/engine/src/test/java/org/teiid/query/validator/TestUpdateValidator.java
Log:
TEIID-1349 adding support to detect key preserved in non-ansi joins
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/updatable_views.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/updatable_views.xml 2010-11-24 17:42:05 UTC (rev 2742)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/updatable_views.xml 2010-11-24 18:11:42 UTC (rev 2743)
@@ -50,7 +50,7 @@
<para>A key-preserved table has a primary or unique key that would remain unique if it were projected into the result of the query.
Note that it is not actually required for a view to reference the key columns in the SELECT clause.
- The query engine can detect a key preserved table by analyzing the join structure - which is currently required to be in ANSI join form.
+ The query engine can detect a key preserved table by analyzing the join structure.
The engine will ensure that a join of a key-preserved table must be against one of its foreign keys.</para>
</section>
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java 2010-11-24 17:42:05 UTC (rev 2742)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleMergeCriteria.java 2010-11-24 18:11:42 UTC (rev 2743)
@@ -540,7 +540,7 @@
return true;
}
HashSet<GroupSymbol> keyPreservingGroups = new HashSet<GroupSymbol>();
- ResolverUtil.findKeyPreserinvg((FromClause)query.getFrom().getClauses().get(0), keyPreservingGroups, metadata);
+ ResolverUtil.findKeyPreserved(query, keyPreservingGroups, metadata);
return NewCalculateCostUtil.usesKey(expressions, keyPreservingGroups, metadata);
}
Modified: trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java 2010-11-24 17:42:05 UTC (rev 2742)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/util/ResolverUtil.java 2010-11-24 18:11:42 UTC (rev 2743)
@@ -56,6 +56,7 @@
import org.teiid.query.optimizer.relational.rules.RuleChooseJoinStrategy;
import org.teiid.query.optimizer.relational.rules.RuleRaiseAccess;
import org.teiid.query.sql.LanguageObject;
+import org.teiid.query.sql.lang.CompareCriteria;
import org.teiid.query.sql.lang.Criteria;
import org.teiid.query.sql.lang.FromClause;
import org.teiid.query.sql.lang.JoinPredicate;
@@ -941,8 +942,67 @@
symbol.setOutputName(name);
}
- public static void findKeyPreserinvg(FromClause clause, Set<GroupSymbol> keyPreservingGroups, QueryMetadataInterface metadata)
+ public static void findKeyPreserved(Query query, Set<GroupSymbol> keyPreservingGroups, QueryMetadataInterface metadata)
throws TeiidComponentException, QueryMetadataException {
+ if (query.getFrom() == null) {
+ return;
+ }
+ if (query.getFrom().getClauses().size() == 1) {
+ findKeyPreserved((FromClause)query.getFrom().getClauses().get(0), keyPreservingGroups, metadata);
+ return;
+ }
+ //non-ansi join
+ Set<GroupSymbol> groups = new HashSet<GroupSymbol>(query.getFrom().getGroups());
+ for (GroupSymbol groupSymbol : groups) {
+ if (metadata.getUniqueKeysInGroup(groupSymbol.getMetadataID()).isEmpty()) {
+ return;
+ }
+ }
+ LinkedList<Expression> leftExpressions = new LinkedList<Expression>();
+ LinkedList<Expression> rightExpressions = new LinkedList<Expression>();
+ for (Criteria crit : Criteria.separateCriteriaByAnd(query.getCriteria())) {
+ if (!(crit instanceof CompareCriteria)) {
+ continue;
+ }
+ CompareCriteria cc = (CompareCriteria)crit;
+ if (cc.getOperator() != CompareCriteria.EQ) {
+ continue;
+ }
+ if (cc.getLeftExpression() instanceof ElementSymbol && cc.getRightExpression() instanceof ElementSymbol) {
+ ElementSymbol left = (ElementSymbol)cc.getLeftExpression();
+ ElementSymbol right = (ElementSymbol)cc.getRightExpression();
+ int compare = left.getGroupSymbol().compareTo(right.getGroupSymbol());
+ if (compare > 0) {
+ leftExpressions.add(left);
+ rightExpressions.add(right);
+ } else if (compare != 0) {
+ leftExpressions.add(right);
+ rightExpressions.add(left);
+ }
+ }
+ }
+ HashMap<List<GroupSymbol>, List<HashSet<Object>>> crits = createGroupMap(leftExpressions, rightExpressions);
+ HashSet<GroupSymbol> tempSet = new HashSet<GroupSymbol>();
+ for (GroupSymbol group : groups) {
+ LinkedHashSet<GroupSymbol> visited = new LinkedHashSet<GroupSymbol>();
+ LinkedList<GroupSymbol> toVisit = new LinkedList<GroupSymbol>();
+ toVisit.add(group);
+ while (!toVisit.isEmpty()) {
+ GroupSymbol visiting = toVisit.removeLast();
+ if (!visited.add(visiting)) {
+ continue;
+ }
+ toVisit.addAll(findKeyPreserved(tempSet, Collections.singleton(visiting), crits, true, metadata, groups));
+ toVisit.addAll(findKeyPreserved(tempSet, Collections.singleton(visiting), crits, false, metadata, groups));
+ }
+ if (visited.containsAll(groups)) {
+ keyPreservingGroups.add(group);
+ }
+ }
+ }
+
+ public static void findKeyPreserved(FromClause clause, Set<GroupSymbol> keyPreservingGroups, QueryMetadataInterface metadata)
+ throws TeiidComponentException, QueryMetadataException {
if (clause instanceof UnaryFromClause) {
UnaryFromClause ufc = (UnaryFromClause)clause;
@@ -956,9 +1016,9 @@
return;
}
HashSet<GroupSymbol> leftPk = new HashSet<GroupSymbol>();
- findKeyPreserinvg(jp.getLeftClause(), leftPk, metadata);
+ findKeyPreserved(jp.getLeftClause(), leftPk, metadata);
HashSet<GroupSymbol> rightPk = new HashSet<GroupSymbol>();
- findKeyPreserinvg(jp.getRightClause(), rightPk, metadata);
+ findKeyPreserved(jp.getRightClause(), rightPk, metadata);
if (leftPk.isEmpty() && rightPk.isEmpty()) {
return;
@@ -973,48 +1033,58 @@
LinkedList<Expression> rightExpressions = new LinkedList<Expression>();
RuleChooseJoinStrategy.separateCriteria(leftGroups, rightGroups, leftExpressions, rightExpressions, jp.getJoinCriteria(), new LinkedList<Criteria>());
- HashMap<List<GroupSymbol>, List<HashSet<Object>>> crits = new HashMap<List<GroupSymbol>, List<HashSet<Object>>>();
-
- for (int i = 0; i < leftExpressions.size(); i++) {
- Expression lexpr = leftExpressions.get(i);
- Expression rexpr = rightExpressions.get(i);
- if (!(lexpr instanceof ElementSymbol) || !(rexpr instanceof ElementSymbol)) {
- continue;
- }
- ElementSymbol les = (ElementSymbol)lexpr;
- ElementSymbol res = (ElementSymbol)rexpr;
- List<GroupSymbol> tbls = Arrays.asList(les.getGroupSymbol(), res.getGroupSymbol());
- List<HashSet<Object>> ids = crits.get(tbls);
- if (ids == null) {
- ids = Arrays.asList(new HashSet<Object>(), new HashSet<Object>());
- crits.put(tbls, ids);
- }
- ids.get(0).add(les.getMetadataID());
- ids.get(1).add(res.getMetadataID());
- }
+ HashMap<List<GroupSymbol>, List<HashSet<Object>>> crits = createGroupMap(leftExpressions, rightExpressions);
if (!leftPk.isEmpty() && (jp.getJoinType() == JoinType.JOIN_INNER || jp.getJoinType() == JoinType.JOIN_LEFT_OUTER)) {
- findKeyPreserving(keyPreservingGroups, leftPk, crits, true, metadata);
+ findKeyPreserved(keyPreservingGroups, leftPk, crits, true, metadata, rightPk);
}
if (!rightPk.isEmpty() && (jp.getJoinType() == JoinType.JOIN_INNER || jp.getJoinType() == JoinType.JOIN_RIGHT_OUTER)) {
- findKeyPreserving(keyPreservingGroups, rightPk, crits, false, metadata);
+ findKeyPreserved(keyPreservingGroups, rightPk, crits, false, metadata, leftPk);
}
}
}
- static private void findKeyPreserving(Set<GroupSymbol> keyPreservingGroups,
- HashSet<GroupSymbol> pk,
- HashMap<List<GroupSymbol>, List<HashSet<Object>>> crits, boolean left, QueryMetadataInterface metadata)
+ private static HashMap<List<GroupSymbol>, List<HashSet<Object>>> createGroupMap(
+ LinkedList<Expression> leftExpressions,
+ LinkedList<Expression> rightExpressions) {
+ HashMap<List<GroupSymbol>, List<HashSet<Object>>> crits = new HashMap<List<GroupSymbol>, List<HashSet<Object>>>();
+
+ for (int i = 0; i < leftExpressions.size(); i++) {
+ Expression lexpr = leftExpressions.get(i);
+ Expression rexpr = rightExpressions.get(i);
+ if (!(lexpr instanceof ElementSymbol) || !(rexpr instanceof ElementSymbol)) {
+ continue;
+ }
+ ElementSymbol les = (ElementSymbol)lexpr;
+ ElementSymbol res = (ElementSymbol)rexpr;
+ List<GroupSymbol> tbls = Arrays.asList(les.getGroupSymbol(), res.getGroupSymbol());
+ List<HashSet<Object>> ids = crits.get(tbls);
+ if (ids == null) {
+ ids = Arrays.asList(new HashSet<Object>(), new HashSet<Object>());
+ crits.put(tbls, ids);
+ }
+ ids.get(0).add(les.getMetadataID());
+ ids.get(1).add(res.getMetadataID());
+ }
+ return crits;
+ }
+
+ static private HashSet<GroupSymbol> findKeyPreserved(Set<GroupSymbol> keyPreservingGroups,
+ Set<GroupSymbol> pk,
+ HashMap<List<GroupSymbol>, List<HashSet<Object>>> crits, boolean left, QueryMetadataInterface metadata, Set<GroupSymbol> otherGroups)
throws TeiidComponentException, QueryMetadataException {
+ HashSet<GroupSymbol> result = new HashSet<GroupSymbol>();
for (GroupSymbol gs : pk) {
for (Map.Entry<List<GroupSymbol>, List<HashSet<Object>>> entry : crits.entrySet()) {
- if (!entry.getKey().get(left?0:1).equals(gs)) {
+ if (!entry.getKey().get(left?0:1).equals(gs) || !otherGroups.contains(entry.getKey().get(left?1:0))) {
continue;
}
if (RuleRaiseAccess.matchesForeignKey(metadata, entry.getValue().get(left?0:1), entry.getValue().get(left?1:0), gs, false)) {
keyPreservingGroups.add(gs);
+ result.add(entry.getKey().get(left?1:0));
}
}
}
+ return result;
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2010-11-24 17:42:05 UTC (rev 2742)
+++ trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2010-11-24 18:11:42 UTC (rev 2743)
@@ -688,7 +688,7 @@
if (query.getFrom().getClauses().size() > 1) {
continue;
}
- ResolverUtil.findKeyPreserinvg((FromClause)query.getFrom().getClauses().get(0), keyPreservingGroups, metadata);
+ ResolverUtil.findKeyPreserved(query, keyPreservingGroups, metadata);
if (!NewCalculateCostUtil.usesKey(plannedResult.leftExpressions, keyPreservingGroups, metadata)) {
continue;
}
Modified: trunk/engine/src/main/java/org/teiid/query/validator/UpdateValidator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/UpdateValidator.java 2010-11-24 17:42:05 UTC (rev 2742)
+++ trunk/engine/src/main/java/org/teiid/query/validator/UpdateValidator.java 2010-11-24 18:11:42 UTC (rev 2743)
@@ -35,7 +35,6 @@
import org.teiid.query.metadata.SupportConstants;
import org.teiid.query.resolver.util.ResolverUtil;
import org.teiid.query.sql.lang.Command;
-import org.teiid.query.sql.lang.FromClause;
import org.teiid.query.sql.lang.Query;
import org.teiid.query.sql.lang.UnaryFromClause;
import org.teiid.query.sql.symbol.ElementSymbol;
@@ -233,9 +232,7 @@
List<GroupSymbol> allGroups = query.getFrom().getGroups();
HashSet<GroupSymbol> keyPreservingGroups = new HashSet<GroupSymbol>();
- if (query.getFrom().getClauses().size() == 1) {
- ResolverUtil.findKeyPreserinvg((FromClause)query.getFrom().getClauses().get(0), keyPreservingGroups, metadata);
- }
+ ResolverUtil.findKeyPreserved(query, keyPreservingGroups, metadata);
for (GroupSymbol groupSymbol : keyPreservingGroups) {
setUpdateFlags(groupSymbol);
Modified: trunk/engine/src/test/java/org/teiid/query/validator/TestUpdateValidator.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/validator/TestUpdateValidator.java 2010-11-24 17:42:05 UTC (rev 2742)
+++ trunk/engine/src/test/java/org/teiid/query/validator/TestUpdateValidator.java 2010-11-24 18:11:42 UTC (rev 2743)
@@ -230,6 +230,11 @@
helpTest("SELECT pm1.g1.e1 FROM pm1.g1, pm1.g2",
example1(), true);
}
+
+ @Test public void testCreateInsertCommand14(){
+ helpTest("SELECT pm1.g2.e1 FROM pm1.g1, pm1.g2 where g1.e1 = g2.e1",
+ example1(), false);
+ }
@Test public void testCreateInsertCommand2_fail(){
helpTest("SELECT CONCAT(pm1.g1.e1, convert(pm1.g2.e1, string)) as x FROM pm1.g1, pm1.g2",
[View Less]
14 years, 4 months
teiid SVN: r2742 - branches/7.1.x/documentation/reference/src/main/docbook/en-US/content.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2010-11-24 12:42:05 -0500 (Wed, 24 Nov 2010)
New Revision: 2742
Modified:
branches/7.1.x/documentation/reference/src/main/docbook/en-US/content/translators.xml
Log:
TEIID-1369 adding information about modeshape usage
Modified: branches/7.1.x/documentation/reference/src/main/docbook/en-US/content/translators.xml
===================================================================
--- branches/7.1.x/documentation/reference/src/main/docbook/en-US/content/translators.xml …
[View More]2010-11-24 16:50:41 UTC (rev 2741)
+++ branches/7.1.x/documentation/reference/src/main/docbook/en-US/content/translators.xml 2010-11-24 17:42:05 UTC (rev 2742)
@@ -247,6 +247,16 @@
</listitem>
<listitem>
<para>
+ <emphasis>modeshape</emphasis> - for use with Modeshape 2.2.1 or later. The PATH, NAME, LOCALNODENAME, DEPTH, and SCORE functions should be accessed as pseudo-columns, e.g. "nt:base"."jcr:path".
+ Teiid UFDs (prefixed by JCR_) are available for CONTIANS, ISCHILDNODE, ISDESCENDENT, ISSAMENODE, REFERENCE - see the JCRFunctions.xmi.
+ If a selector name is needed in a JCR function, you should use the pseudo-column "jcr:path", e.g. JCR_ISCHILDNODE(foo.jcr_path, 'x/y') would become ISCHILDNODE(foo, 'x/y') in the ModeShape query.
+ An additional pseudo-column "mode:properties" should be imported by setting the ModeShape JDBC connection property teiidsupport=true.
+ The column "mode:properties" should be used by the JCR_REFERENCE and other
+ functions that expect a .* selector name, e.g. JCR_REFERENCE(nt_base.jcr_properties) would become REFERENCE("nt:base".*) in the ModeShape query.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
<emphasis>mysql</emphasis>/<emphasis>mysql5</emphasis> - for use with
MySQL version 4.x and 5 or later respectively.
</para>
[View Less]
14 years, 4 months
teiid SVN: r2741 - in branches/7.1.x/connectors/translator-jdbc/src: test/java/org/teiid/translator/jdbc/modeshape and 1 other directory.
by teiid-commits@lists.jboss.org
Author: vhalbert(a)redhat.com
Date: 2010-11-24 11:50:41 -0500 (Wed, 24 Nov 2010)
New Revision: 2741
Modified:
branches/7.1.x/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/modeshape/IdentifierFunctionModifier.java
branches/7.1.x/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/modeshape/TestModeShapeSqlTranslator.java
Log:
TEIID-1369 changed the translator to look for jcr:path, instead of mode:path
Modified: branches/7.1.x/connectors/translator-…
[View More]jdbc/src/main/java/org/teiid/translator/jdbc/modeshape/IdentifierFunctionModifier.java
===================================================================
--- branches/7.1.x/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/modeshape/IdentifierFunctionModifier.java 2010-11-24 16:06:08 UTC (rev 2740)
+++ branches/7.1.x/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/modeshape/IdentifierFunctionModifier.java 2010-11-24 16:50:41 UTC (rev 2741)
@@ -62,7 +62,7 @@
if ("\"mode:properties\"".equalsIgnoreCase(c.getNameInSource())) { //$NON-NLS-1$
dotAll = true;
useSelector = true;
- } else if ("\"mode:path\"".equalsIgnoreCase(c.getNameInSource())) { //$NON-NLS-1$
+ } else if ("\"jcr:path\"".equalsIgnoreCase(c.getNameInSource())) { //$NON-NLS-1$
useSelector = true;
}
}
Modified: branches/7.1.x/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/modeshape/TestModeShapeSqlTranslator.java
===================================================================
--- branches/7.1.x/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/modeshape/TestModeShapeSqlTranslator.java 2010-11-24 16:06:08 UTC (rev 2740)
+++ branches/7.1.x/connectors/translator-jdbc/src/test/java/org/teiid/translator/jdbc/modeshape/TestModeShapeSqlTranslator.java 2010-11-24 16:50:41 UTC (rev 2741)
@@ -61,13 +61,13 @@
Schema modeshape = RealMetadataFactory.createPhysicalModel("modeshape", store);
Table nt_base = RealMetadataFactory.createPhysicalGroup("nt_base", modeshape);
nt_base.setNameInSource("\"nt:base\"");
- List<Column> cols = RealMetadataFactory.createElements(nt_base, new String[] { "mode_path",
+ List<Column> cols = RealMetadataFactory.createElements(nt_base, new String[] { "jcr_path",
"mode_properties", "jcr_primaryType", "prop" }, new String[] {
TypeFacility.RUNTIME_NAMES.STRING,
TypeFacility.RUNTIME_NAMES.STRING,
TypeFacility.RUNTIME_NAMES.STRING,
TypeFacility.RUNTIME_NAMES.STRING });
- cols.get(0).setNameInSource("\"mode:path\"");
+ cols.get(0).setNameInSource("\"jcr:path\"");
cols.get(1).setNameInSource("\"mode:properties\"");
cols.get(2).setNameInSource("\"jcr:primaryType\"");
return RealMetadataFactory.createTransformationMetadata(store, "modeshape");
@@ -81,7 +81,7 @@
@Test
public void testSelectAllFromBase() throws Exception {
String input = "select * from nt_base"; //$NON-NLS-1$
- String output = "SELECT g_0.\"mode:path\", g_0.\"mode:properties\", g_0.\"jcr:primaryType\", g_0.prop FROM \"nt:base\" AS g_0"; //$NON-NLS-1$
+ String output = "SELECT g_0.\"jcr:path\", g_0.\"mode:properties\", g_0.\"jcr:primaryType\", g_0.prop FROM \"nt:base\" AS g_0"; //$NON-NLS-1$
helpTestVisitor(input, output);
@@ -90,7 +90,7 @@
@Test
public void testPredicate() throws Exception {
- String input = "SELECT x.jcr_primaryType from nt_base inner join nt_base as x on jcr_issamenode(nt_base.mode_path, x.mode_path) = true where jcr_isdescendantnode(nt_base.mode_path, 'x/y/z') = true and jcr_reference(nt_base.mode_properties) = 'x'"; //$NON-NLS-1$
+ String input = "SELECT x.jcr_primaryType from nt_base inner join nt_base as x on jcr_issamenode(nt_base.jcr_path, x.jcr_path) = true where jcr_isdescendantnode(nt_base.jcr_path, 'x/y/z') = true and jcr_reference(nt_base.mode_properties) = 'x'"; //$NON-NLS-1$
String output = "SELECT g_1.\"jcr:primaryType\" FROM \"nt:base\" AS g_0 INNER JOIN \"nt:base\" AS g_1 ON issamenode(g_0, g_1) WHERE isdescendantnode(g_0, 'x/y/z') AND reference(g_0.*) = 'x'"; //$NON-NLS-1$
helpTestVisitor(input, output);
[View Less]
14 years, 4 months
teiid SVN: r2740 - branches/7.1.x/console.
by teiid-commits@lists.jboss.org
Author: tejones
Date: 2010-11-24 11:06:08 -0500 (Wed, 24 Nov 2010)
New Revision: 2740
Modified:
branches/7.1.x/console/pom.xml
Log:
TEIID-1378: Removed build step that copied the Teiid client jar into the plugin's lib folder.
Modified: branches/7.1.x/console/pom.xml
===================================================================
--- branches/7.1.x/console/pom.xml 2010-11-23 21:23:39 UTC (rev 2739)
+++ branches/7.1.x/console/pom.xml 2010-11-24 16:06:08 UTC (rev 2740)
@@ -160,34 +160,6 @@…
[View More]
<build>
<outputDirectory>target/classes</outputDirectory>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <executions>
- <execution>
- <id>copy</id>
- <phase>clean</phase>
- <goals>
- <goal>copy</goal>
- </goals>
- <configuration>
- <artifactItems>
- <artifactItem>
- <groupId>org.jboss.teiid</groupId>
- <artifactId>teiid-client</artifactId>
- <version>${project.version}</version>
- <type>jar</type>
- <overWrite>true</overWrite>
- </artifactItem>
- </artifactItems>
- <outputDirectory>src/main/resources/lib</outputDirectory>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
-
<resources>
<resource>
<directory>src/main/resources</directory>
@@ -195,7 +167,6 @@
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
- <include>**/teiid*client*.jar</include>
</includes>
</resource>
</resources>
[View Less]
14 years, 4 months