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

io.getquill.context.cassandra.encoding.Decoders.scala Maven / Gradle / Ivy

The newest version!
package io.getquill.context.cassandra.encoding

import com.datastax.oss.driver.internal.core.`type`.{DefaultListType, PrimitiveType}
import io.getquill.context.cassandra.CassandraRowContext
import io.getquill.util.Messages.fail

import java.time.{Instant, LocalDate, LocalTime}
import java.util.{Date, UUID}

trait Decoders extends CollectionDecoders {
  this: CassandraRowContext[_] =>

  type Decoder[T] = CassandraDecoder[T]

  case class CassandraDecoder[T](decoder: BaseDecoder[T]) extends BaseDecoder[T] {
    override def apply(index: Index, row: ResultRow, session: Session) =
      decoder(index, row, session)
  }

  def decoder[T](d: BaseDecoder[T]): Decoder[T] = CassandraDecoder((index, row, session) =>
    if (row.isNull(index) && row.getColumnDefinitions.get(index).getType.isInstanceOf[PrimitiveType])
      fail(
        s"Expected column at index $index to be defined but is was empty or type is unknown ${row.getColumnDefinitions.get(index).getType.getClass}"
      )
    else d(index, row, session)
  )

  def decoder[T](f: ResultRow => Index => T): Decoder[T] =
    decoder((index, row, session) => f(row)(index))

  implicit def optionDecoder[T](implicit d: Decoder[T]): Decoder[Option[T]] =
    CassandraDecoder { (index, row, session) =>
      row.isNull(index) match {
        case true  => None
        case false => Some(d(index, row, session))
      }
    }

  implicit def mappedDecoder[I, O](implicit mapped: MappedEncoding[I, O], decoder: Decoder[I]): Decoder[O] =
    CassandraDecoder(mappedBaseDecoder(mapped, decoder.decoder))

  implicit val stringDecoder: Decoder[String] = decoder(_.getString)
  implicit val bigDecimalDecoder: Decoder[BigDecimal] =
    decoder((index, row, session) => row.getBigDecimal(index))
  implicit val booleanDecoder: Decoder[Boolean] = decoder(_.getBoolean)
  implicit val byteDecoder: Decoder[Byte]       = decoder(_.getByte)
  implicit val shortDecoder: Decoder[Short]     = decoder(_.getShort)
  implicit val intDecoder: Decoder[Int]         = decoder(_.getInt)
  implicit val longDecoder: Decoder[Long]       = decoder(_.getLong)
  implicit val floatDecoder: Decoder[Float]     = decoder(_.getFloat)
  implicit val doubleDecoder: Decoder[Double]   = decoder(_.getDouble)
  implicit val byteArrayDecoder: Decoder[Array[Byte]] =
    decoder { (index, row, session) =>
      val bb = row.getByteBuffer(index)
      val b  = new Array[Byte](bb.remaining())
      bb.get(b)
      b
    }
  implicit val uuidDecoder: Decoder[UUID]                    = decoder(_.getUuid)
  implicit val timestampDecoder: Decoder[Instant]            = decoder(_.getInstant)
  implicit val cassandraLocalTimeDecoder: Decoder[LocalTime] = decoder(_.getLocalTime)
  implicit val cassandraLocalDateDecoder: Decoder[LocalDate] = decoder(_.getLocalDate)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy