All Downloads are FREE. Search and download functionalities are using the official Maven repository.

oz_2.12.5.3.0.source-code.TypeMetadata.scala Maven / Gradle / Ivy

There is a newer version: 5.2.3
Show newest version
package org.mojoz.metadata

import org.mojoz.metadata.in._
import scala.collection.immutable._

case class Type(name: String, length: Option[Int],
  totalDigits: Option[Int], fractionDigits: Option[Int], isComplexType: Boolean) {
  def this(name: String) = this(name, None, None, None, false)
  def this(name: String, isComplexType: Boolean) =
    this(name, None, None, None, isComplexType)
  def this(name: String, length: Int) =
    this(name, Some(length), None, None, false)
  def this(name: String, totalDigits: Int, fractionDigits: Int) =
    this(name, None, Some(totalDigits), Some(fractionDigits), false)

  def intDigits:   Option[Int] = totalDigits.map(n => n - fractionDigits.getOrElse(0))
  def isArray:     Boolean     = name != null && name.endsWith("]")
  def elementType: String      = name match {
    case null => null
    case "[]" => null
    case _    => if (isArray) name.substring(0, name.indexOf('[')) else name
  }
  def arrayLengthString: Option[String] =
    Option(name).map(n => n.substring(n.indexOf('[') + 1, n.length - 1)).filter(_ != "")
}

case class JdbcLoadInfo(
  jdbcTypeNameOrCode:   String,
  jdbcTypeCode:         Int,
  minSize:              Option[Int],
  maxSize:              Option[Int],
  minFractionDigits:    Option[Int],
  maxFractionDigits:    Option[Int],
  targetLength:         Option[Integer], // xxx Some(null) means copy from source
  targetTotalDigits:    Option[Integer], // xxx Some(null) means copy from source
  targetFractionDigits: Option[Integer]  // xxx Some(null) means copy from source
)

case class YamlLoadInfo(
  // TODO naming patterns here?
  typeName:             Option[String],
  minSize:              Option[Int],
  maxSize:              Option[Int],
  minFractionDigits:    Option[Int],
  maxFractionDigits:    Option[Int],
  targetLength:         Option[Integer], // xxx Some(null) means copy from source
  targetTotalDigits:    Option[Integer], // xxx Some(null) means copy from source
  targetFractionDigits: Option[Integer]  // xxx Some(null) means copy from source
)

case class DdlWriteInfo(
  minSize:              Option[Int],
  maxSize:              Option[Int],
  minFractionDigits:    Option[Int],
  maxFractionDigits:    Option[Int],
  targetNamePattern:    String
)

case class TypeDef(
  name: String,
  targetNames: Map[String, String],
  jdbcLoad: Map[String, Seq[JdbcLoadInfo]],
  yamlLoad: Seq[YamlLoadInfo],
  ddlWrite: Map[String, Seq[DdlWriteInfo]],
  defaults: ColumnDef,
  namingConventions: Seq[String],
  extras: Map[String, Any]
) {
  def withFallback(other: TypeDef) = TypeDef(
    Option(name).getOrElse(other.name),
    other.targetNames ++ targetNames,
    other.jdbcLoad ++ jdbcLoad,
    Option(yamlLoad).filter(_.nonEmpty) getOrElse other.yamlLoad,
    other.ddlWrite ++ ddlWrite,
    Option(defaults).getOrElse(other.defaults),
    Option(namingConventions).filter(_.nonEmpty).getOrElse(other.namingConventions),
    other.extras ++ extras
  )
}

object TypeMetadata {
  def mergeTypeDefs(typeDefs: Seq[TypeDef], fallbackTypeDefs: Seq[TypeDef]): Seq[TypeDef] = {
    val nameToTypeDef = typeDefs.map(t => t.name -> t).toMap
    val nameToFallbackTypeDef = fallbackTypeDefs.map(t => t.name -> t).toMap
    fallbackTypeDefs.filterNot(nameToTypeDef contains _.name) ++
    typeDefs.map { td =>
      val fallbackTypeDefOpt = nameToFallbackTypeDef.get(td.name)
      if (fallbackTypeDefOpt.isDefined) td.withFallback(fallbackTypeDefOpt.get) else td
    }
  }
  lazy val defaultTypeDefs = new YamlTypeDefLoader(YamlMd.fromResource("/mojoz-default-types.yaml")).typeDefs
  lazy val customTypeDefs = new YamlTypeDefLoader(YamlMd.fromResource("/mojoz-custom-types.yaml", false)).typeDefs
  lazy val customizedTypeDefs = mergeTypeDefs(customTypeDefs, defaultTypeDefs)
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy