The ODI 12c SDK provides a mechanism to accelerate data integration development using patterns and the APIs in the SDK. With OWB many customers automated mundane tasks – tasks that were repeated and consistent. I’ve uploaded a bunch of examples covering many characteristics of the 12c mapping SDK, the examples are primarily slanted towards the logical side right now. You can find examples of the components and images for each on the java.net site (download ODI_12c_Mappings_SDK Examples here unzip and inspect the groovy). This is an open community area where you too can contribute.
The mappings I have covered include (click on hyperlink for an image of each);
- basic datastore to datastore mapping with configuration of the LKM and IKM on the deployment spec which options set (datastore component)
- simple filter example writing to a target (filter component).
- datastores being joined, with a left outer join property set then written to a target (join component).
- data being looked up from a reference table using the (lookup component).
- data being aggregated, SUM aggregation used and data automatically grouped (aggregate component).
- defining expressions which may be reused across many map parts, also useful for explicitly seeing expressions in canvas (expression component).
- unifying data using the relational set component to UNION/MINUS data (set component).
- if then/else capabilities using the split component to define branches (split component).
- defining a dataset to source data from, defines joins and filters (dataset component)
- deduplicating data with distinct (distinct component).
These examples all use the mapping SDK to build data integration flows, the existing ODI interface SDK is still supported for now. I plan on more examples, plenty more to show including some of the nitty gritty details on the physical deployment specification side. I’d also like to show the mapping accelerators, I posted some while back this kind of capability for 11g (see here).
If you are brand new to the ODI SDK, I tend to break down the labyrinth of classes into the following sections (I blogged about this for 11g here);
Entry to the Platform
| Object | Finder | SDK |
| odiInstance | odiInstance (groovy variable for console) | OdiInstance |
Topology Objects
| Object | Finder | SDK |
| Technology | IOdiTechnologyFinder | OdiTechnology |
| Context | IOdiContextFinder | OdiContext |
| Logical Schema | IOdiLogicalSchemaFinder | OdiLogicalSchema |
| Data Server | IOdiDataServerFinder | OdiDataServer |
| Physical Schema | IOdiPhysicalSchemaFinder | OdiPhysicalSchema |
| Logical Schema to Physical Mapping | IOdiContextualSchemaMappingFinder | OdiContextualSchemaMapping |
| Logical Agent | IOdiLogicalAgentFinder | OdiLogicalAgent |
| Physical Agent | IOdiPhysicalAgentFinder | OdiPhysicalAgent |
| Logical Agent to Physical Mapping | IOdiContextualAgentMappingFinder | OdiContextualAgentMapping |
| Master Repository | IOdiMasterRepositoryInfoFinder | OdiMasterRepositoryInfo |
| Work Repository | IOdiWorkRepositoryInfoFinder | OdiWorkRepositoryInfo |
Project Objects
| Object | Finder | SDK |
| Project | IOdiProjectFinder | OdiProject |
| Folder | IOdiFolderFinder | OdiFolder |
| Mapping | IMappingFinder | Mapping |
| Package | IOdiPackageFinder | OdiPackage |
| Procedure | IOdiUserProcedureFinder | OdiUserProcedure |
| User Function | IOdiUserFunctionFinder | OdiUserFunction |
| Variable | IOdiVariableFinder | OdiVariable |
| Sequence | IOdiSequenceFinder | OdiSequence |
| KM | IOdiKMFinder | OdiKM |
Load Plans and Scenarios
| Object | Finder | SDK |
| Load Plan | IOdiLoadPlanFinder | OdiLoadPlan |
| Load Plan and Scenario Folder | IOdiScenarioFolderFinder | OdiScenarioFolder |
Model Objects
| Object | Finder | SDK |
| Model | IOdiModelFinder | OdiModel |
| Sub Model | IOdiSubModel | OdiSubModel |
| DataStore | IOdiDataStoreFinder | OdiDataStore |
| Column | IOdiColumnFinder | OdiColumn |
| Key | IOdiKeyFinder | OdiKey |
| Condition | IOdiConditionFinder | OdiCondition |
Operator Objects
| Object | Finder | SDK |
| Session Folder | IOdiSessionFolderFinder | OdiSessionFolder |
| Session | IOdiSessionFinder | OdiSession |
| Schedule | OdiSchedule |
How to Create an Object?
Here is a simple example to create a project, it uses IOdiEntityManager.persist to persist the object.
import oracle.odi.domain.project.OdiProject;
import oracle.odi.core.persistence.transaction.support.DefaultTransactionDefinition;txnDef = new DefaultTransactionDefinition();
tm = odiInstance.getTransactionManager()
txnStatus = tm.getTransaction(txnDef)project = new OdiProject(“Project For Demo”, “PROJECT_DEMO”)
odiInstance.getTransactionalEntityManager().persist(project)
tm.commit(txnStatus)
How to Update an Object?
This update example uses the methods on the OdiProject object to change the project’s name that was created above, it is then persisted.
import oracle.odi.domain.project.OdiProject;
import oracle.odi.domain.project.finder.IOdiProjectFinder;
import oracle.odi.core.persistence.transaction.support.DefaultTransactionDefinition;txnDef = new DefaultTransactionDefinition();
tm = odiInstance.getTransactionManager()
txnStatus = tm.getTransaction(txnDef)prjFinder = (IOdiProjectFinder)odiInstance.getTransactionalEntityManager().getFinder(OdiProject.class);
project = prjFinder.findByCode(“PROJECT_DEMO”);project.setName(“A Demo Project”);
odiInstance.getTransactionalEntityManager().persist(project)
tm.commit(txnStatus)
How to Delete an Object?
Here is a simple example to delete all of the sessions, it uses IOdiEntityManager.remove to delete the object.
import oracle.odi.domain.runtime.session.finder.IOdiSessionFinder;
import oracle.odi.domain.runtime.session.OdiSession;
import oracle.odi.core.persistence.transaction.support.DefaultTransactionDefinition;txnDef = new DefaultTransactionDefinition();
tm = odiInstance.getTransactionManager()
txnStatus = tm.getTransaction(txnDef)sessFinder = (IOdiSessionFinder)odiInstance.getTransactionalEntityManager().getFinder(OdiSession.class);
sessc = sessFinder.findAll();
sessItr = sessc.iterator()
while (sessItr.hasNext()) {
sess = (OdiSession) sessItr.next()
odiInstance.getTransactionalEntityManager().remove(sess)
}
tm.commit(txnStatus)
Hopefully these examples will get you on your way. This isn’t an all encompassing summary of the SDK, but covers a lot of the content to give you a good handle on the objects and how they work. The mappings examples are a good start, more to come on those, remember and check out the ODI area on OTN for the examples (here). Have fun, happy coding
