src/main/scala/fis/base/model/BaseSchema.scala
author Tomas Zeman <tzeman@volny.cz>
Fri, 10 Feb 2012 09:53:05 +0100
changeset 8 828565e7f571
parent 7 8ef5e77ad79e
child 15 995184977e9b
permissions -rw-r--r--
ff8d393251d4dae6 Contact model
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     1
/*
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     2
 * Copyright 2011 Tomas Zeman <tzeman@volny.cz>
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     3
 *
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     4
 * Licensed under the Apache License, Version 2.0 (the "License");
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     5
 * you may not use this file except in compliance with the License.
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     6
 * You may obtain a copy of the License at
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     7
 *
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     8
 *     http://www.apache.org/licenses/LICENSE-2.0
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     9
 *
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    10
 * Unless required by applicable law or agreed to in writing, software
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    11
 * distributed under the License is distributed on an "AS IS" BASIS,
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    13
 * See the License for the specific language governing permissions and
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    14
 * limitations under the License.
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    15
 */
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    16
package fis.base.model
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    17
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    18
import net.liftweb.squerylrecord.RecordTypeMode._
8
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    19
import net.liftweb.util.Helpers.{snakify, tryo}
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    20
import org.squeryl.{Schema, Session, Table}
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    21
import org.squeryl.internals.StatementWriter
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    22
import scala.collection.mutable.ListBuffer
4
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    23
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    24
trait BaseSchema extends Schema {
8
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    25
  val entityTableName = "entity"
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    26
  val entities = new Table[EntityUnion](entityTableName) {
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    27
    val tables = new ListBuffer[String]
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    28
  }
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    29
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    30
  val codeListItems = entityTable[CodeListItem]("code_list_item")
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    31
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    32
  override def tableNameFromClass(c: Class[_]): String =
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    33
    snakify(c.getSimpleName)
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    34
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    35
  protected def entityTable[T <: Entity[_]](name: String)(implicit manifestT:
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    36
    Manifest[T]): Table[T] = {
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    37
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    38
    val tbl = table(name)(manifestT)
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    39
    on(tbl) { t => declare(t.id.is(autoIncremented("entity_id_seq"))) }
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    40
    entities.tables += name
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    41
    tbl
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    42
  }
7
8ef5e77ad79e base entity addons: entityTable()
Tomas Zeman <tzeman@volny.cz>
parents: 6
diff changeset
    43
8
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    44
  override def create = {
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    45
    table[EntityUnion](entityTableName) // register entity table as the last one
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    46
    super.create
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    47
  }
7
8ef5e77ad79e base entity addons: entityTable()
Tomas Zeman <tzeman@volny.cz>
parents: 6
diff changeset
    48
8
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    49
  override protected def drop = {
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    50
    val dba = Session.currentSession.databaseAdapter
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    51
    val sw = new StatementWriter(dba)
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    52
    sw.write("drop view " + entityTableName + " cascade")
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    53
    ex(sw)
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    54
    super.drop
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    55
  }
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    56
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    57
  private def ex(sw: StatementWriter) = {
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    58
    val sql = sw.statement
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    59
    val cs = Session.currentSession
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    60
    cs.log(sql)
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    61
    val s = cs.connection.createStatement
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    62
    tryo { s.execute(sql) }
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    63
    tryo { s.close }
7
8ef5e77ad79e base entity addons: entityTable()
Tomas Zeman <tzeman@volny.cz>
parents: 6
diff changeset
    64
  }
4
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    65
}
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    66
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    67
object BaseSchema extends BaseSchema
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    68
8
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    69
class EntityViewH2Adapter extends SeqIdH2Adapter {
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    70
  override def writeCreateTable[T](t: Table[T], sw: StatementWriter,
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    71
    schema: Schema) = schema match {
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    72
    case sch: BaseSchema if t.name == sch.entityTableName =>
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    73
      sw.write("create view " + t.name + " as ")
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    74
      val it = sch.entities.tables.iterator
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    75
      while (it.hasNext) {
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    76
        sw.write("select id, name, note from " + it.next)
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    77
        if (it.hasNext)
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    78
          sw.write(" union ")
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    79
      }
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    80
    case _ => super.writeCreateTable(t, sw, schema)
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    81
  }
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents: 7
diff changeset
    82
}
4
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    83
bb4478e1cff7 9fb42f3c37f3e4fe Code list implementation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    84
// vim: set ts=2 sw=2 et: