Wiki source code of WebObjects and Squeryl

Last modified by Ravi Mendis on 2011/04/01 11:14

Hide last authors
Ravi Mendis 163.1 1 = Squeryl ~= //SQL-like// DSL in Scala =
Ravi Mendis 54.1 2
Ravi Mendis 164.1 3 Advantages of [[Squeryl>>url:http://squeryl.org/||shape="rect"]] over EOF:
Ravi Mendis 54.1 4
5 * Concurrent
Ravi Mendis 155.1 6 ** Spawns multiple database connections
7 ** Issues database transactions concurrently
Ravi Mendis 54.1 8 * Scala Actor compatible
Ravi Mendis 163.1 9 ** Immutable object model/graph
10 ** Explicit transaction control
11 * Type Safety
Ravi Mendis 164.1 12 ** Better suited for database/business "logic".
13 E.g: Exploits the compiler and IDE to catch exceptions at compile time rather than at run-time.
Ravi Mendis 163.1 14 * Uses Scala Collections
Ravi Mendis 159.1 15
16 = Migrating EOF -> Squeryl =
17
Ravi Mendis 164.1 18 In contrast to EOF Squeryl maintains its ORM information programmatically - in the classes itself and collectively in a [[schema>>url:http://squeryl.org/schema-definition.html||shape="rect"]]. In keeping with the strongly-typed philosophy of Scala, Squeryl has no dynamic component like EOF (i.e an EO model file).
Ravi Mendis 159.1 19
Ravi Mendis 163.1 20 EOF has the ability to generate classes in Java (and in Objective-C prior to WebObjects 4.5) because enforcing type has become customary in enterprise environments. We may exploit this feature of EOF to generate a Squeryl schema from an EO model.
Ravi Mendis 159.1 21
Ravi Mendis 163.1 22 === Preparing your EO model ===
23
Ravi Mendis 164.1 24 * Make sure **all** EO entities have a class name (including abstract many-To-many "join" tables). FYI: There can be no support for entities classified as {{code language="none"}}EOGenericRecord{{/code}}.
25 * Mark the abstract many-To-Many join entities as {{code language="none"}}Abstract{{/code}}.
Ravi Mendis 163.1 26 * (Temporary) Ensure all the model entities are in the same package. i.e the package is exclusive to the model.
27
28 === Generating the Squeryl Schema ===
29
Ravi Mendis 164.1 30 1. Create a .eogen file for your EO model as normal. Only set the {{code language="none"}}File Names{{/code}} extension to "scala".
Ravi Mendis 163.1 31 1. Use the Squeryl EO Templates:
Ravi Mendis 167.1 32 1*. _Entity.eotemplate [[template>>doc:WOL.Home.EOGenerator.EOGenerator Templates and Additions.Squeryl _Entity\.eotemplate.WebHome]]
Ravi Mendis 166.1 33 1*. Entity.eotemplate [[template>>doc:WOL.Home.EOGenerator.EOGenerator Templates and Additions.Squeryl Entity\.eotemplate.WebHome]]
Ravi Mendis 163.1 34
35 {{note title="Note"}}
36 Any custom business "logic" will have to be manually re-written in Scala
37 {{/note}}
38
39 == Differences Between a Squeryl Schema and EO Model/Classes ==
40
Ravi Mendis 164.1 41 * Optional attributes (i.e those that {{code language="none"}}allowsNull{{/code}}) are typed as {{code language="none"}}Option[WO:T]{{/code}}
42 * To one relationships that are not mandatory (i.e optional relationships) are also typed as {{code language="none"}}Option[WO:T]{{/code}}
43 * To many relationships are represented as a Squeryl iterable (collection class) as opposed to a {{code language="none"}}NSArray{{/code}}.
Ravi Mendis 163.1 44
45 === Use of Scala Collections ===
46
47 ===== 1. Filtering =====
48
49 Instead of using EOQualifiers to filter EOs dynamically, you can apply the type safe filter in Scala:
50
51 {{code}}
52
53 def activeFiles = files.filter(_.active == true)
54
55 {{/code}}
56
57 ===== 2. Iteration =====
58
59 Functional language iteration that's become increasingly popular can be used:
60
61 {{code}}
62
63 activeFiles.foreach(f => {
64 ...
65 })
66
67 {{/code}}
68
69 ===== 3. For-Comprehensions =====
70
71 Here's just an example use of sequence comprehension:
72
73 {{code}}
74
75 def activeFiles = for (file <- files if file.active == true) yield file
76
77 {{/code}}