рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ DDL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рджреЗрдЦрд╛ред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╕реНрд░реЛрдд рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ? рдпрджрд┐ рдкреНрд░рддреНрдпрдХреНрд╖ рдбреЗрдЯрд╛ рдорд╛рдирдЪрд┐рддреНрд░рдг рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ? рдХреНрдпрд╛ рд╣рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдпрд╛ рдЗрдирд▓рд╛рдЗрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП? рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ: рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ рд▓рд┐рдЦреЗрдВред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ рдореЗрдВ 4 рднрд╛рдЧ (рд╡рд░реНрдЧ) рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣
ExecutionFactory
рд╡рд░реНрдЧ рдФрд░
ResultSetExecution
,
ProcedureExecution
рдФрд░
UpdateExecution
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ
UpdateExecution
; рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рддреАрдж рдЕрдиреБрд╡рд╛рджрдХ рдПрдХ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ (рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░) рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред рдЪрд▓реЛ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рдкреБрд░реНрдЬреЗ
ExecutionFactory
- рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ, рд╡рд╣ рд╕реНрдерд╛рди рдЬрд╣рд╛рдБ рдЙрд╕рдХрд╛ рдирд╛рдо рдФрд░ рд╡рд┐рд╡рд░рдг, рдЙрд╕рдХреЗ рдЧреБрдг рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ SQL рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЙрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ (рдпрд╛рдиреА, рдЙрди рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдЬреЛ рдЕрдиреБрд╡рд╛рджрдХ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ)ред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЙрдкрд░реЛрдХреНрдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╕реАрдзреЗ SELECT, INSERT / UPDATE / DELETE рдХреНрд╡реЗрд░реАрдЬрд╝ рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЙрд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВредResultSetExecution
- рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬрд┐рд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЪрдпрди рдХреНрд╡реЗрд░реА рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреБрд╡рд╛рджрдХ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИредProcedureExecution
- рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬрд┐рд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреБрд╡рд╛рджрдХ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИредUpdateExecution
- рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬрд┐рд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди INSERT / UPDATE / DELETE рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреБрд╡рд╛рджрдХ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдЧреЗ рд╣рдо рдЗрди рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред
рдореВрд▓ рд╕реЗрдЯрд┐рдВрдЧреНрд╕
рд╣рдорд╛рд░реЗ рдЕрдиреБрд╡рд╛рджрдХ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреАрдИрдж рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкрд░рд┐рдгрд╛рдореА
рдЬрд╛рд░ рдореЗрдВ рдореМрдЬреВрдж
рдореЗрдЯрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
META-INF \ services \ org.teiid.translator.ExecutionFactory рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд▓рд╛рдЗрди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
ru.habrahabr.HabrExecutionFactory
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, JBoss 7 рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдлрд╝рд╛рдЗрд▓
JBOSS_HOME% / рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди / рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди / рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди.xml (рдпрд╛
[..] рдбреЛрдореЗрди [..] рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
<subsystem xmlns="urn:jboss:domain:teiid:1.0"> [..] <translator name="habrahabr" module="ru.habrahabr"/> [..]
рдпрд╣рд╛рдВ рд╣рдо рд╕рд░реНрд╡рд░ рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдЕрдиреБрд╡рд╛рджрдХ рдХрд┐рд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рд╕рд╛рде рдЬрд╛рд░ рдХреЛ
ru.habrahabr рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдФрд░ рдпрд╣рд╛рдВ, рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреА рддрд░рд╣, рд╣рдореЗрдВ рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
<subsystem xmlns="urn:jboss:domain:resource-adapters:1.0"> [...] <resource-adapters> <resource-adapter> <archive>teiid-connector-ws.rar</archive> <transaction-support>NoTransaction</transaction-support> <connection-definitions> <connection-definition class-name="org.teiid.resource.adapter.ws.WSManagedConnectionFactory" jndi-name="java:/habrDS" enabled="true" use-java-context="true" pool-name="habr-ds"> <config-property name="EndPoint">http://habrahabr.ru/api/profile/</config-property> </connection-definition> </connection-definitions> </resource-adapter> </resource-adapters> [...]
рдореЙрдбрд▓ рд╡рд┐рд╡рд░рдг
рд╕рд░рд▓рддрдо рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрд╡рдпрдВ рдпрд╛ рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ vdb рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореЙрдбрд▓ рд╡рд┐рд╡рд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
<model name="habr"> <source name="habr" translator-name="habrahabr" connection-jndi-name="java:/habrDS"/> </model>
рд╡рд╣ рд╕рдм рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЕрдиреБрд╡рд╛рджрдХ-рд╡рд╛рд░рд┐рд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
<model name="habr"> <source name="habr" translator-name="habrahabr2" connection-jndi-name="java:/habrDS"/> </model> <translator name="habrahabr2" type="habrahabr"> <property name="defaultUser" value="elfuegobiz"/> </translator>
рдФрд░ рдЕрдЧрд░ рдЖрдкрдХреЛ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдПрдХ рдФрд░ рд▓рд╛рдЗрди рдЬреЛрдбрд╝реА рдЬрд╛рдПрдЧреА:
<model name="habr"> <source name="habr" translator-name="habrahabr2" connection-jndi-name="java:/habrDS"/> <property name="importer.convertToUppercase" value="true"/> </model> <translator name="habrahabr2" type="habrahabr"> <property name="defaultUser" value="elfuegobiz"/> </translator>
ExecutionFactory
рдпрд╣рд╛рдБ рд╣рдо рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдирд╛рдо рдФрд░ рд╡рд┐рд╡рд░рдг рд╕реЗрдЯ рдХрд░реЗрдВред
- рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВред
- рдПрд╕рдХреНрдпреВрдПрд▓ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╡рд░реНрдгрди рд╣рдо рд╕рдорд░реНрдерди рдХрд░реЗрдВрдЧреЗред
- рд╕рдорд░реНрдерд┐рдд рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдмрдирд╛рдПрдБред
- рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВред
рддреЛ рдЪрд▓рд┐рдП рдЪрд▓рддреЗ рд╣реИрдВред
рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдирд╛рдо рдФрд░ рд╡рд┐рд╡рд░рдг
package ru.habrahabr; import javax.resource.cci.ConnectionFactory; import org.teiid.translator.ExecutionFactory; import org.teiid.translator.Translator; import org.teiid.translator.WSConnection; @Translator(name = "habrahabr", description = "A translator for Habrahabr API") public class HabrExecutionFactory extends ExecutionFactory<ConnectionFactory, WSConnection> { }
Translator
рдПрдиреЛрдЯреЗрд╢рди рд╡рд░реНрдЧ рдХреЛ
Translator
рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ,
name
рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╣
name
рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рддрд╣рдд рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдФрд░
description
- рдПрдХ рдордирдорд╛рдирд╛ рдкрд╛рда рд╡рд┐рд╡рд░рдгред рд╣рдо рдЗрд╕ рддрдереНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдорд╛рдирдХ WS рдХрдиреЗрдХреНрдЯрд░ Teiid рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рдЧреБрдг
рдКрдкрд░, рдЕрдзреНрдпрд╛рдп
"рдореЙрдбрд▓ рд╡рд┐рд╡рд░рдг" рдореЗрдВ рд╣рдордиреЗ
defaultUser
рд▓рд┐рдП
defaultUser
рд╕рдВрдкрддреНрддрд┐ рдореВрд▓реНрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ред рдЕрдм рд╣рдо рдЗрд╕реЗ рдЕрдиреБрд╡рд╛рджрдХ рдХреЛрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
import org.teiid.translator.TranslatorProperty; [..] private String defaultUser; @TranslatorProperty(description="Default user name", display="Default user name to use for table queries", required=true) public String getDefaultUser() { return defaultUser; } public void setDefaultUser(String defaultUser) { this.defaultUser = defaultUser; }
рдкреНрд░рд╛рдкрдХ рдХреЗ рд▓рд┐рдП
TranslatorProperty
рдПрдиреЛрдЯреЗрд╢рди рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рддреЛ рдЖрдк рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ
required=true
рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдиреБрд╡рд╛рджрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╕рдордп, Teiid рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ vdb рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрдХ рд╡рд┐рд╡рд░рдг рд╕реЗ рдорд╛рди рдХреЗ рд╕рд╛рде рдЗрд╕ рдлрд╝реАрд▓реНрдб рдХреЛ рднрд░ рджреЗрдЧрд╛ред
SQL рдирд┐рд░реНрдорд╛рдг рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ
ExecutionFactory
рд╡рд░реНрдЧ рдореЗрдВ рдХрдИ рд╕рдорд░реНрдерд┐рдд рдорд╛рд╕реНрдХ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ
supports*
рдЬреЛ рдПрдХ
boolean
рдорд╛рди
boolean
рдЬреЛ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрд╡рд╛рджрдХ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЕрдиреБрд╡рд╛рджрдХ рдЬрд┐рд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЕрдиреБрд╡рд╛рджрдХ рд╕рдореБрдЪреНрдЪрдп рдлрд╝рдВрдХреНрд╢рди
sum()
рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ, рддреЛ Teiid рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдЧрд╛, рдФрд░ рдлрд┐рд░ рд╡рд╣ рд░рд╛рд╢рд┐ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛ред
рдЗрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдирдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ рд╕рднреА рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреЗрд╡рд▓ рдХреБрдЫ рдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдирд┐рдкрдЯрд╛рди рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо
count(*)
рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░
limit <>
рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рддрд░реАрдХреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрдирдореЗрдВ
true
рд╡рд╛рдкрд╕реА рдХрд░реЗрдВрдЧреЗ:
@Override public boolean supportsAggregatesCountStar() { return true; } @Override public boolean supportsRowLimit() { return true; }
рдпрд╣ рдЗрди рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЕрдЧрд░ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдореЗрдВ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдорд╛рд░реЗ рдЕрдиреБрд╡рд╛рджрдХ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛрдВрдЧреЗ - рд╕реНрд░реЛрдд рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЕрдиреБрд╡рд╛рджрдХ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рджрд░реНрд╢рдХ рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рд░реБрдЪрд┐ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред
рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдЯрд╛рдбреЗрдЯрд╛
рдЕрдиреБрд╡рд╛рджрдХ рдореЗрдВ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
ExecutionFactory
getMetadata(MetadataFactory metadataFactory, WSConnection conn)
рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖
getMetadata(MetadataFactory metadataFactory, WSConnection conn)
рд╡рд┐рдзрд┐
getMetadata(MetadataFactory metadataFactory, WSConnection conn)
, рдЬрд┐рд╕реЗ рдЕрддрд┐рд╡реНрдпрд╛рдкреА рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдореЗрдВ
MetadataFactory
рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЯреЗрдмрд▓, рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╣рдорд╛рд░реА рд╡реЗрдм рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд╛рдкрд┐рдд рдХрдиреЗрдХреНрд╢рди рдХреА рдПрдХ рд╡рд╕реНрддреБ рд╣реИ: рдЕрдЧрд░ рд╣рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рд╕реНрд░реЛрдд рд╕реЗ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдирд╛рдоред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
@Override public void getMetadata(MetadataFactory metadataFactory, WSConnection conn) throws TranslatorException { Table table = metadataFactory.addTable("habr"); metadataFactory.addColumn("login", DefaultDataTypes.STRING, table); metadataFactory.addColumn("karma", DefaultDataTypes.FLOAT, table); metadataFactory.addColumn("rating", DefaultDataTypes.FLOAT, table); metadataFactory.addColumn("ratingposition", DefaultDataTypes.LONG, table); Procedure proc = metadataFactory.addProcedure("getHabr"); metadataFactory.addProcedureParameter("username", TypeFacility.RUNTIME_NAMES.STRING, Type.In, proc); metadataFactory.addProcedureParameter("ratingposition", TypeFacility.RUNTIME_NAMES.LONG, Type.ReturnValue, proc); metadataFactory.addProcedureParameter("rating", TypeFacility.RUNTIME_NAMES.FLOAT, Type.ReturnValue, proc); metadataFactory.addProcedureParameter("karma", TypeFacility.RUNTIME_NAMES.FLOAT, Type.ReturnValue, proc); metadataFactory.addProcedureParameter("login", TypeFacility.RUNTIME_NAMES.STRING, Type.ReturnValue, proc); }
рд╣рдордиреЗ рдЪрд╛рд░ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдФрд░ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдЪрд╛рд░ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ред рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рддрд╛рд▓рд┐рдХрд╛
defaultUser
рдбреЗрдЯрд╛
defaultUser
- рд╡рд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдЕрдиреБрд╡рд╛рджрдХ рдХреЛ рд╕реМрдВрдкрд╛ рдерд╛ред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрдИ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдХреЛрд╖реНрдардХ рдореЗрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рди рдХреЗрд╡рд▓ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рдиреЛрдВ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛ рд╕рдХрддреА рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рдкреВрд░реА рддрд╛рд▓рд┐рдХрд╛ рднреА, рдЬреИрд╕реЗ рдХрд┐
ResultSetExecution
: рдЗрд╕рдХреЗ рд▓рд┐рдП, рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ
Type.Result
рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ
next()
рд╡рд┐рдзрд┐ рднреА рд▓рд╛рдЧреВ рдХрд░реЗрдВред
рд╕рдВрдЪрд╛рд▓рдХреЛрдВ
рд╣рдорд╛рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдХреЙрд▓ рдФрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╣рдорд╛рд░реА рдЯреЗрдмрд▓ рдкрд░ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рд╕реЗред
public ResultSetExecution createResultSetExecution(QueryExpression command, ExecutionContext executionContext, RuntimeMetadata metadata, WSConnection connection) throws TranslatorException { return new HabrResultSetExecution((Select) command, connection); } public ProcedureExecution createProcedureExecution(Call command, ExecutionContext executionContext, RuntimeMetadata metadata, WSConnection connection) throws TranslatorException { return new HabrProcedureExecution(command, connection); }
рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдЯреЗрдмрд▓ рдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реИрдВ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВрдбрд▓рд░ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрди рддрд░реАрдХреЛрдВ рд╕реЗ рдЬрд╛рдБрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
public ResultSetExecution createResultSetExecution(QueryExpression command, ExecutionContext executionContext, RuntimeMetadata metadata, WSConnection connection) throws TranslatorException { String tableName = ((NamedTable) command.getProjectedQuery().getFrom().get(0)). getMetadataObject().getName(); if ("habr".equalsIgnoreCase(tableName)) return new HabrResultSetExecution((Select) command, connection); if ("hrenabr".equalsIgnoreCase(tableName)) return new HrenabrResultSetExecution((Select) command, connection); return null; } public ProcedureExecution createProcedureExecution(Call command, ExecutionContext executionContext, RuntimeMetadata metadata, WSConnection connection) throws TranslatorException { if ("getHabr".equalsIgnoreCase(command.getProcedureName())) return new HabrProcedureExecution(command, connection); if ("getHrenabr".equalsIgnoreCase(command.getProcedureName())) return new HrenabrProcedureExecution(command, connection); return null; }
рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдЕрдиреБрд╡рд╛рджрдХ рдореЗрдВ рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ: рдХреЛрдИ рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред
рдЕрд░реЗ рд╣рд╛рдВ ... рдереЛрдбрд╝рд╛ рд╕реНрдЯреНрд░реАрдЯ рдореИрдЬрд┐рдХ
рдПрдХ рдЪреМрдХрд╕ рдкрд╛рдардХ рдиреЗ рд╢рд╛рдпрдж рдпрд╣ рджреЗрдЦрд╛ рдХрд┐ рдЕрднреА рддрдХ рд╣рдордиреЗ
importer.convertToUppercase
рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЧрдП рдореЙрдбрд▓ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред Teiid рдХреЛрдб рдЗрд╕ рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдЗрд╕рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
[..] private boolean convertToUppercase; public boolean isConvertToUppercase() { return convertToUppercase; } public void setConvertToUppercase(boolean convertToUppercase) { this.convertToUppercase = convertToUppercase; } [..] @Override public void getMetadata(MetadataFactory metadataFactory, WSConnection conn) throws TranslatorException { [..] PropertiesUtils.setBeanProperties(this, metadataFactory.getImportProperties(), "importer"); }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ,
PropertiesUtils.setBeanProperties
рд╡рд┐рдзрд┐
metadataFactory.getImportProperties()
MetadataFactory
рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХреА рдЧрдИ рдЧреБрдгреЛрдВ рдХреЛ рдЙрдкрд╕рд░реНрдЧ рдХрд░ рд╕рдХрддреА рд╣реИ рдФрд░ рдореЙрдбрд▓ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗ
metadataFactory.getImportProperties()
рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЦрд╛рддрд╛ рдкреНрд░рдХрд╛рд░ рд░реВрдкрд╛рдВрддрд░рдг рдФрд░ рдЬрд╛рдБрдЪ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ
POJO рдХреЗ рд╕рд╛рде рдЙрдиреНрд╣реЗрдВ рднрд░реЗрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рдореЗрдВ рдореБрдлреНрдд рдореЗрдВ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рдорд┐рд▓рддрд╛ рд╣реИред
ResultSetExecution
рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд░рд▓ рд╡рд┐рдзрд┐ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдЧреА рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдХреНрддрд┐
HabrExecutionFactory
рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ
HabrExecutionFactory
рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝
HabrExecutionFactory
ред
рдпрд╣ рд╣рдорд╛рд░реА
convertToUppercase
рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рдореВрд▓реНрдп рдХреЛ рднреА рдзреНрдпрд╛рди рдореЗрдВ
convertToUppercase
рд╣реИ рдФрд░ рдпрджрд┐
true
рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛
true
, рддреЛ рд▓реЙрдЧрд┐рди рдЕрдкрд░рдХреЗрд╕ рдЕрдХреНрд╖рд░реЛрдВ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред
protected List<Object> extractResult(DataSource dataSource) throws TranslatorException { List<Object> results = new ArrayList<Object>(); try { DocumentBuilderFactory xmlFact = DocumentBuilderFactory.newInstance(); DocumentBuilder builder; builder = xmlFact.newDocumentBuilder(); Document doc = builder.parse(dataSource.getInputStream()); dataSource.getInputStream().close(); final XPath xpath = XPathFactory.newInstance().newXPath(); Node node = (Node) xpath.compile("/habrauser/login").evaluate(doc, XPathConstants.NODE); String login = node.getTextContent(); if (convertToUppercase) login = login.toUpperCase(); results.add(login); node = (Node) xpath.compile("/habrauser/karma").evaluate(doc, XPathConstants.NODE); results.add(Float.valueOf(node.getTextContent())); node = (Node) xpath.compile("/habrauser/rating").evaluate(doc, XPathConstants.NODE); results.add(Float.valueOf(node.getTextContent())); node = (Node) xpath.compile("/habrauser/ratingPosition").evaluate(doc, XPathConstants.NODE); results.add(Long.valueOf(node.getTextContent())); } catch (Exception e) { throw new TranslatorException(e); } return results; }
рдЕрдм рдЖрдк
HabrResultSetExecution
рд╡рд░реНрдЧ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
public class HabrResultSetExecution implements ResultSetExecution { private final WSConnection conn; private boolean closed; private DataSource dataSource; public HabrResultSetExecution(Select query, WSConnection conn) { this.conn = conn; } @Override public void execute() throws TranslatorException { closed = false; try { Dispatch<DataSource> dispatch = conn.createDispatch(HTTPBinding.HTTP_BINDING, defaultUser, DataSource.class, Mode.MESSAGE); dispatch.getRequestContext().put(MessageContext.HTTP_REQUEST_METHOD, "GET"); dataSource = dispatch.invoke(null); } catch (Exception e) { throw new TranslatorException(e); } } @Override public List<?> next() throws TranslatorException, DataNotAvailableException { if (closed) return null; closed = true; return extractResult(dataSource); } @Override public void close() { closed = true; } @Override public void cancel() throws TranslatorException { closed = true; } }
рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛
execute()
рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╡рд╣ рдЙрд╕реЗ рджрд┐рдП рдЧрдП рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдЙрджрд╛рд╣рд░рдг рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕рд┐рд╕реНрдЯрдо
next()
рд╡рд┐рдзрд┐ рдХреЛ рддрдм рддрдХ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╡рд╣
null
ред рдкрд╣рд▓реА рдХреЙрд▓ рдореЗрдВ, рд╡рд┐рдзрд┐ рд╕рдВрдЧреНрд░рд╣рд┐рдд DataSource рдХреЛ
extractResult()
рд╡рд┐рдзрд┐ рд╕реЗ
extractResult()
рдХрд░рддреА рд╣реИ, рдЬреЛ рд╕рднреА рдХрд╛рдо рдХрд░рддреА рд╣реИ рдФрд░ рдПрдХ рдбреЗрдЯрд╛ рдкрдВрдХреНрддрд┐ рднреА рдмрдирд╛рддреА рд╣реИ:
List<?>
, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрдВрдХреНрддрд┐ рдХреЗ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдбреЗрдЯрд╛ рдХреА рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реИ, рджреВрд╕рд░реА рдФрд░ рдмрд╛рдж рдХреА рдХреЙрд▓ рдкрд░ рд╣рдо
null
ред
ProcedureExecution
рдпрд╣ рд╡рд░реНрдЧ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рджреЛ рдЕрдВрддрд░ рд╣реИрдВ:
execute()
рд╡рд┐рдзрд┐ рд╕реЗрд╡рд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкрд╛рд░рд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИnext()
рд╡рд┐рдзрд┐ рдХреЗ рдмрдЬрд╛рдп, рдбреЗрдЯрд╛ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ getOutputParameterValues()
рд╡рд┐рдзрд┐ (рдЬрд┐рд╕реЗ рдкреНрд░рддрд┐ рдХреЙрд▓ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ getOutputParameterValues()
рдорд╛рдзреНрдпрдо рд╕реЗ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ; next()
рд╡рд┐рдзрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рдХрд░ рд╕рдХрддреА рд╣реИ
public class HabrProcedureExecution implements ProcedureExecution { private final Call procedure; private final WSConnection conn; private DataSource dataSource; public HabrProcedureExecution(Call procedure, WSConnection conn) { this.procedure = procedure; this.conn = conn; } @Override public void execute() throws TranslatorException { List<Argument> arguments = this.procedure.getArguments(); String username = (String) arguments.get(0).getArgumentValue().getValue(); try { Dispatch<DataSource> dispatch = conn.createDispatch(HTTPBinding.HTTP_BINDING, username, DataSource.class, Mode.MESSAGE); dispatch.getRequestContext().put(MessageContext.HTTP_REQUEST_METHOD, "GET"); dataSource = dispatch.invoke(null); } catch (Exception e) { throw new TranslatorException(e); } } @Override public List<?> getOutputParameterValues() throws TranslatorException { return extractResult(dataSource); } @Override public List<?> next() throws TranslatorException, DataNotAvailableException { return null; } @Override public void close() { } @Override public void cancel() throws TranslatorException { } }
UpdateExecution
рд╣рдо рдЗрд╕ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рджрд░реНрд╢рдХ рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рддреЛ рд╣рдо рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖ рдЧрдПред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рджреЛ рдЪреАрдЬреЗрдВ рд╣реИрдВ:
- рдЗрди рдЕрдиреБрд░реЛрдзреЛрдВ рдкрд░ рдЕрдорд▓ рдХрд░реЗрдВ:
select * from habr.habr; select w.* from (call habr.getHabr(username=>'elfuegobiz')) w;
- рдХрд╣реЛ: рдпрд╣ рдЕрдЪреНрдЫрд╛ рдерд╛ =)