0

I am trying to delegate a translator by chaining in the VDB.xml but getting an error after making a call. The delegate translator suppose intercept calls to the actual delegate translator underneath and performs a calculation. Calculation is driven by a property set in TEIID_SESSION passed as a payload with the statement object

my vdb.xml:

<source connection-jndi-name="java:/SourceModel" name="SourceModel" translator-name="delegate"/>

<translator name="delegate" type="calcDelegate"> 
        <property name="delegateName" value="sqlserver" />
</translator> 

When I set the property in teiid_session, and run the query in SQL client i get the following error:

org.jkiss.dbeaver.model.sql.DBSQLException: SQL Error [38000]: org.teiid.language.Join cannot be cast to org.teiid.language.NamedTable
    at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.executeStatement(JDBCStatementImpl.java:134)
    at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeStatement(SQLQueryJob.java:488)
    at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.lambda$0(SQLQueryJob.java:425)
    at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:170)
    at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeSingleQuery(SQLQueryJob.java:417)
    at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.extractData(SQLQueryJob.java:775)
    at org.jkiss.dbeaver.ui.editors.sql.SQLEditor$QueryResultsContainer.readData(SQLEditor.java:2914)
    at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.lambda$0(ResultSetJobDataRead.java:111)
    at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:170)
    at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.run(ResultSetJobDataRead.java:109)
    at org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer$17.run(ResultSetViewer.java:3423)
    at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:103)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Caused by: org.teiid.jdbc.TeiidSQLException: org.teiid.language.Join cannot be cast to org.teiid.language.NamedTable
    at org.teiid.jdbc.TeiidSQLException.create(TeiidSQLException.java:135)
    at org.teiid.jdbc.TeiidSQLException.create(TeiidSQLException.java:71)
    at org.teiid.jdbc.StatementImpl.postReceiveResults(StatementImpl.java:723)
    at org.teiid.jdbc.StatementImpl.access$100(StatementImpl.java:65)
    at org.teiid.jdbc.StatementImpl$2.onCompletion(StatementImpl.java:561)
    at org.teiid.client.util.ResultsFuture.done(ResultsFuture.java:135)
    at org.teiid.client.util.ResultsFuture.access$200(ResultsFuture.java:40)
    at org.teiid.client.util.ResultsFuture$1.receiveResults(ResultsFuture.java:79)
    at org.teiid.net.socket.SocketServerInstanceImpl.receivedMessage(SocketServerInstanceImpl.java:284)
    at org.teiid.net.socket.SocketServerInstanceImpl.read(SocketServerInstanceImpl.java:322)
    at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.teiid.net.socket.SocketServerConnectionFactory$ShutdownHandler.invoke(SocketServerConnectionFactory.java:98)
    at com.sun.proxy.$Proxy22.read(Unknown Source)
    at org.teiid.net.socket.SocketServerInstanceImpl$RemoteInvocationHandler$1.get(SocketServerInstanceImpl.java:421)
    at org.teiid.jdbc.StatementImpl.executeSql(StatementImpl.java:570)
    at org.teiid.jdbc.StatementImpl.execute(StatementImpl.java:1076)
    at org.teiid.jdbc.StatementImpl.execute(StatementImpl.java:339)
    at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.execute(JDBCStatementImpl.java:338)
    at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.executeStatement(JDBCStatementImpl.java:131)
    ... 12 more
Caused by: org.teiid.core.TeiidException: org.teiid.language.Join cannot be cast to org.teiid.language.NamedTable
    at org.teiid.client.ResultsMessage.setException(ResultsMessage.java:196)
    at org.teiid.dqp.internal.process.RequestWorkItem.sendError(RequestWorkItem.java:1115)
    at org.teiid.dqp.internal.process.RequestWorkItem.close(RequestWorkItem.java:591)
    at org.teiid.dqp.internal.process.RequestWorkItem.process(RequestWorkItem.java:374)
    at org.teiid.dqp.internal.process.AbstractWorkItem.run(AbstractWorkItem.java:51)
    at org.teiid.dqp.internal.process.RequestWorkItem.run(RequestWorkItem.java:275)
    at org.teiid.dqp.internal.process.DQPWorkContext.runInContext(DQPWorkContext.java:282)
    at org.teiid.dqp.internal.process.ThreadReuseExecutor$RunnableWrapper.run(ThreadReuseExecutor.java:119)
    at org.teiid.dqp.internal.process.ThreadReuseExecutor$3.run(ThreadReuseExecutor.java:210)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassCastException: org.teiid.language.Join cannot be cast to org.teiid.language.NamedTable
    at com.lgc.dsl.translators.unitConvert.delegate.UnitConvertResultSetExecution.execute(UnitConvertResultSetExecution.java:126)
    at org.teiid.dqp.internal.datamgr.ConnectorWorkItem.execute(ConnectorWorkItem.java:367)
    at sun.reflect.GeneratedMethodAccessor740.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.teiid.dqp.internal.datamgr.ConnectorManager$1.invoke(ConnectorManager.java:220)
    at com.sun.proxy.$Proxy193.execute(Unknown Source)
    at org.teiid.dqp.internal.process.DataTierTupleSource.getResults(DataTierTupleSource.java:306)
    at org.teiid.dqp.internal.process.DataTierTupleSource$1.call(DataTierTupleSource.java:112)
    at org.teiid.dqp.internal.process.DataTierTupleSource$1.call(DataTierTupleSource.java:108)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at org.teiid.dqp.internal.process.FutureWork.run(FutureWork.java:65)
ASAFDAR
  • 19
  • 1
  • 7

1 Answers1

0

Based upon

    Caused by: java.lang.ClassCastException: org.teiid.language.Join cannot be cast to org.teiid.language.NamedTable
        at com.lgc.dsl.translators.unitConvert.delegate.UnitConvertResultSetExecution.execute(UnitConvertResultSetExecution.java:126)

It appears that the problem is with an assumption in the logic of the custom translator. Have you debugged the referenced method and line number in UnitConvertResultSetExecution?

Steven Hawkins
  • 538
  • 1
  • 4
  • 7
  • Thanks. Any suggestions on how to best possible to do that as I have not written this custom translator – ASAFDAR Apr 09 '20 at 19:44
  • You have a lot of translator code to reference in the Teiid project to find something similar to what it's trying to accomplish https://github.com/teiid/teiid/tree/master/connectors From the exception the translator is expecting a NamedTable, but a Join has been pushed down. The code in the translator should handle all cases that it's capabilities report as supported. So either that code needs to be updated to support joins, or the capabilties need updated to not support joins. By default a delegating translators capabilities come from its delegate. – Steven Hawkins Apr 10 '20 at 12:04
  • I have an update on this. it seems the error occurs if I do join with other tables in my DDL file. Only t1.value attribute is used by translator to give processed output. This view definition works: `SELECT t1.Name as name, convert(t1.value, float) as value from SourceModel.table t 1;` This Does not and results in error: `SELECT t1.Name as name, convert(t1.value, float) as value, t2.comments as comments from SourceModel.table t1 left outer join SourceModel.table t2 on t2.id = t1.id;` – ASAFDAR Apr 14 '20 at 15:54
  • Yes your capabilities are indicating joins are supported, so the engine is pushing down the self join. See the previous comment - either change the capabilities or change the logic that is throwing the cast exception. – Steven Hawkins Apr 14 '20 at 20:41