[teiid-commits] teiid SVN: r4474 - in trunk: connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc and 6 other directories.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Wed Sep 26 13:05:51 EDT 2012
Author: rareddy
Date: 2012-09-26 13:05:51 -0400 (Wed, 26 Sep 2012)
New Revision: 4474
Added:
trunk/connectors/translator-jpa/src/main/java/org/teiid/translator/jpa/JPQLDirectQueryExecution.java
trunk/connectors/translator-jpa/src/test/java/org/teiid/translator/jpa/TestJPADirectQueryExecution.java
Modified:
trunk/api/src/main/java/org/teiid/translator/BaseDelegatingExecutionFactory.java
trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCExecutionFactory.java
trunk/connectors/translator-jpa/src/main/java/org/teiid/translator/jpa/JPA2ExecutionFactory.java
trunk/connectors/translator-jpa/src/main/java/org/teiid/translator/jpa/JPAPlugin.java
trunk/connectors/translator-jpa/src/main/resources/org/teiid/translator/jpa/i18n.properties
trunk/connectors/translator-ldap/src/main/java/org/teiid/translator/ldap/LDAPExecutionFactory.java
trunk/connectors/translator-olap/src/main/java/org/teiid/translator/olap/OlapExecutionFactory.java
trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/SalesForceExecutionFactory.java
Log:
TEIID-2176: Adding the native query procedures JPA2 translator.
Modified: trunk/api/src/main/java/org/teiid/translator/BaseDelegatingExecutionFactory.java
===================================================================
--- trunk/api/src/main/java/org/teiid/translator/BaseDelegatingExecutionFactory.java 2012-09-26 00:32:18 UTC (rev 4473)
+++ trunk/api/src/main/java/org/teiid/translator/BaseDelegatingExecutionFactory.java 2012-09-26 17:05:51 UTC (rev 4474)
@@ -461,7 +461,7 @@
return delegate.supportsNativeQueries();
}
@Override
- public ResultSetExecution createDirectExecution(List<Argument> arguments,
+ public ProcedureExecution createDirectExecution(List<Argument> arguments,
Command command, ExecutionContext executionContext,
RuntimeMetadata metadata, C connection) throws TranslatorException {
return delegate.createDirectExecution(arguments, command, executionContext, metadata, connection);
Modified: trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java
===================================================================
--- trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java 2012-09-26 00:32:18 UTC (rev 4473)
+++ trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java 2012-09-26 17:05:51 UTC (rev 4474)
@@ -302,7 +302,7 @@
}
@SuppressWarnings("unused")
- public ResultSetExecution createDirectExecution(List<Argument> arguments, Command command, ExecutionContext executionContext, RuntimeMetadata metadata, C connection) throws TranslatorException {
+ public ProcedureExecution createDirectExecution(List<Argument> arguments, Command command, ExecutionContext executionContext, RuntimeMetadata metadata, C connection) throws TranslatorException {
throw new TranslatorException(DataPlugin.Event.TEIID60001, DataPlugin.Util.gs(DataPlugin.Event.TEIID60001, "createDirectExecution")); //$NON-NLS-1$
}
Modified: trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCExecutionFactory.java
===================================================================
--- trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCExecutionFactory.java 2012-09-26 00:32:18 UTC (rev 4473)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCExecutionFactory.java 2012-09-26 17:05:51 UTC (rev 4474)
@@ -208,7 +208,7 @@
}
@Override
- public ResultSetExecution createDirectExecution(List<Argument> arguments, Command command, ExecutionContext executionContext, RuntimeMetadata metadata, Connection conn)
+ public ProcedureExecution createDirectExecution(List<Argument> arguments, Command command, ExecutionContext executionContext, RuntimeMetadata metadata, Connection conn)
throws TranslatorException {
//TODO: This is not correct; this should be only called once for connection creation
obtainedConnection(conn);
Modified: trunk/connectors/translator-jpa/src/main/java/org/teiid/translator/jpa/JPA2ExecutionFactory.java
===================================================================
--- trunk/connectors/translator-jpa/src/main/java/org/teiid/translator/jpa/JPA2ExecutionFactory.java 2012-09-26 00:32:18 UTC (rev 4473)
+++ trunk/connectors/translator-jpa/src/main/java/org/teiid/translator/jpa/JPA2ExecutionFactory.java 2012-09-26 17:05:51 UTC (rev 4474)
@@ -31,6 +31,7 @@
import javax.persistence.EntityManagerFactory;
import org.teiid.core.util.PropertiesUtils;
+import org.teiid.language.Argument;
import org.teiid.language.Call;
import org.teiid.language.Command;
import org.teiid.language.QueryExpression;
@@ -51,6 +52,10 @@
public class JPA2ExecutionFactory extends ExecutionFactory<EntityManagerFactory, EntityManager> {
private Map<String, FunctionModifier> functionModifiers = new TreeMap<String, FunctionModifier>(String.CASE_INSENSITIVE_ORDER);
+ public JPA2ExecutionFactory() {
+ setSupportsNativeQueries(true);
+ }
+
@Override
public void start() throws TranslatorException {
super.start();
@@ -95,6 +100,12 @@
}
@Override
+ public ProcedureExecution createDirectExecution(List<Argument> arguments, Command command, ExecutionContext executionContext, RuntimeMetadata metadata, EntityManager connection) throws TranslatorException {
+ return new JPQLDirectQueryExecution(arguments, command, executionContext, metadata, connection);
+ }
+
+
+ @Override
public void getMetadata(MetadataFactory mf, EntityManager em) throws TranslatorException {
JPAMetadataProcessor metadataProcessor = new JPAMetadataProcessor();
PropertiesUtils.setBeanProperties(metadataProcessor, mf.getImportProperties(), "importer"); //$NON-NLS-1$
Modified: trunk/connectors/translator-jpa/src/main/java/org/teiid/translator/jpa/JPAPlugin.java
===================================================================
--- trunk/connectors/translator-jpa/src/main/java/org/teiid/translator/jpa/JPAPlugin.java 2012-09-26 00:32:18 UTC (rev 4473)
+++ trunk/connectors/translator-jpa/src/main/java/org/teiid/translator/jpa/JPAPlugin.java 2012-09-26 17:05:51 UTC (rev 4474)
@@ -40,6 +40,7 @@
TEIID14004,
TEIID14005,
TEIID14006,
- TEIID14007
+ TEIID14007,
+ TEIID14008
}
}
Added: trunk/connectors/translator-jpa/src/main/java/org/teiid/translator/jpa/JPQLDirectQueryExecution.java
===================================================================
--- trunk/connectors/translator-jpa/src/main/java/org/teiid/translator/jpa/JPQLDirectQueryExecution.java (rev 0)
+++ trunk/connectors/translator-jpa/src/main/java/org/teiid/translator/jpa/JPQLDirectQueryExecution.java 2012-09-26 17:05:51 UTC (rev 4474)
@@ -0,0 +1,131 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+package org.teiid.translator.jpa;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+
+import org.teiid.language.Argument;
+import org.teiid.language.Command;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.metadata.RuntimeMetadata;
+import org.teiid.translator.DataNotAvailableException;
+import org.teiid.translator.ExecutionContext;
+import org.teiid.translator.ProcedureExecution;
+import org.teiid.translator.TranslatorException;
+
+public class JPQLDirectQueryExecution extends JPQLBaseExecution implements ProcedureExecution{
+ private Iterator resultsIterator;
+ private List<Argument> arguments;
+ private int updateCount = -1;
+ private boolean updateQuery;
+
+ @SuppressWarnings("unused")
+ public JPQLDirectQueryExecution(List<Argument> arguments, Command command, ExecutionContext executionContext, RuntimeMetadata metadata, EntityManager em) {
+ super(executionContext, metadata, em);
+ this.arguments = arguments;
+ }
+
+ @Override
+ public void execute() throws TranslatorException {
+ String query = (String)arguments.get(0).getArgumentValue().getValue();
+ String firstToken = null;
+
+ StringTokenizer st = new StringTokenizer(query, ";"); //$NON-NLS-1$
+ if (st.hasMoreTokens()) {
+ firstToken = st.nextToken();
+ if (!firstToken.equalsIgnoreCase("search") && !firstToken.equalsIgnoreCase("create") && !firstToken.equalsIgnoreCase("update") && !firstToken.equalsIgnoreCase("delete")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ throw new TranslatorException(JPAPlugin.Util.gs(JPAPlugin.Event.TEIID14008));
+ }
+ }
+
+ String jpql = query.substring(7);
+ LogManager.logTrace(LogConstants.CTX_CONNECTOR, "JPA Source-Query:", jpql); //$NON-NLS-1$
+
+ if (firstToken.equalsIgnoreCase("search")) { // //$NON-NLS-1$
+ Query queryCommand = this.enityManager.createQuery(jpql);
+ List results = queryCommand.getResultList();
+ this.resultsIterator = results.iterator();
+ }
+ else if (firstToken.equalsIgnoreCase("create")) { // //$NON-NLS-1$
+ Object entity = arguments.get(1).getArgumentValue().getValue();
+ this.enityManager.merge(entity);
+ this.updateCount = 1;
+ this.updateQuery = true;
+ }
+ else if (firstToken.equalsIgnoreCase("update") || firstToken.equalsIgnoreCase("delete")) { // //$NON-NLS-1$ //$NON-NLS-2$
+ Query queryCmd = this.enityManager.createQuery(jpql);
+ this.updateCount = queryCmd.executeUpdate();
+ this.updateQuery = true;
+ }
+ }
+
+ @Override
+ public List<?> next() throws TranslatorException, DataNotAvailableException {
+
+ // for insert/update/delete clauses
+ if (this.updateQuery) {
+ if (this.updateCount != -1) {
+ List<Object[]> row = new ArrayList<Object[]>(1);
+ row.add(new Object[] {this.updateCount});
+ this.updateCount = -1;
+ return row;
+ }
+ return null;
+ }
+
+ if (this.resultsIterator != null && this.resultsIterator.hasNext()) {
+ Object obj = this.resultsIterator.next();
+ if (obj instanceof Object[]) {
+ List<Object[]> row = new ArrayList<Object[]>(1);
+ row.add((Object[])obj);
+ return row;
+ }
+ return Arrays.asList(new Object[] {obj});
+ }
+ return null;
+ }
+
+ @Override
+ public void close() {
+ // no close
+ this.resultsIterator = null;
+
+ }
+
+ @Override
+ public void cancel() throws TranslatorException {
+ // no cancel
+ }
+
+ @Override
+ public List<?> getOutputParameterValues() throws TranslatorException {
+ return null;
+ }
+}
Property changes on: trunk/connectors/translator-jpa/src/main/java/org/teiid/translator/jpa/JPQLDirectQueryExecution.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/connectors/translator-jpa/src/main/resources/org/teiid/translator/jpa/i18n.properties
===================================================================
--- trunk/connectors/translator-jpa/src/main/resources/org/teiid/translator/jpa/i18n.properties 2012-09-26 00:32:18 UTC (rev 4473)
+++ trunk/connectors/translator-jpa/src/main/resources/org/teiid/translator/jpa/i18n.properties 2012-09-26 17:05:51 UTC (rev 4474)
@@ -4,4 +4,5 @@
TEIID14004=No parent table found for {0}
TEIID14005=Bushy joins are not supported.
TEIID14006=Unsupported join semantics, join can only be done where relationship exists
-TEIID14007=Columns.size and values.size are not the same
\ No newline at end of file
+TEIID14007=Columns.size and values.size are not the same
+TEIID14008=Unknown JPAQL Request; the query string must start with [search|create|update|delete]
\ No newline at end of file
Added: trunk/connectors/translator-jpa/src/test/java/org/teiid/translator/jpa/TestJPADirectQueryExecution.java
===================================================================
--- trunk/connectors/translator-jpa/src/test/java/org/teiid/translator/jpa/TestJPADirectQueryExecution.java (rev 0)
+++ trunk/connectors/translator-jpa/src/test/java/org/teiid/translator/jpa/TestJPADirectQueryExecution.java 2012-09-26 17:05:51 UTC (rev 4474)
@@ -0,0 +1,132 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+package org.teiid.translator.jpa;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
+import org.teiid.cdk.api.TranslationUtility;
+import org.teiid.cdk.unittest.FakeTranslationFactory;
+import org.teiid.language.Command;
+import org.teiid.metadata.RuntimeMetadata;
+import org.teiid.translator.ExecutionContext;
+import org.teiid.translator.TranslatorException;
+
+ at SuppressWarnings("nls")
+public class TestJPADirectQueryExecution {
+
+ private static JPA2ExecutionFactory TRANSLATOR;
+
+ @BeforeClass
+ public static void setUp() throws TranslatorException {
+ TRANSLATOR = new JPA2ExecutionFactory();
+ TRANSLATOR.start();
+ }
+
+ @Test public void testSearch() throws Exception {
+ String input = "exec native('search;SELECT Account.Id, Account.Type, Account.Name FROM Account')";
+
+ TranslationUtility util = FakeTranslationFactory.getInstance().getExampleTranslationUtility();
+ Command command = util.parseCommand(input);
+ ExecutionContext ec = Mockito.mock(ExecutionContext.class);
+ RuntimeMetadata rm = Mockito.mock(RuntimeMetadata.class);
+ EntityManager connection = Mockito.mock(EntityManager.class);
+ Query query = Mockito.mock(Query.class);
+
+ Mockito.stub(connection.createQuery("SELECT Account.Id, Account.Type, Account.Name FROM Account")).toReturn(query);
+
+ JPQLDirectQueryExecution execution = (JPQLDirectQueryExecution)TRANSLATOR.createExecution(command, ec, rm, connection);
+ execution.execute();
+
+ Mockito.verify(connection, Mockito.times(1)).createQuery("SELECT Account.Id, Account.Type, Account.Name FROM Account");
+ }
+
+ @Test public void testWithoutMarker() throws Exception {
+ String input = "exec native('jpa query')";
+
+ TranslationUtility util = FakeTranslationFactory.getInstance().getExampleTranslationUtility();
+ Command command = util.parseCommand(input);
+ ExecutionContext ec = Mockito.mock(ExecutionContext.class);
+ RuntimeMetadata rm = Mockito.mock(RuntimeMetadata.class);
+ EntityManager connection = Mockito.mock(EntityManager.class);
+
+ try {
+ JPQLDirectQueryExecution execution = (JPQLDirectQueryExecution)TRANSLATOR.createExecution(command, ec, rm, connection);
+ execution.execute();
+ fail("the above should have thrown exception");
+ } catch (TranslatorException e) {
+ }
+ }
+
+ @Test public void testDelete() throws Exception {
+ String input = "exec native('delete;delete-query')";
+
+ TranslationUtility util = FakeTranslationFactory.getInstance().getExampleTranslationUtility();
+ Command command = util.parseCommand(input);
+ ExecutionContext ec = Mockito.mock(ExecutionContext.class);
+ RuntimeMetadata rm = Mockito.mock(RuntimeMetadata.class);
+ EntityManager connection = Mockito.mock(EntityManager.class);
+
+ Query query = Mockito.mock(Query.class);
+ Mockito.stub(query.executeUpdate()).toReturn(12);
+ Mockito.stub(connection.createQuery("delete-query")).toReturn(query);
+
+ ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
+
+ JPQLDirectQueryExecution execution = (JPQLDirectQueryExecution)TRANSLATOR.createExecution(command, ec, rm, connection);
+ execution.execute();
+
+ Mockito.verify(connection, Mockito.times(1)).createQuery(argument.capture());
+
+ assertEquals("delete-query", argument.getValue());
+
+ assertArrayEquals(new Object[] {12}, (Object[])execution.next().get(0));
+ }
+
+ @Test public void testCreate() throws Exception {
+ String input = "exec native('create;', 'one')";
+
+ TranslationUtility util = FakeTranslationFactory.getInstance().getExampleTranslationUtility();
+ Command command = util.parseCommand(input);
+ ExecutionContext ec = Mockito.mock(ExecutionContext.class);
+ RuntimeMetadata rm = Mockito.mock(RuntimeMetadata.class);
+ EntityManager connection = Mockito.mock(EntityManager.class);
+
+ ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
+ Mockito.stub(connection.merge(argument.capture())).toReturn(new String("one"));
+
+ JPQLDirectQueryExecution execution = (JPQLDirectQueryExecution)TRANSLATOR.createExecution(command, ec, rm, connection);
+ execution.execute();
+
+ Mockito.verify(connection).merge(argument.capture());
+
+ assertEquals("one", argument.getValue());
+ }
+}
Property changes on: trunk/connectors/translator-jpa/src/test/java/org/teiid/translator/jpa/TestJPADirectQueryExecution.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/connectors/translator-ldap/src/main/java/org/teiid/translator/ldap/LDAPExecutionFactory.java
===================================================================
--- trunk/connectors/translator-ldap/src/main/java/org/teiid/translator/ldap/LDAPExecutionFactory.java 2012-09-26 00:32:18 UTC (rev 4473)
+++ trunk/connectors/translator-ldap/src/main/java/org/teiid/translator/ldap/LDAPExecutionFactory.java 2012-09-26 17:05:51 UTC (rev 4474)
@@ -33,6 +33,7 @@
import org.teiid.metadata.RuntimeMetadata;
import org.teiid.translator.ExecutionContext;
import org.teiid.translator.ExecutionFactory;
+import org.teiid.translator.ProcedureExecution;
import org.teiid.translator.ResultSetExecution;
import org.teiid.translator.Translator;
import org.teiid.translator.TranslatorException;
@@ -105,7 +106,7 @@
}
@Override
- public ResultSetExecution createDirectExecution(List<Argument> arguments,Command command, ExecutionContext executionContext,RuntimeMetadata metadata, LdapContext context) throws TranslatorException {
+ public ProcedureExecution createDirectExecution(List<Argument> arguments,Command command, ExecutionContext executionContext,RuntimeMetadata metadata, LdapContext context) throws TranslatorException {
String query = (String) arguments.get(0).getArgumentValue().getValue();
if (query.startsWith("search;")) { //$NON-NLS-1$
return new LDAPDirectSearchQueryExecution(arguments, this, executionContext, context);
Modified: trunk/connectors/translator-olap/src/main/java/org/teiid/translator/olap/OlapExecutionFactory.java
===================================================================
--- trunk/connectors/translator-olap/src/main/java/org/teiid/translator/olap/OlapExecutionFactory.java 2012-09-26 00:32:18 UTC (rev 4473)
+++ trunk/connectors/translator-olap/src/main/java/org/teiid/translator/olap/OlapExecutionFactory.java 2012-09-26 17:05:51 UTC (rev 4474)
@@ -36,7 +36,7 @@
import org.teiid.metadata.RuntimeMetadata;
import org.teiid.translator.ExecutionContext;
import org.teiid.translator.ExecutionFactory;
-import org.teiid.translator.ResultSetExecution;
+import org.teiid.translator.ProcedureExecution;
import org.teiid.translator.Translator;
import org.teiid.translator.TranslatorException;
@@ -51,7 +51,7 @@
}
@Override
- public ResultSetExecution createDirectExecution(List<Argument> arguments, Command command, ExecutionContext executionContext, RuntimeMetadata metadata, Connection connection) throws TranslatorException {
+ public ProcedureExecution createDirectExecution(List<Argument> arguments, Command command, ExecutionContext executionContext, RuntimeMetadata metadata, Connection connection) throws TranslatorException {
return new OlapQueryExecution(arguments, command, unwrap(connection), executionContext, this);
}
Modified: trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/SalesForceExecutionFactory.java
===================================================================
--- trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/SalesForceExecutionFactory.java 2012-09-26 00:32:18 UTC (rev 4473)
+++ trunk/connectors/translator-salesforce/src/main/java/org/teiid/translator/salesforce/SalesForceExecutionFactory.java 2012-09-26 17:05:51 UTC (rev 4474)
@@ -118,7 +118,7 @@
}
@Override
- public ResultSetExecution createDirectExecution(List<Argument> arguments, Command command, ExecutionContext executionContext, RuntimeMetadata metadata, SalesforceConnection connection) throws TranslatorException {
+ public ProcedureExecution createDirectExecution(List<Argument> arguments, Command command, ExecutionContext executionContext, RuntimeMetadata metadata, SalesforceConnection connection) throws TranslatorException {
return new DirectQueryExecution(arguments, command, connection, metadata, executionContext);
}
More information about the teiid-commits
mailing list