Wiki source code of Squeryl _Entity.eotemplate
Last modified by Ravi Mendis on 2011/05/18 04:49
Show last authors
author | version | line-number | content |
---|---|---|---|
1 | This set of templates will generate a Squeryl schema from an EO model. Still basic/proof-of-concept templates. Of course, you may customize them further. | ||
2 | |||
3 | {{note title="Limitations"}} | ||
4 | * Single-package/single-model schemas only | ||
5 | * No support for object inheritance | ||
6 | {{/note}} | ||
7 | |||
8 | {{code}} | ||
9 | |||
10 | // DO NOT EDIT. Make changes to ${entity.classNameWithOptionalPackage}.scala instead. | ||
11 | #if ($entity.superclassPackageName) | ||
12 | package $entity.superclassPackageName | ||
13 | |||
14 | #end | ||
15 | import org.squeryl.annotations._ | ||
16 | import org.squeryl.KeyedEntity | ||
17 | import org.squeryl.PrimitiveTypeMode._ | ||
18 | #if ($entity.primaryKeyAttributes.size() == 2) | ||
19 | import org.squeryl.dsl.CompositeKey2 | ||
20 | #end | ||
21 | #if ($entity.model.sortedEntities.first().equals($entity)) | ||
22 | import org.squeryl.Schema | ||
23 | |||
24 | /** | ||
25 | * DB schema for $entity.superclassPackageName - ideally should be in a separate file "package.scala" | ||
26 | */ | ||
27 | protected object `package` extends Schema { | ||
28 | #foreach ($_entity in $entity.model.sortedEntities) | ||
29 | val ${_entity.name}s = table[$_entity.classNameWithoutPackage]("$_entity.externalName") | ||
30 | #end | ||
31 | |||
32 | // relations | ||
33 | #foreach ($_entity in $entity.model.sortedEntities) | ||
34 | #foreach ($relationship in $_entity.sortedToManyRelationships) | ||
35 | #if (!$relationship.definition) | ||
36 | val ${relationship.entity.name}To${relationship.destination.name}s = oneToManyRelation(${relationship.destination.name}s, ${relationship.entity.name}s). | ||
37 | via((x, y) => x.$relationship.firstJoin.destinationAttribute.name === y.$relationship.firstJoin.sourceAttribute.name) | ||
38 | |||
39 | #end | ||
40 | #end | ||
41 | #end | ||
42 | } | ||
43 | #end | ||
44 | |||
45 | import java.util.Date | ||
46 | #foreach ($relationship in $entity.sortedClassToOneRelationships) | ||
47 | #if ($relationship.actualDestination.packageName != $entity.packageName) | ||
48 | import $relationship.actualDestination.classNameWithDefault | ||
49 | #end | ||
50 | #end | ||
51 | #foreach ($relationship in $entity.sortedClassToManyRelationships) | ||
52 | #if ($relationship.actualDestination.packageName != $entity.packageName) | ||
53 | import $relationship.actualDestination.classNameWithDefault | ||
54 | #end | ||
55 | #end | ||
56 | |||
57 | /** | ||
58 | * $entity.classNameWithoutPackage | ||
59 | */ | ||
60 | protected abstract class _$entity.classNameWithoutPackage ( | ||
61 | ## | ||
62 | ##java -> Scala types go here | ||
63 | ## | ||
64 | #set ($hasOptionalAttribute = 0) | ||
65 | #foreach ($attribute in $entity.sortedAttributes) | ||
66 | #if ($attribute.javaClassName.equals("Integer")) #set( $scalaClassName = "Long" ) | ||
67 | #elseif ($attribute.javaClassName.equals("String")) #set( $scalaClassName = "String" ) | ||
68 | #elseif ($attribute.javaClassName.contains("BigDecimal")) #set( $scalaClassName = "BigDecimal" ) | ||
69 | #elseif ($attribute.javaClassName.equals("NSTimestamp")) #set( $scalaClassName = "Date" ) | ||
70 | #elseif ($attribute.javaClassName.equals("NSData")) #set( $scalaClassName = "Array[Byte]" ) #end | ||
71 | #if (!$attribute.columnName.equalsIgnoreCase($attribute.name)) @Column("$attribute.columnName")#end ${attribute.name}:#if ($attribute.allowsNull) Option[$scalaClassName]#else $scalaClassName#end#if (!$attribute.equals($entity.sortedAttributes.last())), | ||
72 | #else | ||
73 | #if ($attribute.allowsNull)#set ($hasOptionalAttribute = 1)#end | ||
74 | #end | ||
75 | #end | ||
76 | |||
77 | ) extends#if ($entity.primaryKeyAttributes.size() == 1) KeyedEntity[#if ($entity.singlePrimaryKeyAttribute.javaClassName.equals("String"))String#elseif ($entity.singlePrimaryKeyAttribute.javaClassName.equals("Integer"))Long#end]#else KeyedEntity[CompositeKey2[Long,Long]]#end { | ||
78 | |||
79 | // primaryKey | ||
80 | #if ($entity.primaryKeyAttributes.size() == 1) | ||
81 | def id = $entity.singlePrimaryKeyAttribute.name | ||
82 | #elseif ($entity.primaryKeyAttributes.size() == 2) | ||
83 | #set( $pkIndex = 0 ) def id = compositeKey(#foreach ($attribute in $entity.primaryKeyAttributes)$attribute.name#if ($pkIndex == 0), #end#set( $pkIndex = $pkIndex+1 )#end) | ||
84 | #end | ||
85 | |||
86 | #if ($hasOptionalAttribute == 1) | ||
87 | // zero-arg constructor necessary when there are optional fields | ||
88 | def this() = this(#foreach ($attribute in $entity.sortedAttributes)#if ($attribute.javaClassName.equals("Integer")) #set( $zeroValue = "0L" ) | ||
89 | #elseif ($attribute.javaClassName.equals("String")) #set( $zeroValue = '""' ) | ||
90 | #elseif ($attribute.javaClassName.contains("BigDecimal")) #set( $zeroValue = "0F" ) | ||
91 | #elseif ($attribute.javaClassName.equals("NSTimestamp")) #set( $zeroValue = "new Date()" ) | ||
92 | #elseif ($attribute.javaClassName.equals("NSData")) #set( $zeroValue = "new Array[Byte](0)" )#end#if ($attribute.allowsNull)Some($zeroValue)#else$zeroValue#end#if (!$attribute.equals($entity.sortedAttributes.last())), #end#end) | ||
93 | #end | ||
94 | |||
95 | #if (!$entity.abstractEntity) | ||
96 | #if ($entity.sortedToOneRelationships.size() > 0) | ||
97 | // toOne Relationships | ||
98 | #foreach ($relationship in $entity.sortedToOneRelationships) | ||
99 | #if (!$relationship.propagatesPrimaryKey && !$relationship.inverseRelationship.propagatesPrimaryKey) | ||
100 | lazy val to$relationship.destination.name = ${relationship.destination.name}To${relationship.entity.name}s.left(this.asInstanceOf[$relationship.entity.name]) | ||
101 | def $relationship.name = to${relationship.destination.name}.#if ($relationship.mandatory)head | ||
102 | #elseif (!$relationship.mandatory)headOption | ||
103 | #end | ||
104 | #end | ||
105 | #end | ||
106 | #end | ||
107 | #end | ||
108 | |||
109 | #if ($entity.sortedClassToManyRelationships.size() > 0) | ||
110 | // toMany relationships | ||
111 | #foreach ($relationship in $entity.sortedClassToManyRelationships) | ||
112 | #if (!$relationship.definition) | ||
113 | lazy val $relationship.name = ${relationship.entity.name}To${relationship.destination.name}s.right(this.asInstanceOf[$relationship.entity.name]) | ||
114 | |||
115 | #end | ||
116 | #end | ||
117 | #end | ||
118 | } | ||
119 | |||
120 | |||
121 | {{/code}} |