Skip to content

Commit e3c3a30

Browse files
committed
Experimental work on a DDL DSL
1 parent 8440563 commit e3c3a30

23 files changed

+779
-11
lines changed

.gitignore

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,5 @@
1-
*.class
2-
*.log
1+
!.gitignore
32

4-
# sbt specific
5-
dist/*
63
target/
7-
lib_managed/
8-
src_managed/
9-
project/boot/
10-
project/plugins/project/
11-
12-
# Scala-IDE specific
13-
.scala_dependencies
4+
.idea/
5+
.idea_modules/

dsl-core/build.sbt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
libraryDependencies += "com.chuusai" % "shapeless_2.10.2" % "2.0.0-M1"
3+
4+
libraryDependencies += "org.scalatest" %% "scalatest" % "2.0.M5b" % "test"
5+
6+
libraryDependencies += "junit" % "junit" % "4.11" % "test"
7+
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package ddl
2+
3+
trait DataType
4+
trait NumericDataType extends DataType
5+
case class NumberDataType(size: Int) extends NumericDataType
6+
case object IntDataType extends NumericDataType

dsl-core/src/main/scala/ddl/Ddl.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package ddl
2+
3+
trait DdlExpression[+T] {
4+
def value: T
5+
}
6+
7+
trait DdlExpressionGroup {
8+
def expressions: Seq[DdlExpression[Any]]
9+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package ddl
2+
3+
trait DdlTableExpression[+T] extends DdlExpression[T]
4+
trait DdlTableExpressionGroup extends DdlExpressionGroup {
5+
def expressions: Seq[DdlTableExpression[Any]]
6+
}
7+
trait Table extends DdlTableExpressionGroup
8+
case class TableWithExpressions(expressions: Seq[DdlTableExpression[Any]]) extends Table
9+
10+
trait ColumnModifier
11+
case object PrimaryColumn extends ColumnModifier
12+
case object Nullable extends ColumnModifier
13+
14+
trait ColumnPrimaryConstraint
15+
case object KEY extends ColumnPrimaryConstraint
16+
17+
trait ColumnNullableConstraint
18+
case object NULL extends ColumnNullableConstraint
19+
20+
trait Column extends DdlTableExpression[Column] {
21+
def name: String
22+
def dataType: DataType
23+
def modifiers: Set[ColumnModifier]
24+
def value: Column = this
25+
}
26+
27+
class ColumnNeedsDataType(val name: String) {
28+
object NUMBER {
29+
def apply(value: Int): ColumnWithDataType =
30+
new ColumnWithDataType(name, NumberDataType(value))
31+
}
32+
object INT {
33+
def apply: ColumnWithDataType =
34+
new ColumnWithDataType(name, IntDataType)
35+
}
36+
}
37+
38+
case class ColumnWithDataType(name: String, dataType: DataType, modifiers: Set[ColumnModifier] = Set(Nullable)) extends Column {
39+
def PRIMARY(constraint: ColumnPrimaryConstraint): ColumnWithDataType =
40+
constraint match {
41+
case key =>
42+
ColumnWithDataType(name, dataType, modifiers + PrimaryColumn)
43+
}
44+
45+
def NOT(constraint: ColumnNullableConstraint): ColumnWithDataType =
46+
constraint match {
47+
case NULL =>
48+
ColumnWithDataType(name, dataType, modifiers - Nullable)
49+
}
50+
}
51+
52+
case class Named[+T](name: String, values: Seq[T]) {
53+
override def toString = name
54+
}
55+
56+
57+
58+
59+
60+
trait PrimaryKey extends DdlTableExpression[PrimaryKey] {
61+
def columns: Seq[PrimaryKeyName]
62+
def value: PrimaryKey = this
63+
}
64+
65+
case class PrimaryKeyName(name: String)
66+
case class PrimaryKeyWithColumns(columns: Seq[PrimaryKeyName]) extends PrimaryKey
67+
68+
object PRIMARY {
69+
def KEY(cols: PrimaryKeyName*): PrimaryKey =
70+
PrimaryKeyWithColumns(cols)
71+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package object ddl {
2+
implicit class NamedStringInterpolator(val context : StringContext) {
3+
def t[T <: DdlExpression[Any]](args : Any*)(values: T*): Named[T] =
4+
Named(context.s(args : _*), values)
5+
6+
def c(args: Any*): ColumnNeedsDataType =
7+
new ColumnNeedsDataType(context.s(args : _*))
8+
9+
def pk(args: Any*): PrimaryKeyName =
10+
new PrimaryKeyName(context.s(args : _*))
11+
}
12+
}

dsl-macros/build.sbt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
resolvers += Resolver.sonatypeRepo("snapshots")
3+
4+
addCompilerPlugin("org.scala-lang.plugins" % "macro-paradise" % "2.0.0-SNAPSHOT" cross CrossVersion.full)
5+
6+
libraryDependencies += "org.scala-lang" % "scala-reflect" % "2.10.2"
7+
8+
libraryDependencies += "org.scalatest" %% "scalatest" % "2.0.M5b" % "test"
9+
10+
libraryDependencies += "junit" % "junit" % "4.11" % "test"
11+
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package ddl
2+
3+
import scala.language.experimental.macros
4+
5+
object CREATE {
6+
object TABLE {
7+
// def apply[T <: DdlTableExpression[Any]](n: Named[T]): Table = {
8+
// val table = TableWithExpressions(n.values)
9+
// TableMacros.check(table)
10+
// table
11+
// }
12+
13+
def apply[T <: DdlTableExpression[Any]](n: Named[T]) =
14+
macro TableMacros.create[T]
15+
}
16+
}

0 commit comments

Comments
 (0)