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

widebase.db.table.TemplateTable.scala Maven / Gradle / Ivy

The newest version!
package widebase.db.table

/** A common trait for ORM tables.
 *
 * You need first a record:
 *
 * {{{
 * case class Log(val time: LocalDateTime, val user: String)
 * }}}
 *
 * Second create a ORM table:
 *
 * {{{
 * case class LogTable(
 *   table: Table = Table(string("time", "user"), dateTime(), string()))
 *   extends TemplateTable[Log] {
 *
 *   val time = table("time").Z
 *   val user = table("user").S
 *
 *   def +=(log: Log) = { time += log.time; user += log.user; this }
 *
 *   def +=(time: LocalDateTime, user: String): LogTable =
 *     this += Log(time, user)
 *
 *   def ++=(table: LogTable) = {
 *     for(r <- 0 to table.records.length - 1)
 *       this += table(r)
 *     this
 *   }
 *
 *   def apply(index: Int) = Log(time(index), user(index))
 *
 *   def filter(predicate: Log => Boolean) = {
 *     val filteredTable = new LogTable
 *     for(r <- 0 to records.length - 1)
 *       if(predicate(this(r)))
 *         filteredTable += this(r)
 *     filteredTable
 *   }
 *
 *   def peer = table
 * }
 * }}}
 *
 * @author myst3r10n
 */
trait TemplateTable[R] {

  /** Appends record into table.
   *
   * @param record to append
   *
   * @return the table itself
   */
  def +=(record: R): TemplateTable[R]

  /** Appends records of another table to table.
   *
   * @param table the table to append
   *
   * @return the table itself
   */
  def ++=(table: TemplateTable[R]) = {

    for(r <- 0 to table.records.length - 1)
      this += table(r)

    this

  }

  /** Record.
   *
   * @param index of record
   *
   * @return ohlc
   */
  def apply(index: Int): R

  /** Filters all elements of this table which satisfy a predicate.
   *
   * @param predicate used to test elements.
   *
   * @note Is faster than `filter` by widebase.db.table.Table
   *
   * @return filtered table
   */
  def filter(predicate: R => Boolean): TemplateTable[R]

  /** Filters all elements of this table which do not satisfy a predicate.
   *
   * @param predicate used to test elements.
   *
   * @return filtered table
   */
  def filterNot(predicate: R => Boolean) = filter(!predicate(_))

  def foreach[U](f: R =>  U) =
    for(r <- 0 to records.length - 1)
      f(apply(r))

  /** Head record. */
  def head = apply(0)

  /** Last record. */
  def last = apply(records.length - 1)

  /** Underlying table. */
  def peer: Table

  /** Records. */
  def records = peer.records

}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy