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

com.datamountaineer.streamreactor.connect.bloomberg.BloombergFieldValueFn.scala Maven / Gradle / Ivy

/*
 * Copyright 2017 Datamountaineer.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.datamountaineer.streamreactor.connect.bloomberg

import java.time.format.DateTimeFormatter
import java.time.{LocalDate, OffsetTime, ZoneOffset}

import com.bloomberglp.blpapi.{Datetime, Element}

import scala.collection.JavaConverters._

/**
  * Extracts the values held within the the bloomberg message.
  */
private[bloomberg] object BloombergFieldValueFn {
  private lazy val datetimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")

  /**
    * Returns the value contained by the element. Given its data type information(see Schema.Datatype)
    * returns the appropriate value
    *
    * @param element : Instance of the bloomberg field update
    * @return The value encapsulated by the element
    */
  def apply(element: Element): Any = {
    element.datatype().intValue() match {
      case 6 /*Schema.Datatype.FLOAT64*/ => element.getValueAsFloat64()
      case 5 /*Schema.Datatype.FLOAT32*/ => element.getValueAsFloat32()
      case 0 /*Schema.Datatype.BOOL*/ => element.getValueAsBool()
      case 1 /*Schema.Datatype.CHAR*/ => element.getValueAsChar()
      case 7 /* Schema.Datatype.INT32*/ => element.getValueAsInt32()
      case 8 /*Schema.Datatype.INT64*/ => element.getValueAsInt64()
      case 9 /*Schema.Datatype.STRING*/ => element.getValueAsString()
      case 2 /*Schema.Datatype.DATE*/ => localDate(element.getValueAsDate())
      case 10 /*Schema.Datatype.TIME*/ => offsetDateTime(element.getValueAsDatetime)
      case 3 /*Schema.Datatype.DATETIME*/ =>
        val dt = element.getValueAsDatetime()
        if (dt.hasParts(Datetime.DATE)) {
          if (dt.hasParts(Datetime.TIME)) {
            offsetDateTime(dt)
          }
          else {
            localDate(dt)
          }
        }
        offsetDateTime(dt)

      case 258 | 259 /*Schema.Datatype.SEQUENCE | Schema.Datatype.CHOICE*/ =>
        // For SEQUENCE, iterate through each element and we need case (map, e) instead of `element` of existing sequence element.
        //element.elementIterator().asScala.foldLeft(new java.util.LinkedHashMap[String, Any]) { case (map, `element`) =>
        element.elementIterator().asScala.foldLeft(new java.util.LinkedHashMap[String, Any]) { case (map, e) =>
          map.put(e.name().toString, BloombergFieldValueFn(e))
          map
        } //needs to be a java map because of json serialization

      case _ =>
        if (element.isArray) {
          (0 until element.numValues()).map { i =>
            BloombergFieldValueFn(element.getValueAsElement(i))
          }.asJava
        }
        else {
          element.toString
        }
    }
  }

  def offsetDateTime(dt: Datetime): String = {
    val offsetSeconds = if (dt.hasParts(Datetime.TIME_ZONE_OFFSET)) {
      dt.timezoneOffsetMinutes() * 60
    } else {
      0
    }
    val offset = ZoneOffset.ofTotalSeconds(offsetSeconds)
    OffsetTime.of(dt.hour(), dt.minute(), dt.second(), dt.nanosecond(), offset).toString
  }

  def localDate(dt: Datetime): String = {
    LocalDate.of(dt.year(), dt.month(), dt.dayOfMonth()).format(datetimeFormatter)
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy