Skip to content

Commit

Permalink
#57 : worked on DSL
Browse files Browse the repository at this point in the history
  • Loading branch information
timowest committed Nov 28, 2011
1 parent e9fb521 commit d73281d
Show file tree
Hide file tree
Showing 15 changed files with 173 additions and 133 deletions.
Binary file added querydsl-scala/.cache
Binary file not shown.
6 changes: 4 additions & 2 deletions querydsl-scala/pom.xml
Expand Up @@ -203,8 +203,10 @@
<classpathContainer>org.eclipse.jdt.launching.JRE_CONTAINER</classpathContainer>
</classpathContainers>
<excludes>
<exclude>org.scala-lang:scala-library</exclude>
<exclude>org.scala-lang:scala-compiler</exclude>
<exclude>org.scala-lang:scala-library</exclude>
<!--
<exclude>org.scala-lang:scala-compiler</exclude>
-->
</excludes>
<sourceIncludes>
<sourceInclude>**/*.scala</sourceInclude>
Expand Down
Expand Up @@ -14,6 +14,10 @@ import scala.reflect.BeanProperty
import scala.collection.JavaConversions._
import scala.collection.mutable.Set

/**
* @author tiwe
*
*/
class ScalaBeanSerializer @Inject() (typeMappings: TypeMappings) extends BeanSerializer(typeMappings) {

var javadocSuffix = " is a Querydsl bean type"
Expand All @@ -40,6 +44,10 @@ class ScalaBeanSerializer @Inject() (typeMappings: TypeMappings) extends BeanSer

}

/**
* @author tiwe
*
*/
class CaseClassSerializer @Inject() (typeMappings: TypeMappings) extends BeanSerializer(typeMappings) {

def javaBeanSupport = false
Expand All @@ -51,8 +59,11 @@ class CaseClassSerializer @Inject() (typeMappings: TypeMappings) extends BeanSer
}

}


/**
* @author tiwe
*
*/
abstract class BeanSerializer(typeMappings: TypeMappings) extends Serializer {

var createCompanionObject = true
Expand Down
Expand Up @@ -68,8 +68,10 @@ class ScalaEntitySerializer @Inject()(val typeMappings: TypeMappings) extends Se
}

def writeAdditionalConstructors(modelName: String, writer: ScalaWriter) = {
writer.line("def this(variable: String) = this(classOf[",modelName,"], forVariable(variable))\n")
writer.line("def this(parent: Path[_], variable: String) = this(classOf[",modelName,"], forProperty(parent, variable))\n")
writer.line("def this(variable: String) = this(classOf[",
modelName,"], forVariable(variable))\n")
writer.line("def this(parent: Path[_], variable: String) = this(classOf[",
modelName,"], forProperty(parent, variable))\n")
}

def writeAdditionalFields(model: EntityType, writer: ScalaWriter) = {
Expand Down
Expand Up @@ -28,7 +28,7 @@ object Constants {

}

trait SimpleExpression[T] extends Expression[T]{
trait SimpleExpression[T] extends Expression[T] {

def as(right: Path[T]): SimpleExpression[T] = simple(getType, ALIAS.asInstanceOf[Operator[T]], this, right)

Expand Down
Expand Up @@ -9,6 +9,12 @@ import TypeDefs._

object GroupBy extends GroupBy

/**
* Group by result transforming functionality
*
* @author tiwe
*
*/
trait GroupBy {

def groupBy[K](key: Ex[K]) = new GroupByBuilder[K](key)
Expand Down Expand Up @@ -60,7 +66,7 @@ class GSet[T](e: Ex[T]) extends AbstractGroupExpression[T, Set[T]](classOf[Set[T
}
}

class GMap[K,V](tu2ex: Tu2Ex[K,V,_,_]) extends AbstractGroupExpression[(K,V), Map[K,V]](classOf[Map[K,V]], tu2ex) {
class GMap[K,V](tu2ex: Tu2Ex[K,V]) extends AbstractGroupExpression[(K,V), Map[K,V]](classOf[Map[K,V]], tu2ex) {

def createGroupCollector() = {
new GroupCollector[(K,V), Map[K,V]]() {
Expand Down
Expand Up @@ -17,6 +17,11 @@ trait Helpers extends Projections with GroupBy {
implicit def toRichProjectable(p: Projectable) = new RichProjectable(p)
}

/**
* @author tiwe
*
* @param <T>
*/
class RichSimpleProjectable[T](private val p: SimpleProjectable[T]) {

def select: List[T] = p.list.toList
Expand All @@ -29,6 +34,10 @@ class RichSimpleProjectable[T](private val p: SimpleProjectable[T]) {

}

/**
* @author tiwe
*
*/
class RichProjectable(private val p: Projectable) {

def select[T](e: Ex[T]): List[T] = p.list(e).toList
Expand Down
Expand Up @@ -7,54 +7,53 @@ import TypeDefs._

object Projections extends Projections

/**
* @author tiwe
*
*/
trait Projections {

// TODO : simplify this

implicit def tuple2Expr[T1,T2,E1 <: Ex[T1],E2 <: Ex[T2]](t: (Ex[T1] with E1,Ex[T2] with E2)) = {
new Tuple2Expression[T1,T2,E1,E2](t._1, t._2)
}
implicit def tuple2Expr[T1,T2](t: (_ <: Ex[T1], _ <: Ex[T2])) = new Tu2Ex[T1,T2](t._1, t._2)

implicit def tuple3Expr[T1,T2,T3,E1 <: Ex[T1],E2 <: Ex[T2],E3 <: Ex[T3]](t: (Ex[T1] with E1,Ex[T2] with E2,Ex[T3] with E3)) = {
new Tuple3Expression[T1,T2,T3,E1,E2,E3](t._1, t._2, t._3)
implicit def tuple3Expr[T1,T2,T3](t: (_ <: Ex[T1], _ <: Ex[T2], _ <: Ex[T3])) = {
new Tu3Ex[T1,T2,T3](t._1, t._2, t._3)
}

implicit def tuple4Expr[T1,T2,T3,T4,E1 <: Ex[T1],E2 <: Ex[T2],E3 <: Ex[T3],E4 <: Ex[T4]](t: (Ex[T1] with E1,Ex[T2] with E2,Ex[T3] with E3,Ex[T4] with E4)) = {
new Tuple4Expression[T1,T2,T3,T4,E1,E2,E3,E4](t._1, t._2, t._3, t._4)
implicit def tuple4Expr[T1,T2,T3,T4](t: (_ <: Ex[T1], _ <: Ex[T2], _ <: Ex[T3], _ <: Ex[T4])) = {
new Tu4Ex[T1,T2,T3,T4](t._1, t._2, t._3, t._4)
}

implicit def tuple5Expr[T1,T2,T3,T4,T5,E1 <: Ex[T1],E2 <: Ex[T2],E3 <: Ex[T3],E4 <: Ex[T4],E5 <: Ex[T5]](t: (E1 with Ex[T1],E2 with Ex[T2],E3 with Ex[T3],E4 with Ex[T4],E5 with Ex[T5])) = {
new Tuple5Expression[T1,T2,T3,T4,T5,E1,E2,E3,E4,E5](t._1, t._2, t._3, t._4, t._5)
implicit def tuple5Expr[T1,T2,T3,T4,T5](t: (_ <: Ex[T1], _ <: Ex[T2], _ <: Ex[T3], _ <: Ex[T4], _<: Ex[T5])) = {
new Tu5Ex[T1,T2,T3,T4,T5](t._1, t._2, t._3, t._4, t._5)
}

}

class Tuple2Expression[T1,T2,E1 <: Ex[T1], E2 <: Ex[T2]](val _1: E1, val _2: E2)
extends FactoryExpressionBase[(T1,T2)](classOf[Tuple2[T1,T2]], _1, _2) {

class Tuple2Expression[T1,T2](args: Ex[_]*)
extends FactoryExpressionBase[(T1,T2)](classOf[Tuple2[T1,T2]], args:_*) {
def newInstance(args: AnyRef*): (T1,T2) = {
(args(0).asInstanceOf[T1], args(1).asInstanceOf[T2])
}
}

class Tuple3Expression[T1,T2,T3,E1 <: Ex[T1],E2 <: Ex[T2],E3 <: Ex[T3]](val _1: E1, val _2: E2, val _3: E3)
extends FactoryExpressionBase[Tuple3[T1,T2,T3]](classOf[Tuple3[T1,T2,T3]], _1, _2, _3) {
class Tuple3Expression[T1,T2,T3](args: Ex[_]*)
extends FactoryExpressionBase[Tuple3[T1,T2,T3]](classOf[Tuple3[T1,T2,T3]], args:_*) {

def newInstance(args: AnyRef*): (T1,T2,T3) = {
(args(0).asInstanceOf[T1], args(1).asInstanceOf[T2], args(2).asInstanceOf[T3])
}
}

class Tuple4Expression[T1,T2,T3,T4,E1 <: Ex[T1],E2 <: Ex[T2],E3 <: Ex[T3],E4 <: Ex[T4]](val _1: E1, val _2: E2, val _3: E3, val _4: E4)
extends FactoryExpressionBase[Tuple4[T1,T2,T3,T4]](classOf[Tuple4[T1,T2,T3,T4]], _1, _2, _3, _4) {
class Tuple4Expression[T1,T2,T3,T4](args: Ex[_]*)
extends FactoryExpressionBase[Tuple4[T1,T2,T3,T4]](classOf[Tuple4[T1,T2,T3,T4]], args:_*) {

def newInstance(args: AnyRef*): (T1,T2,T3,T4) = {
(args(0).asInstanceOf[T1], args(1).asInstanceOf[T2], args(2).asInstanceOf[T3], args(3).asInstanceOf[T4])
}
}

class Tuple5Expression[T1,T2,T3,T4,T5,E1 <: Ex[T1],E2 <: Ex[T2],E3 <: Ex[T3],E4 <: Ex[T4],E5 <: Ex[T5]](val _1: E1, val _2: E2, val _3: E3, val _4: E4, val _5: E5)
extends FactoryExpressionBase[Tuple5[T1,T2,T3,T4,T5]](classOf[Tuple5[T1,T2,T3,T4,T5]], _1, _2, _3, _4, _5) {
class Tuple5Expression[T1,T2,T3,T4,T5](args: Ex[_]*)
extends FactoryExpressionBase[Tuple5[T1,T2,T3,T4,T5]](classOf[Tuple5[T1,T2,T3,T4,T5]], args:_*) {

def newInstance(args: AnyRef*): (T1,T2,T3,T4,T5) = {
(args(0).asInstanceOf[T1], args(1).asInstanceOf[T2], args(2).asInstanceOf[T3], args(3).asInstanceOf[T4], args(4).asInstanceOf[T5])
Expand All @@ -67,4 +66,6 @@ abstract class FactoryExpressionBase[T](cl: Class[T], args: Ex[_]*) extends Expr

def getArgs(): JavaList[Ex[_]] = Arrays.asList(args:_*)

def apply(i: Int): Ex[_] = args(i)

}
Expand Up @@ -7,49 +7,65 @@ import TypeDefs._

import com.mysema.codegen.model.TypeCategory

// TODO : factory object for template creation
/**
* Factory for templates
*
* @author tiwe
*
*/
object Templates {

class SimpleTemplate[T](t: Class[_ <: T], template: Template, args: java.util.List[Ex[_]])
extends TemplateExpressionImpl[T](t, template, args) with SimpleExpression[T] {
def simple[T](t: Class[_ <: T], tpl: Template, args: Ex[_]*): SimpleExpression[T] = new SimpleTemplate[T](t, tpl, args: _*)

}
def comparable[T <: Comparable[_]](t: Class[_ <: T], tpl: Template, args: Ex[_]*): ComparableExpression[T] = new ComparableTemplate[T](t, tpl, args: _*)

class ComparableTemplate[T <: Comparable[_]](t: Class[_ <: T], template: Template, args: java.util.List[Ex[_]])
extends TemplateExpressionImpl[T](t, template, args) with ComparableExpression[T] {
def date[T <: Comparable[_]](t: Class[_ <: T], tpl: Template, args: Ex[_]*): DateExpression[T] = new DateTemplate[T](t, tpl, args: _*)

}
def dateTime[T <: Comparable[_]](t: Class[_ <: T], tpl: Template, args: Ex[_]*): DateTimeExpression[T] = new DateTimeTemplate[T](t, tpl, args: _*)

class NumberTemplate[T <: Number with Comparable[T]](t: Class[_ <: T], template: Template, args: java.util.List[Ex[_]])
extends TemplateExpressionImpl[T](t, template, args) with NumberExpression[T] {
def time[T <: Comparable[_]](t: Class[_ <: T], tpl: Template, args: Ex[_]*): TimeExpression[T] = new TimeTemplate[T](t, tpl, args: _*)

}
def number[T <: Number with Comparable[T]](t: Class[_ <: T], tpl: Template, args: Ex[_]*): NumberExpression[T] = new NumberTemplate[T](t, tpl, args: _*)

class BooleanTemplate(template: Template, args: java.util.List[Expression[_]])
extends TemplateExpressionImpl[java.lang.Boolean](classOf[java.lang.Boolean], template, args) with BooleanExpression {
def boolean(tpl: Template, args: Ex[_]*): BooleanExpression = new BooleanTemplate(tpl, args: _*)

}
def string(tpl: Template, args: Ex[_]*): StringExpression = new StringTemplate(tpl, args: _*)

class StringTemplate(template: Template, args: java.util.List[Ex[_]])
extends TemplateExpressionImpl[String](classOf[String], template, args) with StringExpression {
def enum[T <: Enum[T]](t: Class[T], tpl: Template, args: Ex[_]*): EnumExpression[T] = new EnumTemplate[T](t, tpl, args: _*)

}

class DateTemplate[T <: Comparable[_]](t: Class[_ <: T], template: Template, args: java.util.List[Ex[_]])
extends TemplateExpressionImpl[T](t, template, args) with DateExpression[T] {
class SimpleTemplate[T](t: Class[_ <: T], template: Template, args: Ex[_]*)
extends TemplateExpressionImpl[T](t, template, args:_*) with SimpleExpression[T]

}

class DateTimeTemplate[T <: Comparable[_]](t: Class[_ <: T], template: Template, args: java.util.List[Ex[_]])
extends TemplateExpressionImpl[T](t, template, args) with DateTimeExpression[T] {
class ComparableTemplate[T <: Comparable[_]](t: Class[_ <: T], template: Template, args: Ex[_]*)
extends TemplateExpressionImpl[T](t, template, args:_*) with ComparableExpression[T]

}

class TimeTemplate[T <: Comparable[_]](t: Class[_ <: T], template: Template)
extends TemplateExpressionImpl[T](t, template) with TimeExpression[T] {
class NumberTemplate[T <: Number with Comparable[T]](t: Class[_ <: T], template: Template, args: Ex[_]*)
extends TemplateExpressionImpl[T](t, template, args:_*) with NumberExpression[T]

}

class EnumTemplate[T <: Enum[T]](t: Class[_ <: T], template: Template)
extends TemplateExpressionImpl[T](t, template) with EnumExpression[T] {
class BooleanTemplate(template: Template, args: Ex[_]*)
extends TemplateExpressionImpl[java.lang.Boolean](classOf[java.lang.Boolean], template, args:_*) with BooleanExpression

}

class StringTemplate(template: Template, args: Ex[_]*)
extends TemplateExpressionImpl[String](classOf[String], template, args:_*) with StringExpression


class DateTemplate[T <: Comparable[_]](t: Class[_ <: T], template: Template, args: Ex[_]*)
extends TemplateExpressionImpl[T](t, template, args:_*) with DateExpression[T]


class DateTimeTemplate[T <: Comparable[_]](t: Class[_ <: T], template: Template, args: Ex[_]*)
extends TemplateExpressionImpl[T](t, template, args:_*) with DateTimeExpression[T]


class TimeTemplate[T <: Comparable[_]](t: Class[_ <: T], template: Template, args: Ex[_]*)
extends TemplateExpressionImpl[T](t, template, args:_*) with TimeExpression[T]


class EnumTemplate[T <: Enum[T]](t: Class[_ <: T], template: Template, args: Ex[_]*)
extends TemplateExpressionImpl[T](t, template, args:_*) with EnumExpression[T]
Expand Up @@ -6,13 +6,13 @@ object TypeDefs {

type Ex[T] = Expression[T]

type Tu2Ex[T1,T2,E1 <: Ex[T1],E2 <: Ex[T2]] = Tuple2Expression[T1,T2,E1,E2]
type Tu2Ex[T1,T2] = Tuple2Expression[T1,T2]

type Tu3Ex[T1,T2,T3,E1 <: Ex[T1],E2 <: Ex[T2],E3 <: Ex[T3]] = Tuple3Expression[T1,T2,T3,E1,E2,E3]
type Tu3Ex[T1,T2,T3] = Tuple3Expression[T1,T2,T3]

type Tu4Ex[T1,T2,T3,T4,E1 <: Ex[T1],E2 <: Ex[T2],E3 <: Ex[T3],E4 <: Ex[T4]] = Tuple4Expression[T1,T2,T3,T4,E1,E2,E3,E4]
type Tu4Ex[T1,T2,T3,T4] = Tuple4Expression[T1,T2,T3,T4]

type Tu5Ex[T1,T2,T3,T4,T5,E1 <: Ex[T1],E2 <: Ex[T2],E3 <: Ex[T3],E4 <: Ex[T4], E5 <: Ex[T5]] = Tuple5Expression[T1,T2,T3,T4,T5,E1,E2,E3,E4,E5]
type Tu5Ex[T1,T2,T3,T4,T5] = Tuple5Expression[T1,T2,T3,T4,T5]

type JavaList[T] = java.util.List[T]

Expand Down
Expand Up @@ -16,16 +16,18 @@ import com.mysema.query.scala.TypeDefs._
class RelationalPathImpl[T](md: PathMetadata[_], schema: String, table: String)(implicit val mf: Manifest[T])
extends BeanPath[T](mf.erasure.asInstanceOf[Class[T]], md) with RelationalPath[T] {

type JList[X] = java.util.List[X]

private var primaryKey: PrimaryKey[T] = _

@BeanProperty
val columns: java.util.List[Path[_]] = new ArrayList[Path[_]]
val columns: JList[Path[_]] = new ArrayList[Path[_]]

@BeanProperty
val foreignKeys: java.util.List[ForeignKey[_]] = new ArrayList[ForeignKey[_]]
val foreignKeys: JList[ForeignKey[_]] = new ArrayList[ForeignKey[_]]

@BeanProperty
val inverseForeignKeys: java.util.List[ForeignKey[_]] = new ArrayList[ForeignKey[_]]
val inverseForeignKeys: JList[ForeignKey[_]] = new ArrayList[ForeignKey[_]]

def this(variable: String, schema: String, table: String)(implicit mf: Manifest[T]) = this(forVariable(variable), schema, table)(mf)

Expand Down

0 comments on commit d73281d

Please sign in to comment.