ODI 12 c Groovy - Автоматически генерировать сценарий ios отображения с двумя физическими уровнями - PullRequest
1 голос
/ 28 февраля 2020

Я хочу создать groovy сценарий, который будет генерировать два сценария ios отображения с двумя физическими уровнями.

У меня есть код ниже, но кажется, что он не правильный. Я пытаюсь передать в качестве значения для метода «generateSecnario», физического уровня. Не знаю, нормально ли это.


import oracle.odi.domain.project.finder.IOdiProjectFinder;
import oracle.odi.domain.model.finder.IOdiDataStoreFinder;
import oracle.odi.domain.project.finder.IOdiFolderFinder;
import oracle.odi.domain.mapping.finder.IMappingFinder;
import oracle.odi.domain.model.OdiDataStore;
import oracle.odi.domain.model.OdiModel;
import oracle.odi.domain.model.finder.IOdiModelFinder;
import oracle.odi.core.persistence.transaction.support.DefaultTransactionDefinition;
import oracle.odi.generation.support.OdiScenarioGeneratorImpl;
import oracle.odi.generation.IOdiScenarioGenerator;
import oracle.odi.domain.runtime.scenario.OdiScenario;
import oracle.odi.domain.mapping.Mapping;
import oracle.odi.domain.mapping.finder.IMappingFinder;
import oracle.odi.domain.runtime.scenario.finder.IOdiScenarioFinder;
import oracle.odi.domain.project.OdiProject;



txnDef = new DefaultTransactionDefinition()
tm = odiInstance.getTransactionManager()
tme = odiInstance.getTransactionalEntityManager()
txnStatus = tm.getTransaction(txnDef)
def fm = ((IMappingFinder) tme.getFinder(Mapping.class)) // shorcut to Find Mapping
def mappingList = fm.findAll().findAll {w-> w.getProject().getCode() == 'DL_GENERATE_MAPPINGS'
}

if (mappingList == null) {
    println "Map is null"
}
ms = mappingList.iterator()
while (ms.hasNext()) {
    ms_i = ms.next()
    println ms_i.getName()
    scenName = ms_i.getName();

    stxnDef = new DefaultTransactionDefinition()
    stm = odiInstance.getTransactionManager()
    stme = odiInstance.getTransactionalEntityManager()
    stxnStatus = stm.getTransaction(stxnDef)

    OdiScenario sc = ((IOdiScenarioFinder) stme.getFinder(OdiScenario.class)).findLatestByName(scenName)
    if (sc != null) {
        println "Scenario already exist"
        println sc
    }
    println("test");
    odiInstance.getTransactionalEntityManager().persist(ms_i);
    PhysicalDesignList = ms_i.getExistingPhysicalDesigns();
    println("ceva" + PhysicalDesignList);
    for (pd in PhysicalDesignList) {
        if (pd.getName() == "DailyLayer") {
            println("test1");
            IOdiScenarioGenerator gene = new OdiScenarioGeneratorImpl(odiInstance);
            OdiScenario newScen = gene.generateScenario(ms_i, scenName, "100");
        } else if (pd.getName() == "CorrectionLayer") {
            println("test2");
            IOdiScenarioGenerator gene = new OdiScenarioGeneratorImpl(odiInstance);
            OdiScenario newScen = gene.generateScenario(ms_i, scenName, "200");
        }
    }

    println newScen
    //tme.persist(newScen)
    stm.commit(stxnStatus)
    println "Created"
    //odiInstance.close()
}
tm.commit(txnStatus)

Знаете ли вы, как это сделать?

Спасибо,

ОБНОВЛЕНИЕ 1

Если я изменю «ms_i» в методе generateScenario на «pd» (генерирующий сценарий для каждого физического уровня вместо каждого сопоставления), я рад этой ошибке:

Привет, я забыл упомянуть, что уже заменил на pd и попробовал. При первом запуске я получил эту ошибку:

Нет такого свойства: newScen для класса: Generate_scenarios_v1 (вычтите 18 из номера строки ошибки для учета стандартного импорта) groovy .lang. MissingPropertyException: Нет такого свойства: newScen для класса: Generate_scenarios_v1 в org.codehaus. groovy .runtime.ScriptBytecodeAdapter.unwrap (ScriptBytecodeAdapter. java: 53) в org.codehaus. groovy .runtime.Siteetper.pite (PogoGetPropertySite. java: 52) в org.codehaus. groovy .runtime.callsite. * .lang.GroovyShell.runScriptOrMainOrTestOrRunnable (GroovyShell. java: 263) в groovy .lang.GroovyShell.run (GroovyShell. java: 518) в groovy .lang.GroovyShell.run. *: 497) в groovy .lang.GroovyShell.run (GroovyShell. java: 170) в oracle .di.studio. groovy .GroovyScriptRunInstance.run (GroovyScriptRunInstance. java: 222)

После этого я попытаюсь запустить его снова, оно переходит в l oop или что-то в этом роде: оно ничего не делает, как-то заблокировано. Может быть, мне нужно закрыть какое-то соединение, и я этого не делаю ...

1 Ответ

0 голосов
/ 02 марта 2020

Первый параметр метода generateScenario , который вы вызываете, имеет тип IOdiScenarioSource . Одной из реализаций этого интерфейса является MapPhysicalDesign , так что вы можете передать его вместо сопоставления.

OdiScenario newScen = gene.generateScenario(pd, scenName, "100");

Я вижу, что вы используете одно и то же имя для двух сценариев с разными номер версии. Это может привести к некоторой путанице в долгосрочной перспективе, особенно потому, что для выполнения версии -1 сценария потребуется последняя версия (поэтому исправление в вашем случае). Я бы рекомендовал использовать 2 разных имени (например, scenName+'_DAILY' и scenName+'_CORR')

...