scala загрузить конфигурацию Карта карты - PullRequest
2 голосов
/ 05 февраля 2020

Мне нужно прочитать из файла конфигурации и сопоставить конфигурацию с классом дел. Это нормально работает, если у меня есть одна таблица, как показано ниже

CONFIG

mapping {
   target {
     oracle  = {
         type = "oracle"
         schema    = "orcl"
         tableName = "my_table"
         query = "select key from my_table where dob='2020-01-01'
     }
}

SCALA CODE SNIPPET

 val targetConfig:Map[String,QueryEngine] = config.getObject("mapping.target")
    .entrySet()
    .asScala
    .foldLeft(Map.empty[String , QueryEngine]) { case ( acc , entry ) =>
      val target = entry.getKey
      val targetConfig = entry.getValue match {
        case validElement if validElement.valueType() == ConfigValueType.OBJECT  => validElement.asInstanceOf[ConfigObject].toConfig
        case invalidElement => sys.error("illegal syntax at $invalidElement")
      }

      targetConfig.getString("type")    match {

        case "oracle" => acc + (target ->  new OracleQueryEngine(vars,target,targetConfig.getString("schema"),targetConfig.getString("tableName"),targetConfig.getString("query"),targetConfig.getString("param")))

        case  x   => sys.error(s"unknow target not defined $targetConfig with $targetConfig")
      }
    }

СЕЙЧАС я обновил CONFIG с НЕСКОЛЬКИМИ таблицами в целевом отображении.

mapping {
   target {
     oracle  =   
        emp = {
         type = "oracle"
         schema    = "orcl"
         tableName = "emp"
         query = "select key from emp where dob='2020-01-01'
        }
        dept = {
         type = "oracle"
         schema    = "orcl"
         tableName = "dept"
         query = "select key from dept where dob='2020-01-01'
        }
    }
}

КОД SNIPPET для сценария с несколькими таблицами

This is giving error 
Error:(22, 28) type mismatch;
 found   : scala.collection.mutable.Buffer[scala.collection.immutable.Map[String,QueryEngine]]
 required: scala.collection.immutable.Map[String,QueryEngine]
          objs.asScala.map { obj =>

КОД SNIPPET

val sourcesConfig: Map[String, QueryEngine] = 
config.getObject("mapping.target")
 .entrySet()
 .asScala
 .foldLeft(Map.empty[String, QueryEngine]) { case (acc, entry) =>
   val source = entry.getKey

   entry.getValue match {
    case objs:ConfigList =>
      objs.asScala.map { obj =>
        val sourceConfig = obj.asInstanceOf[ConfigObject].toConfig
        sourceConfig.getString("type") match {
          case "oracle" => acc + (source -> new OracleQueryEngine(vars,source,sourceConfig.getString("schema"), sourceConfig.getString("tableName"), sourceConfig.getString("query"), sourceConfig.getString("param")))
          case x => sys.error(s"unknown source not defined $source with $sourceConfig")

        }

      }
  }

1 Ответ

4 голосов
/ 05 февраля 2020

Оберните "oracle" в фигурные скобки, так как это JsObject:

mapping {
   target {
     oracle  = {   
        emp = {
         type = "oracle"
         schema    = "orcl"
         tableName = "emp"
         query = "select key from emp where dob='2020-01-01'
        }
        dept = {
         type = "oracle"
         schema    = "orcl"
         tableName = "dept"
         query = "select key from dept where dob='2020-01-01'
        }
    }}
}

Работает ли это сейчас?

Если не использовать, например, PureConfig .

Ваше решение может быть таким простым:

import pureconfig._
import pureconfig.generic.auto._

case class Mappings(mapping: Mapping)
case class Mapping(target: Oracle)
case class Oracle(oracle: Map[String, Map[String, String]])

ConfigSource.default.load[Mappings]
...